Twitterにフリートという機能が追加されたらしいが、まずは先にやることがあるだろう。※追記あり

Twitterもインスタ化か、と揶揄されています。

この機能、どうやらiPhoneアプリのみの機能でして。

オイラの所には、PC(Web版)、Android、iPad Pro、iPod touchがあるので、一応、そちらの方でも確認してみた。

PC(Web)、Androidには実装されておりません。

iPad Proにも実装されておりません(iOS(正確にはiPad OS)なんだけどな!)

iPod touchには、音声ツイートが追加されていましたが、フリート機能はありませんでした。

ただ、この機能、あまり評判がよろしくないみたいで、

むしろ実装されていなくて良かった。

というか、こういう新機能って、他プラットフォームでも同時にリリースするものだと思うけどねぇ?

みんながiPhoneだと思うな。

※追記

この記事を書いた後、Twitterのアップデートがありまして、AndroidとiPod touchでフリート機能が実装されました。

iPad Proは相変わらず実装されていません。

というか、見た目が完全にインスタ化してるな・・・

「Error:java: エラー: リリース・バージョン〇はサポートされていません」の解決方法

久しぶりにIntelliJを使ったらハマった。

原因は使用しているJDKのバージョンが、実際にあるものと、IntelliJの設定が異なっているからです。

設定する場所はここ。

Project StructureのProject SDKのバージョンが、PCに入っているバージョンと一致しているか、

と、Project language levelのバージョンが一致しているか。

もう一つは、settingのJava compilerのbytecodeのバージョン。

この設定が全て一致していないと、タイトルにあるようなビルドエラーが出るようです。

焦るわ!

【デザインパターン】Factoryパターン

なんでデザインパターンの話になるとJavaなのかね?

まぁ、概念が解れば他の言語にでも応用は可能だけど。

さくっとサンプルコードを書いてみました。

package org.example.factory.creator;

public abstract class Product {
    public abstract void methodA();
    public abstract void methodB();
}

package org.example.factory.creator;

public abstract class Creator {
    public final Product create() {
        Product product = factoryMethod();
        return product;
    }

    protected abstract Product factoryMethod();
}

package org.example.factory.concrete;

import org.example.factory.creator.Product;

public class ConcreteProduct extends Product {
    public ConcreteProduct() {
        super();
    }

    public void methodA() {

    }

    public void methodB() {

    }
}

package org.example.factory.concrete;

import org.example.factory.creator.Creator;
import org.example.factory.creator.Product;

public class ConcreteCreator extends Creator {

    protected Product factoryMethod() {
        return new ConcreteProduct();
    }
}
package org.example.factory;

import org.example.factory.creator.*;
import org.example.factory.concrete.*;

public class Main {
    public static void main(String[] args) {
        Creator factory = new ConcreteCreator();
        Product object = factory.create();
        object.methodA();
        object.methodB();
    }
}

抽象クラスProductとCreatorを作成します。

Creatorクラスではcreateメソッドを実装していますが、その実態であるfactoryMethod()は抽象メソッドです。

これを使用するにはProductとCreatorを実装したクラスを作成する必要があります。

それがConcreteProductとConcreteCreatorという例で作成しています。

使用する場合は、まずはConcreteCreatorをインスタンス化し、Creator型で保持します。

以後、create()メソッドを使用して、ConcreteProductのインスタンスを作成して使用します。

新しいProductを追加する場合は、同じようにProductとCreatorを実装するクラスを作成し、Creator型で新しいCreatorをインスタンス化して使用すれば対応可能です。

このパターンを使用するメリットとしては、Productを作成する窓口がcreate()メソッドに一本化されます。

Productの初期設定をfactoryMethod()内に実装すれば、Productに対するあれこれ設定をするという余計な手間が省けます。

【北海道大戦】バトルのバランス調整

ちょっとコードを書き換えてバトルのバランス調整をしました。

        private void onClickMouseShowActionResult(asd.Vector2DF pos)
        {
            var result = janken(selectedAttack, selectedDeffece);
            if(result == BattleResult.win)
            {
                _deffencePower -= (int)Math.Floor(_attackPower * (Singleton.Random.NextDouble() + 0.1));
                if(_deffencePower <= 0)
                {
                    Singleton.GameData.BattleResultUpdate(BattleResult.win);
                    var scene = new MainScene();
                    asd.Engine.ChangeScene(scene);
                    _deffenceParam.Text = "戦闘力:0";
                }
                else
                {
                    _deffenceParam.Text = "戦闘力:" + _deffencePower;
                }
            }
            else if(result == BattleResult.lose)
            {
                
                _attackPower -= (int)Math.Floor(_deffencePower * (Singleton.Random.NextDouble() + 0.1));
                if (_attackPower <= 0)
                {
                    Singleton.GameData.BattleResultUpdate(BattleResult.lose);
                    var scene = new MainScene();
                    asd.Engine.ChangeScene(scene);
                    _attackParam.Text = "戦闘力:0";
                }
                else
                {
                    _attackParam.Text = "戦闘力:" + _attackPower;
                }
            }
            _attackResult.Hide();
            _deffenceResult.Hide();
            _status = GameStatus.SelectDeffenceAction;
        }

