ただ、走るだけ。いつまでも

ただただ走ってます。いつかはサブ3.5。

ビルドアップリベンジ。でも、2段に短縮

みなさんおつかれさまです。

 

今日も関東は暑いです。何回言っても暑い。

暑いけど、今日も朝活。昨日失敗したビルドアップに再挑戦。気温はさらに高そうなので、5kmの3段で行くと、AKS(あかん死ぬ)になりそうなので、2段に短縮。キロ5分15秒とキロ4分45秒で行く。

でも、本来のメニューの90分ペース走キロ5分30秒を達成するために2段が終わった後もジョグで合計90分走るということでスタート。

で、結果はこんな感じ。

f:id:yoneba_1717:20180722092936j:image

f:id:yoneba_1717:20180722092946j:image

1段目は5分10秒。予定よりちと速い。このスピードでもかなりキツイ。日陰を選んで走ってもかなり汗だく。

2段目は途中で失速しかかりましたが、2日連続で安定のDNFは避けねばと最後の1kmで頑張って4分44秒。でも、途中であまりの暑さに給水を入れてしまいました。幻の記録という感じですね。

その後は精根尽き果てた感じで、だらだらと5kmちょっとのジョグ。途中の公園で頭から水浴びしたら少し復活しました。

 

今日ははてブロ駅伝が大井で開催されますね。優勝狙えますから頑張ってくださいね。

ただ、とんでもなく暑いので「いのちだいじに」で頑張ってください。 

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

暑すぎ。ビルドアップDNF

みなさんおつかれさまです。

 

暑いです。何度言っても暑いです。

平日は夜ランだと気温が高いので朝ランしてます。朝ランだと45分〜60分くらいが時間確保できる限界なので、岩本メニューのビルドアップができない。というか、平日の寝起きに15kmもビルドアップで走ってらんない。頑張ってやったら、夕方まで会社で起きてられない。たぶん。

というわけで、今朝、ビルドアップ15kmに行こうとスタート。朝4時過ぎに起きたけど、朝から暑くてどうにも出かける気にならなくて結局スタートは5時半。

結局、3段目の2km走ったところで、昨日飲んでないのに頭が痛くなってきて、あ〜これダメなやつかもしれないとスローダウンしてセブンイレブンで涼みました。

f:id:yoneba_1717:20180721133939j:image

何も買わずに出るのも・・・というわけで定番のガリガリ君梨味を買って休憩を入れましたが、ペースを上げて走るのも危なそうなので、そこからはトボトボ3kmほど走って帰ってきました。

f:id:yoneba_1717:20180721133951j:image

明日、リベンジに挑戦するかは未定です。明日も暑そう。DNSの気配濃厚です。

朝ランとはいえ、生命の危険を感じる暑さでした。みなさんもお気をつけてください。

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

3連休最終日の練習はのんびりジョグ/はてブロTシャツ&ノースリ届きましたー

みなさんおつかれさまです。

 

あー今日で3連休は終わり。今朝も朝5時半から走ってきました。

土曜日と日曜日で16kmを2回、32kmちょっと走ったので、今日は10km走れば3連休で灼熱のなんちゃってフルマラソン

岩本式メニューでは月曜日定番のオフでしたが、火曜日のジョグ45分を前倒しで、さらに距離追加して走りました。

f:id:yoneba_1717:20180716201949j:image

今日は東浦和から南下して鳩ヶ谷方面へ。

何を血迷ったか芝川の堤防の上を走って直射日光地獄にやられて体温上昇ヘロヘロジョグで戻りました。この季節は日向を走るとあっという間に消耗します。

元の岩本式メニューの45分ジョグに戻して歩いて帰りたい誘惑との戦い。

f:id:yoneba_1717:20180716202001j:image

家の近くの公園ではキョウチクトウが咲き始めてました。夏ですね。

f:id:yoneba_1717:20180716202013j:image

☆★☆

 

家に戻るとはてブロランナーTシャツが届いてました。オレンジ欲しかったんですよねーやっと手に入りました。これからの季節に活躍するノースリも手に入れました。ちなみに青は前から持ってました。

びあーさん、さつかさんどうもありがとうございます。

さ、デビューはいつにするかな〜

f:id:yoneba_1717:20180716202024j:image

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

はじめてのConnectIQプログラミング〜時計に表示。onUpdate()を編集〜

みなさんおつかれさまです。

 今日も暑いですね。この暑さの中、小布施見にマラソンやよこはま月例などに参加されたみなさんおつかれさまでした。

