「技術」カテゴリーアーカイブ

【実質北海道一周】GPSの2点から距離を求める。

実質北海道一周アプリとは?

定期的にスマホのGPSの信号を取得し、その2点間のデータから移動距離を計測して蓄積。

北海道一周を行う場合、総移動距離が、北海道のどの位置に相当するか、というのを表示するアプリ(という物を想定しています。)

GPSデータから距離を求める処理はQiitaにまとめてあります。

https://qiita.com/takishita2nd/items/3f1d7800fe85de2273bd

ハマったのは、パーミッションの記載。

“android”と記載するところを”Android”と書いただけで無効化されてしまいます。

「WebAPIにアクセス出来ねぇ!」ってなって、冷静に確認したら、上記のようなミスをしていました。

今回はJavaではなくて、Kotlinを使用していますが、KotlinはJavaのインターフェースを使用できますし、その逆も可能です。

なんなら、Kotlinで書いたコードをコンパイルしたバイナリファイルをJVMで動かすことができます。

Kotlinの方が便利な所もありまして、Kotlinは限りなくNullポインタアクセスを考慮しなくて良い仕様になっていますし(ただ、独特なコードの書き方はまだ慣れない)

UIにアクセスする際も、コントロールのID名だけで直接アクセスできたりします。

Android、というか、Javaをメインでやっている人は、Kotlinを覚えておいても全く損は無いです。

いや、無駄な知識は無い、持っていれば持っているだけメリットがあります。

だから人生一生勉強

頑張ります。

【北海道大戦】今後の実装にあたって。【設計のコツ】

たぶん、どんな感じで動かすか、と言うのをきちんと整理しておかないとごちゃごちゃしてくると思うので、

こんな感じのものをサクッと作成しました。

まぁ、フローチャートですわな。

ゲームの状態をステータス(status)で定義し、その状態によってループ処理とか、マウスクリック処理を変えていくように実装させて行く必要があると思います。

ゲーム開始時はstatus=1の状態で始まり、プレイヤーが担当する自治体を選択します。

選択したらゲームスタート。

自分の番が来るまで敵が行動するのですが、その状態がstatus=2です。

で、自分の番が来たらstatus=3に移行。

攻撃対象となる自治体を選択(クリック)します。

その後status=4に移行し、戦闘結果が表示されます。

その後クリックで再びstatus=2に移行し、以後、自治体が残り一つになるまでループします。

最終的に、自治体が残り一つになればstatus=5に遷移してゲーム終了。

とまぁ、サクッと説明しましたが、こういった整理が出来るかどうかで設計能力が問われるわけで。

「このステータスの時」「このイベントが起きると」「このアクションをする」

こんな感じで、図や表なんかに書き出してみると、きれいに整理できたりします。

案外こういうのが解決の近道だったりするので、困ったときは一度立ち止まって整理することをオススメします。

【ラズパイ】【いろいろ計測モニター】時計表示を大きくする。

フォントをもっとシンプルなものに変更しました。

複雑なフォントにすると、データ化がめんどくさい。

こういうシンプルなデザインにした方が、数字表示用8LEDディスプレイみたいで(厳密には違うが)データ化が1時間程度で完了しました。

さらに、横幅も少し小さくして、時間と分のセパレータ「:」も入れることが出来ました。

このサイズだったらかなり見やすいでしょ。

    [ #1
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
        ],
        [
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        ]
    ],

データもこんな感じなので(というか、縦に線を引いているだけなので)サクッと作れました。

具体的にはgitHubのソースを見て欲しい。

https://github.com/takishita2nd/RaspiDisplayMonitor

表示する時刻データを、

GLCD.drowLargeClock(datetime.datetime.now().strftime('%H:%M'))

こんな感じで文字列化して、

def drowLargeClock(time):
    position = 0
    val = 0
    for s in time:
        if s == ':':
            val = 10
        else:
            val = int(s)

        for page in range(6):
            for addr in range(24):
                if position + addr < 64:
                    SelectIC(1)
                    SetPage(page)
                    SetAddress(position + addr)
                else:
                    SelectIC(2)
                    SetPage(page)
                    SetAddress(position + addr - 64)
                WriteData(LFont.Array[val][page][addr])
        position += addr

このように処理させることで、大きいフォントで時刻表示できます。

これでさらに使い物になりましたな。

【ダイエット支援】【食事管理】データ入力処理を作成する。

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/diet-mng