単純に戦力値で引き算する訳じゃ無くて、

乱数の係数を掛け合わせてみました。

単純計算ではわずかな戦力差でも一撃で決着が付いてしまいましたが、

これによって、僅差であれば、一撃で決着することは無くなります。

あとは札幌強すぎ問題ですね・・・

北海道の1日のコロナ感染者が200になったというニュースを見て

飲まずにはいられない。

※これはAPIAの平日夕方に飲んでいます。

さすがにススキノの飲む気分にはなれない。

北海道で感染が拡大する要因はいくつか指摘されていますが、

例えば、北海道の建物は気密性が高く(冬は寒いので暖気を逃したくは無い)、換気がきちんとできていなかったり

ニュースを聞いていると、マスク無しで町中を歩いている人達もいるようです。

コロナ慣れとも言うのでしょうか。

危機感が薄れてきていると思います。

市役所の職員が街頭でマスクをしていない人にマスクを配布しているようですが、それすらも払いのける人もいるようです。

結局感染を防げるかどうかは我々がきちんと感染拡大防止行動ができているかに関わってくるので、

今後もそれをただひたすら徹底して続ける以外にできることは無いです。

感染拡大を行政(知事)の責任と言う人も見受けられましたが、こんなのは頭おかしいと思います。

行政は我々民間の行動を支える(環境を作る)立場なのですから。

感染拡大は我々の普段の行動の結果であると言うことをお忘れ無く。

そして、今後感染者が増えるか減るかも、我々の行動次第ということも。

赤外線LED、レシーバを購入しました。

右が赤外線LED、左側が赤外線受信機です。

梅沢無線で買ってきました。

この二つがあれば、赤外線通信ができるはずです。

はい、今度は赤外線をやってみたいと思います。

目指すところは、テレビのリモコンの赤外線を受信機でトレースし、その信号を再現してテレビを操作しちゃおうと考えています。

で、まずは赤外線LED(信号送信側)を試してみようと思うのですが、

例によって、「抵抗は必要なのか?」という疑問が出てきます。

はい、過去に発光ダイオードを抵抗なしで電圧かけたことによって、発光ダイオードを破壊したことがあります。

初心者あるあるですよね??

秋月電子のオンラインショップのページにデータシートなどが掲載されているので、これを確認すると、

https://akizukidenshi.com/catalog/g/gI-03261/

やはり抵抗が必要なようです。

では、何Ωの抵抗が必要なのか。

計算式は、

(V - VF) ÷ IF = Ω

データシートからこの公式に当てはめると、

(5 - 1,6) ÷ 0.1 = 34Ω

手持ちにある20Ωの抵抗を1~2個使えば大体近い値になりそうです。

で、回路を組んでみた。

電圧をかけてみる。

抵抗2個の場合。

抵抗1個の場合。

肉眼では分かりませんが、スマホのカメラを通してみてみると、赤外線LEDの先っちょが赤く光っているのが分かると思います。

写真では1個と2個で違いが分かりませんが、実際にスマホのカメラのプレビュー画面を見てみると、1個の方が光が強いように見えます。

今回は入力を5V一定にしましたが、これをプログラマブルなパルス信号にすると、リモコンの赤外線通信を再現できると思います。

Dマガジンについて調べたら、楽天マガジンの方がお得と聞いたので。

Dマガジン

楽天マガジン

いま、オイラが利用しているのはDマガジンです。

Dマガジンの事を紹介しようと思ったら、楽天マガジンの方がお得と聞いて。

何が違うんだろうか。

値段。

Dマガジンは月440円(税込み)

楽天マガジンは月418円(税込み)

若干楽天マガジンの方が安い。

書籍の数。

Dマガジンは約450冊。

楽天マガジンは約500冊。

お試しで使用してみたけど、ラインナップは週刊誌中心なのは変わらないが、楽天マガジンでしか読めない雑誌もありました。

韓国語ジャーナルが7年振りに復刊だって。

昔買ってたなぁ。

これも楽天マガジンで読めます。

その他、気がついたこと。

Dマガジンは基本的にネット接続していないと読めませんが、

楽天マガジンは事前にダウンロードしておけばオフラインでも読めます。

オイラの使用スタイルは、iPad Pro+デザリングで読んでいましたけど、

家であらかじめダウンロードしておけば、通信量は少なく済むかもしれません。

ここまで見たら楽天マガジンのほうが良いような気がするぞ。

まぁ、ぶっちゃけ、週間アスキーが読めれば十分なのですが。

Dマガジン解約するか。

【ダイエット支援】【入力履歴機能】履歴データ処理の作成

前回作成した履歴一覧画面からデータテンプレートへ移動する機能を作成していきます。