私も岩本能史コーチのトレーニング1週目のロング走。90分キロ5分30秒に行ってきました。90分で良かった。120分だと倒れますね。

f:id:yoneba_1717:20180715130924j:image

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

 

☆★☆

 

さて、vivoactive3でConnectIQ。今回で、動くものができそうです。

これまでの流れです。

【予告編】ガーミンVivoactive3を自分でカスタマイズしたいぞ - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜セットアップ編〜 - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜サンプルプロジェクトの実行編〜 - ただ、走るだけ。いつまでも

ビルドアップ走から、初めてのConnectIQアプリ〜新規プロジェクトでMonkeyC編〜 - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜データフィールド構築compute(info)編〜 - ただ、走るだけ。いつまでも

はじめてのConnectIQプログラミング〜レイアウトを決める。 onLayout()の編集〜 - ただ、走るだけ。いつまでも

 

いよいよ表示する値も決まって、表示するレイアウトも決まりました。あとは枠(レイアウト)に値をはめるだけです。後はビルドしてデプロイです。

 

1 データフィールドの表示の流れ

まず最初に、データフィールドの表示までの流れをもう一度。

onLayout()で表示レイアウトを決定(済)-compute()で表示する値を計算(済)-onUpdate()でレイアウトに値をはめ込む。

という流れでした。

いよいよonUpdate()では、1秒に1回くらい呼び出されて、compute()で計算された値を時計のデータフィールドに表示することになります。

2 onUpdate()の編集

今回表示対象となるのは、compute()で保存したこれらの値です。

    hidden var averagePaceMinute=0;

    hidden var averagePaceSecond=0;

    hidden var distance=0.0f;

 ペースと距離ですね。

 右側を距離にします。onLayout()で場所は確保してます。

まずやること。

バックグラウンドにカラーをセットします。

// データフィールドの背景色をレイアウトの背景色にセットします。これをしておかないと画面は真っ黒。

View.findDrawableById("Background").setColor(getBackgroundColor());

これは実は必要性はよくわからないのですが、無いと真っ黒で動かないので、入れておきます。どうも、バックグラウンドカラーでクリアしているみたいです。

次は、テキストをセットするので、はめ込む対象レイアウトを取り出しておきます。

var distanceValue = View.findDrawableById("distanceValue");

var paceValue = View.findDrawableById("paceValue");

さて、vivoactive3のバックグラウンドカラーは白と黒から選べます。白地には黒、黒地には白で書き出さないと見えませんw

それをセットします。getBackgroundcolor()は、データフィールドの背景色を取り出すメソッドです。

// 背景が白の時は黒字で背景が黒の時は白字で書く。

        if (getBackgroundColor() == Gfx.COLOR_BLACK) {

            distanceValue.setColor(Gfx.COLOR_WHITE);

            paceValue.setColor(Gfx.COLOR_WHITE);

        } else {

            distanceValue.setColor(Gfx.COLOR_BLACK);

            paceValue.setColor(Gfx.COLOR_BLACK);

        }

10kmを過ぎると桁数が増えて、距離表示とペース表示がかぶりそうです。フォントを小さくするか小数点以下の桁数を減らすかするんですが、今回はフォントを1段階小さくしてみます。

// 距離が10kmを超えた時はフォントの大きさを小さくしてあまりはみ出ないようにしておきます。

        if (distance > 10.0){

            distanceValue.setFont(Gfx.FONT_NUMBER_MEDIUM);

        } else {

            distanceValue.setFont(Gfx.FONT_NUMBER_HOT);

        }

次は表示フォーマットを整えます。

距離は小数点以下2桁で表示させます。

 // 小数点以下2桁で距離を表示します。

        distanceValue.setText(distance.format("%.2f"));

%は書式記号で.2fが浮動小数点数で小数点以下2桁を示します。

 

ペースは、分と秒の間に":"を表示させます。$1$と$2$に直後のフォーマットで編集された結果が格納されます。秒の表示は、前に0を補完しておきます。

       // 分と秒の表示ができるようにフォーマットを設定してテキストを設定します。

           paceValue.setText(Lang.format(

                       "$1$:$2$",

                       [averagePaceMinute.format("%d"),

                            averagePaceSecond.format("%02d")]

                      )

           );

 

これでレイアウトに動的値を設定できました。

後は、これをいよいよ表示します。表示するには、上位のオブジェクトの同一メソッドを呼ぶことが必要です。

        // super()(親クラスの同じメソッドを呼びます。)

        View.onUpdate(dc);

 これで、プログラミング完了です。