データ入力ダイアログから入力データをデータベースに登録するところまで行きます。

モデル

class User extends Authenticatable
{
    public function EatingManagements()
    {
        return $this->belongsToMany('App\Model\EatingManagement');
    }
class EatingManagement extends Model
{
    protected $table = 'eating_managements';
    
    public function users()
    {
        return $this->belongsToMany('App\User');
    }

    public function timezones()
    {
        return $this->belongsToMany('App\Model\Timezone');
    }
}
class Timezone extends Model
{
    protected $table = 'timezones';
    
    public function Eating()
    {
        return $this->belongsToMany('App\Model\EatingManagement');
    }
}

リポジトリ

<?php

namespace App\Repository;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use App\Model\EatingManagement;
use App\Model\Timezone;
use App\User;

class EatingManagementRepository
{
    private $paramNames = ['date', 'item', 'protein', 'riqid', 'carbo', 'calorie'];

    public function __construct()
    {

    }

    public function add($param, $user, $timezone)
    {
        $model = new EatingManagement();
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();
        $time = Timezone::where('id', $timezone)->first();

        $this->attachToUser($model, $user);
        $this->attachToTimezone($model, $time);
    }

    public function attachToUser($model, $user)
    {
        $model->users()->attach($user);
    }

    public function detachToUser($model, $user)
    {
        $model->users()->detach($user);
    }

    public function attachToTimezone($model, $timezone)
    {
        $model->timezones()->attach($timezone);
    }

    public function detachToTimezone($model, $timezone)
    {
        $model->timezones()->detach($timezone);
    }

    public function getParam()
    {
        return $this->paramNames;
    }

}

コントローラー

<?php

namespace App\Http\Controllers\Eating;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Repository\EatingManagementRepository;

class ApiController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->eatingManagement = new EatingManagementRepository();
    }

    /**
     * データを1件登録する
     */
    public function add(Request $request)
    {
        $paramNames = $this->eatingManagement->getParam();

        $param = [];
        foreach($paramNames as $name) {
            $param[$name] = $request->contents[$name];
        }

        $this->eatingManagement->add($param, Auth::user(), $request->contents['timezone']);
        
        return response()->json();
    }

}

パラメータを設定する処理をちょっと変えています。

Vue側でtypoしていないことが前提ですが、なるべくコードの中で直値を使わない(定義する箇所は一か所のみ)ようにするための工夫。

これが正解なのか、いまだにわかりませんけどね。

Vue側の修正です。

EatingDashboardComponent.vue

<template>
    <div>
        <div class="dashboard">
            <div class="chart">
                <canvas id="eating"></canvas>
            </div>
            <div class="command">
                <ul>
                    <li><a @click="onClickPrev">prev</a></li>
                    <li><a @click="onClickNext">next</a></li>
                </ul>
                <ul>
                    <li><a @click="onClickInput">クイック入力</a></li>
                    <li><a href="/eating">詳細</a></li>
                </ul>
            </div>
        </div>
        <eating-input-dialog-component :show="showInputDialogContent" :datehold=true @update="invokeUpdateList"></eating-input-dialog-component>
    </div>
</template>

ダッシュボードからのクイック入力からは、日付の入力はできないようにします。(本日固定にする。)

そのために、コンポーネントにdateholdというパラメータを追加で渡しています。

EatingInputDialogComponent.vue