<template>
    <div>
        <div>
            <p id="navi"> <a href="/home">HOME</a></p>
            <p id="inputbutton">
                <button @click="onClickSubmit">選択したデータを登録</button>
            </p>
            <table class="eatinghistory">
                <tbody>
                    <tr>
                        <th class="check">
                            <input type="checkbox" v-model="all" @click="onAllCheck" />
                        </th>
                        <th class="date">日時</th>
                        <th class="item">アイテム</th>
                        <th class="protein">タンパク質</th>
                        <th class="liqid">脂質</th>
                        <th class="carbo">炭水化物</th>
                        <th class="calorie">カロリー</th>
                    </tr>
                    <tr v-for="data in datalists">
                        <td class="check">
                            <input type="checkbox" v-model="data.check" />
                        </td>
                        <td class="date">{{ data.date}}</td>
                        <td class="item">{{ data.item}}</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>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</template>

チェックボックスの処理と処理を行うボタンを配置しました。

リストのチェックボックスはリストデータとバインドさせています。

チェックした内容がそのままデータに反映されます。

        onClickSubmit: function() {
            var self = this;
            this.datalists.forEach(element => {
                if(element.check == true){
                    this.ids.push(element.id);
                }
            });
            this.param.contents = this.ids;
            axios.post('/api/eating/regist', this.param).then(function(response){
                self.updateList();
            }).catch(function(error){
            });
        },
        onAllCheck: function() {
            if(this.all == false) {
                this.datalists.forEach(element => {
                    element.check = true;
                });
            }else{
                this.datalists.forEach(element => {
                    element.check = false;
                });
            }
        }

ヘッダのチェックをクリックすると、リストの中の全項目にチェックを行うように処理しています。

そして、「選択したデータを登録」をクリックすると、チェックをつけたidのリストがバックエンド側に送信されます。

Route::post('api/eating/regist', 'Eating\ApiController@regist');
class ApiController extends Controller
{
    public function regist(Request $request)
    {
        $this->eatingManagement->registTemplate($request->contents);
        return response()->json();
    }
class EatingManagementRepository
{
    public function registTemplate($ids)
    {
        $records =EatingHistoryItem::whereIn('id', $ids )->get();
        foreach($records as $record)
        {
            $model = new EatingTemplateItem();
            foreach($this->templateParamNames as $name)
            {
                $model->$name = $record[$name];
            }
            $model->save();
            $record->delete();
        }
    }

idのリストを元にhistoryのデータをtemplateに移動させています。

この画面はまだまだ改良の余地がありますが、とりあえずこんな感じでいいでしょう。

次回はテンプレートから入力候補を検索する処理を作成していきます。

【Alexa】次のバスの時刻を教えてくれる。バス通勤とかに便利。

このスキルが意外と便利だったりする。

使い方は簡単。

Alexaアプリで、よく使うバス停(乗るバス停と降りるバス停)を登録するだけ。

設定が終わったら「アレクサ、次のバスは?」と話しかけるだけ。

そうすると、次のバスが何分後の何時何分に来るか、その次のバスは何分後か、というのを教えてくれます。

これ、自宅の近所、よく使うバス停と、降りるバス停を登録しておくと、家を出るタイミングが分かるので、非常に便利なんです。

そういえば、Pixel4aってeSIM搭載なので、手軽に乗り換えられるんじゃ無いかって思ったけど。

通常、新規契約やMNPでSIMカードを発行して貰うとき、発行手数料として3000円ぐらい支払わなくちゃいけないし、

SIMカードが届くまで電話やモバイル通信ができなくなります。

WiFi経由なら問題無いけど、二段階認証とかでSMS受信が必要になった場合に困ります。

しかし、eSIMが使えるなら、発行手数料もかからないし、設定すればその場ですぐ使用できます。

そもそもeSIMって何?

端末に内蔵されているSIMカードのようなもので、

最初は空っぽの状態ですが、プロファイル情報を書き込んであげることでSIMカードとして機能します。

日本国内のeSIM事情。

調べてみると、日本のモバイル通信事業者でeSIM対応を行っているのは、

楽天モバイルとIIJmioの2業者だけですね。

思った以上に少ないっすね。

楽天モバイルの特徴。

基本料金は2980円ですが、一年間無料。

そして通信量は無制限。

ただし、これは楽天圏内に限りまして、今のところ楽天圏内は大都市圏に限ります。

それ以外は他事業者の回線を借りて通信を行いますが、その場合は5GBの制限があります。

ただ、札幌はすでに楽天圏内なので容量無制限で通信可能。

ただし、地下などでは楽天回線が使えない場合があります。

IIJmioの特徴。

Zeroプランでは、契約手数料1円、基本料金は150円で、使用する容量に応じて料金が加算されます。

例えば、1GB使用する場合は300円、それ以降は1GB使用する度に450円、といった感じです。

で、どうする?

今のNifmoのプランでは通話+7GBで2300円払っています。

楽天モバイルにすれば1年無料で通信し放題だけど、それ以降は割高になってしまいます。

でも楽天ポイント付くんだよね?

IIJmioは論外。

ちょっと考えます。

自分、ぼっちですが何か?