通しで見るとonUpdate()はこんな感じ。

    // ここで、さっき計算した値を表示するんだ。このメソッドはデータフィールドが表示されている

    // 時だけ、1秒に1回くらい呼ばれるからそのつもりでいろよ。

    function onUpdate(dc) {

        // データフィールドの背景色をレイアウトの背景色にセットします。これをしておかないと

       // 画面は真っ黒。

        View.findDrawableById("Background").setColor(getBackgroundColor());

 

        var distanceValue = View.findDrawableById("distanceValue");

        var paceValue = View.findDrawableById("paceValue");

 

        // 背景が白の時は黒字で背景が黒の時は白字で書く。

        if (getBackgroundColor() == Gfx.COLOR_BLACK) {

            distanceValue.setColor(Gfx.COLOR_WHITE);

            paceValue.setColor(Gfx.COLOR_WHITE);

        } else {

            distanceValue.setColor(Gfx.COLOR_BLACK);

            paceValue.setColor(Gfx.COLOR_BLACK);

        }

 

        // 距離が10kmを超えた時はフォントの大きさを小さくしてあまりはみ出ないようにします。

        if (distance > 10.0){

            distanceValue.setFont(Gfx.FONT_NUMBER_MEDIUM);

        } else {

            distanceValue.setFont(Gfx.FONT_NUMBER_HOT);

        }

       // 小数点以下2桁で距離を表示します。

        distanceValue.setText(distance.format("%.2f"));

       // 分と秒の表示ができるようにフォーマットを設定してテキストを設定します。

           paceValue.setText(Lang.format(

                       "$1$:$2$",

                       [averagePaceMinute.format("%d"),

                           averagePaceSecond.format("%02d")]

                      )

           );

        // super()(親クラスの同じメソッドを呼びます。)

        View.onUpdate(dc);

    }

 これで完成。

3 シミュレータで動かしてみる。

yoneba-1717.hatenablog.com

 これに従ってプロジェクトを選択して、実行してみます。

 

あ〜動きました。背景黒にしても動きました。

 

4 実機で確認

同じく、vivoactive3をMacに接続して、Build for Device Wizaedからビルド。ファインダでインストールされていることを確認します。vivoactive3のラン設定からデータページを編集して表示させます。

さあ、走り出す。 

f:id:yoneba_1717:20180714204506j:image

f:id:yoneba_1717:20180714204519j:image

お〜出てる出てる。ガーミンの本体とペースの表示も同じ。ちょっと左側が切れているので、もう少しだけペースを右に寄せようかな。

とりあえず、大成功〜

 

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

はじめてのConnectIQプログラミング〜レイアウトを決める。 onLayout()の編集〜

みなさんおつかれさまです。

あまりの暑さに午後からは一日のんびりとガーミンと戯れてました。

一応朝は走りました。

 

yoneba-1717.hatenablog.com

 

ここからは長いので、興味のない方に下までスクロールしていただくのは申し訳ないです。ランニングブログはこちらからw

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

 

☆★☆

 

Vivoactive3を使ったConnectIQプログラミング。これまでの流れです。いつまで続くんだろう。

【予告編】ガーミンVivoactive3を自分でカスタマイズしたいぞ - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜セットアップ編〜 - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜サンプルプロジェクトの実行編〜 - ただ、走るだけ。いつまでも

ビルドアップ走から、初めてのConnectIQアプリ〜新規プロジェクトでMonkeyC編〜 - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜データフィールド構築compute(info)編〜 - ただ、走るだけ。いつまでも

 

前回、表示する内容を計算したので、それを表示する枠、ガワ?を作ります。

続きを読む

岩本式練習第1週のビルドアップ走行ってきました。

みなさんおつかれさまです。

 

今日は昼間は危険な暑さになるらしい。

なので、朝5時半スタートでビルドアップ走に行ってきました。

f:id:yoneba_1717:20180714110057j:image

岩本式だとビルドアップ走は水曜日の練習ですけど、今週は平日に15km走る時間が取れなかったので、土曜日に実施です。

第1週からこんな感じで、この先いけるのか不安になるんですが、暑いからいいんです。設定は5分15秒-5分3秒-4分51秒です。

で、結果はこんな感じ。

f:id:yoneba_1717:20180714110107j:image

早朝から暑い。朝5時過ぎで26度ってどーゆーこと?