<template>
    <div>
        <div id="overlay" v-show="show">
            <div id="content">
                <p v-if="error_flg == true" class="error">
                    <ui>
                        <li v-for="error in errors">{{ error }}</li>
                    </ui>
                </p>
                <table class="edit">
                    <tbody>
                        <tr>
                            <td>日付</td>
                            <td>
                                <input type="date" v-model="contents.date" v-if="datehold" readonly>
                                <input type="date" v-model="contents.date" v-else>
                            </td>
                        </tr>
                        <tr>
                            <td>品名</td>
                            <td><input type="text" v-model="contents.item" /></td>
                        </tr>
                        <tr>
                            <td>時間帯</td>
                            <td>
                                <select name="timezone" v-model="contents.timezone">
                                    <option value="1" selected>朝</option>
                                    <option value="2">昼</option>
                                    <option value="3">夜</option>
                                    <option value="4">間食</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td>タンパク質</td>
                            <td><input type="number" v-model="contents.protein" /></td>
                        </tr>
                        <tr>
                            <td>脂質</td>
                            <td><input type="number" v-model="contents.riqid" /></td>
                        </tr>
                        <tr>
                            <td>炭水化物</td>
                            <td><input type="number" v-model="contents.carbo" /></td>
                        </tr>
                        <tr>
                            <td>カロリー</td>
                            <td><input type="number" v-model="contents.calorie" /></td>
                        </tr>
                    </tbody>
                </table>
                <p id="command">
                    <button @click="clickAdd">入力</button>
                    <button @click="closeModal">閉じる</button>
                </p>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    props: ['show', 'datehold'],
    data() {
        return {
            errors: [],
            error_flg: [],
            param: {},
            contents: {
                date: "",
                item: "",
                timezone: 1,
                protein: "",
                riqid: "",
                carbo: "",
                calorie: "",
            },
        };
    },
    created: function() {
        this.clear();
    },
    methods: {
        clickAdd: function() {
            var self = this;
            this.param.contents = this.contents;
            axios.post('api/eating/add', this.param).then(function(response){
                self.clear();
                self.closeModal();
                self.$emit('update');
            }).catch(function(error){
                self.error_flg = true;
                self.errors = error.response.data.errors;
            });
        },
        closeModal: function() {
            this.$parent.showInputDialogContent = false;
        },
        clear: function() {
            var today = new Date();
            this.contents.date = today.getFullYear() + "-" + ('00'+(today.getMonth() + 1)).slice( -2 ) + "-" + today.getDate();
            this.contents.item = "";
            this.contents.timezone = 1;
            this.contents.protein = "";
            this.contents.riqid = "";
            this.contents.carbo = "";
            this.contents.calorie = "";
            this.error_flg = false;
            this.errors = [];
        }
    }
}
</script>

ちょっと苦労したのはdateのフォーマットですね。

dateフォームのフォーマットは”YYYY-MM-DD”で、これが若干違っていてもフォームは正しく認識してくれません。

実行結果。

七年前ぐらいに購入した古いノートパソコンをパーツ交換して再活用する。

パーツが届きました。

2.5インチのSSDです。

8GBのメモリです。

メモリを装着。

マザーボード装着。

SSD装着。

コネクタとネジを元に戻して電源ON。

動きました。

この後、Windows10のインストーラーを入れたUSBを接続してWindows10をインストール。

過去にWindows10を動かしているのでライセンス認証は不要です。

あっ・・・。

【北海道大戦】パラメータを調整して札幌以外でも勝てるようにする

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/HokkaidoWar

パラメータを調整して、ランダムの値の範囲をもう少し大きくしました。

        private const int maxRate = 50;
        private const int minRate = 1;

                double attack = lastAttack.Population * (double)(r.Next(minRate, maxRate) / 10.0);
                double deffence = lastDeffece.Population * (double)(r.Next(minRate, maxRate) / 10.0);

戦力値0.1倍~5倍に広げました。

清水の勝利でした。

札幌の勝利100%では無くなったので、パラメータはこれで行きましょう。

当然のことながら、このままではゲームではありません。

ただ成り行きを眺めているだけなので。

次回以降、さらにゲームっぽく改造していこうと思います。

七年前ぐらいに購入した古いノートパソコンをパーツ交換して再活用したい。

ただただ、捨てるのもったいない。

確か7年前ぐらいに購入したノートパソコン、HP Inspiron(だったと思う)がしばらく使われないまま棚の中で眠っているので、なんとか活用できないか、と考えています。

決して捨てるのめんどくさいとか思っていません。

ええ、思っていませんとも。

電源スイッチが入らなくなるまで使い倒すつもりでいます。

まず、このノートPCのスペック(うろ覚え)についてですが、

CPUは第4世代Core i

HDDの容量は500GB

メモリ4GB

ディスプレイの解像度1280×800(フルHDより少し少ない)

このスペックで確か当時3~5万円で購入したと思う。

今の価値だったら5000円以下かもしれない。

当時のOSはWindows8。しかしWindows10にアップデートした形跡があり、後々巡り巡ってUbuntuが入っています。

今のオイラはSSDの快適さを知ってしまっているため、このスペックではPC立ち上げに時間がかかっているだけでストレスになってしまっています。

というか、今の時代にメモリ4GBとは本当の意味で役立たずです。

まずは、何に使えるかを考えるよりも、使い物になるようにカスタマイズするべきでは無かろうか。

と思いました。