1段目ですでに汗ダクダク。2本目の途中で体に熱が溜まってきた感じがして、たまらず給水。ポカリ500mlガブ飲み。

f:id:yoneba_1717:20180714110120j:image

結構信号に引っかかったりしたけど、どうにか走り切りました。

今日は特に予定も無いし、とんでもなく暑いので、引きこもる予定。

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

初めてのConnectIQアプリ〜データフィールド構築compute(info)編〜

みなさんおつかれさまです。

 

今朝は朝ランに行ってきました。4時代は涼しくて良いですね。

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村 

 

☆★☆

 

これまでの拙い軌跡です。

【予告編】ガーミンVivoactive3を自分でカスタマイズしたいぞ - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜セットアップ編〜 - ただ、走るだけ。いつまでも

初めてのConnectIQアプリ〜サンプルプロジェクトの実行編〜 - ただ、走るだけ。いつまでも

ビルドアップ走から、初めてのConnectIQアプリ〜新規プロジェクトでMonkeyC編〜 - ただ、走るだけ。いつまでも

 

さて、ConnectIQでのデータフィールド構築。最初は平均ペースと全体距離を横に並べて表示するようなものを作ってみたいと思います。まずは、情報を保持。

1 プロジェクトの構成

前回新規プロジェクトとして作ったのを見てみると、クラスは3つ(.mcの拡張子)、その他にリソースファイルと設定ファイルが見えます。データフィールドの場合、修正するのはソースコードのうち、[プロジェクト名]+View.mcとリソースファイルのxmlのようです。

f:id:yoneba_1717:20180708155444p:plain

2 データフィールドのViewクラスの構成

まず、Viewクラスの構成です。新規プロジェクトで出来てきたメソッドは4つで、全てオーバーライドしてあるようです。

どうも、基本的な作りとしては、onLayout()で表示場所を決めて、compute()で表示項目を作って、onUpdate()で表示するのが流れのようです。非表示の時にはcompute()だけが1秒間隔で呼ばれ、表示すると1回onLayout()が呼ばれ、その後は1秒おきにcompute()とonUpdate()が呼ばれる仕様です。なんか、データフィールドだと、onUpdate() に全部書き込んでもいいような気がしますが、まあ従いますか。

onUpdate()とcompute()の処理順に保証がないので、onUpdate()で使用する変数は初期化が必要ですね。「ぬるぽ」「ガッ」(古すぎる)が出る可能性がありそうです。

さて、できたメソッドにコメントがくっついてきました。読んでおきましょう。

    // 初期化のメソッド

function initialize() {

     

    // 

    // レイアウト情報をここにセット。サイズが変わったり表示場所が変わると呼ばれるぜ

function onLayout(dc) {

     

    //ここで引数で渡すinfoにはトレーニングの全情報が入ってる。このメソッドで計算して、

    // ローカルに値を保存しておくんだぜ。

    // おっと、気をつけておいてもらいたいんだが、表示用にonUpdate()メソッドを用意しているが、

    // この2つは非同期だからな。必ずしもcompute()がonUpdate()より先に呼ばれる保証は無いぜ。

function compute(info) {

 

    // ここで、さっき計算した値を表示するんだ。このメソッドはデータフィールドが表示されている

    // 時だけ、1秒に1回くらい呼ばれるからそのつもりでいろよ。

function onUpdate(dc) {

       コメントは、超意訳です。保証はありません。

 

3 compute(info)をカスタマイズしてみる

では、compute(info)をカスタマイズして、平均ペースと全体距離を保持することにしましょう。

まず、変数宣言。自分しか使わないので、hidden(=private)で宣言しておきます。

class Yone5kmLapDataFieldView extends Ui.DataField {

 

    hidden var averagePace=0.0f;

    hidden var distance=0.0f;

  とりあえずは、新規プロジェクトでくっついてきたコードはそのまま置いておきます。 

compute(info)の中を変更していきます。

まあ、基本的な作り方は、引数でくっついてきたinfo(=Activity.info)から値を取り出すってことですよね。

今日は、infoから平均ペースと走った距離を引っこ抜いて変数に格納するだけですね。

と思ってたんです。

Activity.infoの中身

 infoから値を取り出す時は、特にgetterがあるわけでは無いようなので、info.currentHeartRateのように、直接参照するようです。

どうも、調べてみると、同じ方式でそれぞれの値に代入もできそうです。そんなことを前提にしてもぶち壊しになりそうですので、オススメしません。

 

ガーミン公式から

Class: Toybox::Activity::Info — Connect IQ SDK

日本語(一部)ウィキ

www54.atwiki.jp

これを見てみると、ペースって存在しない(^_^;)

自分で作らないといけないみたいです。

アクティビティの平均ペースと全体距離をインスタンス変数に保持

では先に距離を取り出しましょう。どうも該当するのは、elapsedDistanceのようです。

        //全体距離を抽出します。

        if(info has :elapsedDistance){

            if(info.elapsedDistance != null){

               distance = info.elapsedDistance;

            } else {

               distance = 0.0f;

            }

         }

使う前にnullチェックを入れます。その後に、infoからelapsedDistanceを取り出します。

 

次にペースを出すようにしなきゃいけないんですが、ペースは無いので、スピードの逆数で作りましょう。

ペース(sec/km)=1/(スピード(m/sec)/1000)

もちろん、経過時間(msec)/経過距離(m)でも出せます。(むしろこちらの方が誤差が少なそう)

これを作っておきます。

infoにaverageSpeedがあったので、これを元にして、逆数を計算してセットします。

秒速0.27m未満はkmあたり1時間(3,600秒/km)とします。これを停止していると定義しておきます。まあ、止まってますよね。

         //全体ペースをセットします。

         if(info has :averageSpeed){

            if(info.averageSpeed != null){

                if(info.averageSpeed > 0.27){ //1秒あたり27cm以上の時だけ計測

                   averagePace = 1 /(info.averageSpeed/1000);//1000はmからkmへ変換

                } else {

                   averagePace = 3600.0f; //秒あたり27cm未満の遅すぎる時は1時間/kmで。

                }

            } else {

               averagePace = 0.0f;

            }

         }

まあ、これで数値は出てきました。

次に、表示しやすくなるよう加工します。

まず、ペースの小数点以下を丸めるため、四捨五入しておきます。四捨五入は、Toybox.Math.round()です。ちなみに切上げはceil(),切り捨てはfloor()です。なんとなく分かりますよね。

フルパスで書くのは面倒なので、using句をつけておきます。

using Toybox.Math:

さらに、表示する時に分と秒を分けておきます。インスタンス変数宣言部をこのように変えます。

class Yone5kmLapDataFieldView extends Ui.DataField {

 

    hidden var averagePaceMinute=0;

    hidden var averagePaceSecond=0;

    hidden var distance=0.0f;

先ほど計算したペースは秒で出てきたので、これを60で割った商が分を示し、割った余りが秒を示しますので、それぞれを格納しておきます。

剰余演算子(%)は、整数型で無い場合は、答えが出ないそうです。計算元にtoNumber()を付けて、整数型にしておきます。

以上の加工を入れたcompute()関数はこんな感じで出来上がりです。

    function compute(info) {

 

        //全体距離を抽出します。

        if(info has :elapsedDistance){

            if(info.elapsedDistance != null){

               distance = info.elapsedDistance;

            } else {

               distance = 0.0f;

            }

         }

 

         //全体ペースをセットします。

         if(info has :averageSpeed){

            if(info.averageSpeed != null){

          //1秒あたり27cm未満。まあ、止まっている状態の時以外に計算

                if(info.averageSpeed > 0.27){ 

           //1000はmからkmへの変換.toNumber()で整数型に変換

                  var averagePace =Math.round( 1 / info.averageSpeed * 1000 )

                      .toNumber(); 

                  averagePaceMinute = averagePace / 60 ;//全体秒を60で割った商は分

                  averagePaceSecond = averagePace % 60 ;//全体秒を60で割った剰余は秒

                } else {

                   averagePaceMinute = 60; //遅すぎる時は60分/kmで止めておく。

                   averagePaceSecond = 0;

                }

            } else {

               averagePaceMinute = 0;

               averagePaceSecond = 0;

            }

         }

    }

 

とりあえずコンソールに出してみよう。

compute(info) の中にprintln()を入れて表示してみましょう。今はシミュレータには何も出ませんので、コンソールに表示させます。

 Sys.println("Distance "+distance+" averagePace "+averagePaceMinute+":"+averagePaceSecond+" averageSpeed "+info.averageSpeed);

 

f:id:yoneba_1717:20180709211310p:plain

 まあ、想定どおり表示されました。次は時計に表示させる準備をします。

 

はじめてのConnectIQプログラミング〜レイアウトを決める。 onLayout()の編集〜 - ただ、走るだけ。いつまでも

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村