という訳で、分解。

ここまで書いて写真が無いのは、写真撮る前に分解してしまったからです。

本体の裏側のネジを取ると、キーボードが外れるようになるので、キーボードと基板の接続部分を外します。

HDDの場所は分かりました。

写真の左上のヤツですね。

これをSATAの2.5インチのSSDに取り替えれば換装できそうです。

HDDを外しました。

問題はメモリの場所ですね。ここからじゃ分かりません。

なので、マザーの部分も外しちゃいましょう。

いろんなケーブル(外部インターフェースとか、バッテリーやWi-Fiモジュールなどとの接続)を外して、マザーに相当する部分を外しました。

たぶん、金属の部分がヒートシンクになっていて、その裏側にCPUがあるんだと思います。

しかし、基板のどこを見てもメモリが無いなぁ。

もしかして、シルバーの金属に覆われている箇所の下だろうか?

当たりでした。

メモリはDDR3-12800Sらしい。

Amazonで調べてみると、過去に購入したことがあるやつ。

で、交換用のパーツを発注しました。

8000円ぐらいあればマシになるはず。

問題は、元通りに組み立てられるか、と言う所だね。

結構いろんなケーブル外したぞ。

【ラズパイ】【いろいろ計測モニター】時計表示を大きくしたい。

サービスでプログラムを稼働させてからは安定して動作しております。

ラズパイZeroで稼働させていますが、本体を手で触っても全然熱を感じないので、省エネだし、熱で壊れることもありません。

いいね、これ。

ただ、文字が小さいので、時刻だけ大きく表示させてもいいんじゃないかなって思っています。

ということで、フォントデータを作成中です。

Array = [
    [ #0
        [
            0x00, 0x00, 0x00, 0x80, 0xc0, 0xf0, 0xf8, 0xf8,
            0xfc, 0xfe, 0x7e, 0x3e, 0x3e, 0x1f, 0x1f, 0x1f,
            0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3e, 0x7e, 0xfe,
            0xfc, 0xf8, 0xf8, 0xf0, 0xc0, 0x80, 0x00, 0x00
        ],
        [
            0x00, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f,
            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x03, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe0
        ],
        [
            0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff
        ],
        [
            0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff
        ],
        [
            0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x80, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f
        ],
        [
            0x00, 0x00, 0x00, 0x03, 0x07, 0x1f, 0x3f, 0x3f,
            0x7f, 0xfe, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0,
            0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfe,
            0x7f, 0x3f, 0x3f, 0x1f, 0x07, 0x03, 0x00, 0x00
        ]
    ],
:
:

ちょっと大きくしすぎた感がありますが、最低限数字4文字入ればなんとかなるので、このままフォントデータのビットパターンを作成していきます。(残り6文字)

【ダイエット支援】【食事管理】詳細画面を作成する。

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/diet-mng

詳細画面を作成していきます。

これも体重管理の画面を流用してさくっと作成していきます。

処理部分は後で実装します。

web.php

Route::get('/eating', 'Eating\EatingController@index')->name('eating');
EatingController.php

<?php

namespace App\Http\Controllers\Eating;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class EatingController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('eating');
    }
}
eating.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">食事管理</div>

                <div class="panel-body">
                    @if (session('status'))
                        <div class="alert alert-success">
                            {{ session('status') }}
                        </div>
                    @endif
                </div>
                <eating-list-component></eating-list-component>
            </div>
        </div>
    </div>
</div>
@endsection
app.js

Vue.component('eating-list-component', require('./components/Eating/EatingListComponent.vue'));
EatingDashboardComponent.vue

<template>
    <div>
        <div class="dashboard">
            <div class="chart">
                <canvas id="eating"></canvas>
            </div>
            <div class="command">
                <ul>
                    <li><a @click="onClickPrev">prev</a></li>
                    <li><a @click="onClickNext">next</a></li>
                </ul>
                <ul>
                    <li><a @click="onClickInput">クイック入力</a></li>
                    <li><a href="/eating">詳細</a></li>
                </ul>
            </div>
        </div>
        <eating-input-dialog-component :show="showInputDialogContent" @update="invokeUpdateList"></eating-input-dialog-component>
    </div>
</template>
EatingListComponent.vue

<template>
    <div>
        <div>
            <p id="navi">> <a href="/home">HOME</a></p>
            <p id="inputbutton">
                <button @click="onClickInput">データ入力</button>
            </p>
            <div id="pagenate">
                <ul>
                    <li>
                        <a href="#" v-if="prevShow" @click="prevPage()">&lt;</a>
                        <b v-else>&lt;</b>
                    </li>
                    <li v-for="page in pagenates">
                        <a href="#" v-if="currentPage != page" @click="changePage(page)">{{ page }}</a>
                        <b v-else>{{ page }}</b>
                    </li>
                    <li>
                        <a href="#" v-if="nextShow" @click="nextPage()">&gt;</a>
                        <b v-else>&gt;</b>
                    </li>
                </ul>
            </div>
            <table class="eatinglist">
                <tbody>
                    <tr>
                        <th class="date">日時</th>
                        <th class="protein">タンパク質</th>
                        <th class="liqid">脂質</th>
                        <th class="carbo">炭水化物</th>
                        <th class="calorie">カロリー</th>
                        <th class="edit"></th>
                        <th class="delele"></th>
                    </tr>
                    <tr v-for="data in datalists">
                        <td class="date">{{ data.date}}</td>
                        <td class="protein">{{ data.protein}}</td>
                        <td class="liqid">{{ data.liqid}}</td>
                        <td class="carbo">{{ data.carbo}}</td>
                        <td class="calorie">{{ data.calorie}}</td>
                        <td class="edit"><a @click="onClickEdit(data.id)">Edit</a></td>
                        <td class="delele"><a @click="onClickDelete(data.id)">Delete</a></td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            showInputDialogContent: false,
            showEditDialogContent: false,
            showDeleteDialogContent: false,
            datalists: [],
            pagenates: [],
            currentPage: 1,
            maxPage: 1,
            param: {},
            contents: {
                page: "",
            },
        };
    },
    computed: {
        prevShow: function() {
            return this.currentPage != 1;
        },
        nextShow: function() {
            return this.currentPage != this.maxPage;
        },
    },
    created: function() {
    },
    methods: {
        createPagenate: function() {
        },
        changePage: function(page) {
        },
        nextPage: function() {
        },
        prevPage: function() {
        },
        onClickInput: function() {
        },
        onClickEdit: function(id) {
        },
        onClickDelete: function(id) {
        },
        invokeUpdateList: function() {
        },
        updateList: function() {
        }
    }
}
</script>
app.scss

@import "eatinglist";
_eatinglist.scss

table.eatinglist {
    width: 100%;
    tbody tr {
        th {
            border: solid;
            border-width: thin;
        }
        .date {
            width: 20%;
        }
        .protein {
            width: 15%;
        }
        .liqid {
            width: 15%;
        }
        .carbo {
            width: 15%;
        }
        .calorie {
            width: 15%;
        }
        .edit {
            width: 10%;
        }
        .delete {
            width: 10%;
        }
        td {
            border: solid;
            border-width: thin;
            text-align: right;
        }
        .date {
            width: 20%;
        }
        .protein {
            width: 15%;
        }
        .liqid {
            width: 15%;
        }
        .carbo {
            width: 15%;
        }
        .calorie {
            width: 15%;
        }
        .edit {
            width: 10%;
        }
        .delete {
            width: 10%;
        }
    }
}
p#inputbutton {
    text-align: right;
    margin-right: 10px;
}
p#navi {
    margin-left: 10px;
}
div#pagenate {
    text-align: right;
    ul li {
        margin-left: 5px;
        margin-right: 5px;
        display: inline;
    }
}

まぁ、まだデータがないからね。

AndroidのGPSで位置情報を取得してみた。

今日はマジ暑くてしんどい。

Android10でGPSの位置情報を取得する方法を調べてみたところ、

まぁ、かなり古い情報しか発掘されなくて。

こういう情報はどんどん更新されていくから、バージョンが変わると調べ直すのめんどくさい。

一番有効な情報はこちらの記事でした。

https://dev.classmethod.jp/articles/android-get-location/

Javaではなく、Kotlinのコードですが、オイラの環境でも動くのを確認しました。(Pixel3)

Javaのコードが全く見つからなくて、

もう時代はKotlinで、Javaはオワコンなんですかね・・・

仕方が無い、kotlin勉強するか。

偶然、Kindle Unlimited対象の書籍が見つかったので、時間があるときに読んでいます。

時間はたっぷりあるけどな。

今後は、GPSの位置情報を使った、ちょっとしたお遊びアプリを考えています。