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

【ラズパイ】7セグLEDを試す。

久しぶりのラズパイ。

以前は、温湿度計の測定結果をLCDに表示されていたのですが、

配線が壊れまして、

直巣のめんどくさい、となって、そのまま放置していました。

しかし、7セグLEDを使用したらどうだろう?と思いまして、試してみることにしました。

これを実際に回路に組み込んでみた。

思った以上に配線汚い。

7セグLEDの回路図はこんなかんじ。

下の7端子はラズパイのGPIOに接続。

上の3端子は、トランジスタのコレクタに接続します。

トランジスタのベースには、GPIO14,15,18を接続します。

エミッタはGNDに接続します。

これは、フラッシュ型になっていまして、3桁を異なる値にするためには、出力を点滅するように操作することによって、表示を実現する仕組み。

トランジスタはその出力をコントロールするためのスイッチです。

この回路でLED点灯を確認したので、実際の処理を作っていきます。

【UNITY】GOOGLE PLAYストア登録までの道(最終回)

最後のエラーはこれ。

この App Bundle にはネイティブ コードが含まれ、デバッグ シンボルがアップロードされていません。クラッシュや ANR を簡単に分析、デバッグできるよう、シンボル ファイルをアップロードすることをおすすめします。

これはででバッグ用のデータをアップロードしてください、ということなんですが、

そもそも、このデータを作成するには、

ビルド設定でsynbols.zipを作成にチェックを入れてビルドを行います。

これをネイティブデバッグシンボルにアップロードすればいいのですが。

300MBを越えるとファイルが大きすぎると怒られます。

この現象は、zipファイルを一度展開し、サイドzipファイルに固めるとファイルサイズが小さくなって、アップロード出来るようになります。

こちらの記事を参考にしました。

https://qiita.com/ShortArrow/items/854a9f7e855dd937fee2

これでエラーは全て解消されました。

長かった・・・

【UNITY】GOOGLE PLAYストア登録までの道(その6)

その5

次のエラーは、

この App Bundle に関連付けられている難読化解除ファイルはありません。難読化コード(R8 / ProGuard)を使用している場合、難読化解除ファイルをアップロードすると、クラッシュと ANR をより簡単に分析、デバッグできるようになります。R8 / ProGuard の使用は、アプリサイズの縮小につながります。

参考にしたサイトはこちら。

そもそもの話、ビルドの時にR8オプションをつけると、難読・圧縮化されて、ファイルサイズが小さくなるというメリットがあるのですが、

難読化しているので、デバッグ情報が出力されないという問題があり、それを解決するためにマッピングファイルをアップロードしておくと良いですよ、という話です。

Unityの設定は、プロジェクト設定で行います。

「R8を使用」という項目にチェックをつけます。

これでビルドするときに、マッピングファイルも出力されます。

アップロードするところはこちら。

ReTraceマッピングファイルの所に、aabファイルと一緒に出力されるマッピングファイルをアップロードします。

これで、このエラーは解消されました。

まだ続きます。

【Unity】GOOGLE PLAYストア登録までの道(その5)

その4

次のエラーは、

このリリースは Google Play の 64 ビット要件に準拠していません。
以下の APK または App Bundle は 64 ビットのデバイスで利用できますが、32 ビット向けネイティブ コードしか含まれていません([1])。
アプリには 64 ビットと 32 ビットのネイティブ コードを含めます。Android App Bundle 公開形式を使用して、各デバイスのアーキテクチャが自動的に必要なネイティブ コードだけを受け取るようにします。これにより、アプリ全体のサイズが増大することを回避できます。

これはこちらの記事を参考にしました。

https://qiita.com/nonkapibara/items/a708b856a496a96ccec5

プロジェクト設定のPlayer設定の中にスプリクティングバックエンドの項目があるので、これを「IL2CPP」に変更します。

そうすると、ターゲットアーキテクチャのARM64の設定が可能になるので、この項目をチェックにします。

この状態でビルドしてアップロードすると、エラーは解消されます。

まだ続きます。

【Unity】GOOGLE PLAYストア登録までの道(その4)

その3

次のエラーは、

このアプリが COVID-19(新型コロナウイルス感染症)の接触確認アプリまたは感染状況やワクチン接種状況を確認するアプリであるかどうかを申告してください。

まぁ、これは簡単で、

ダッシュボードにCOVID-19に関する設定項目があるので、ここで設定を行えば解消されます。

まだ続きます。

【UNITY】GOOGLE PLAYストア登録までの道(その2)

その1

次に出てきたエラーは、

現在、お客様のアプリは API レベル 29 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 30 以上を対象にする必要があります。アプリの対象 API レベルを 30 以上に変更してください。

これは、Android SDKのAPIレベルが低いだけなので、Unityのプロジェクト設定のターゲットAPIレベルをAPIレベル30以上のものを選択すれば良い。

しかし、Unityからダウンロードすると、なぜか失敗するので、

Android StudioのSDKマネージャーでダウンロードして、UnityのデフォルトのSDKパスの下のplatformsのフォルダにコピーすれば良い。

こちらを参考にしました。

http://blog.lab7.biz/archives/26146976.html

このエラーは解決しましたが、まだエラーが残っています・・・。

先は長い。

【UNITY】Google Playストア登録までの道(その1)

ある程度までゲームが完成したので、

早速ストアに登録だ!

アップロードできませんでした
アップロードされた APK または Android App Bundle がデバッグモードで署名されています。APK または Android App Bundle はリリースモードで署名する必要があります。詳しくは、署名についての説明をご覧ください。

アップロード失敗。

原因はこちらに書いてありました。(Qiitaの記事)

https://qiita.com/VeyronSakai/items/5946ee50e22f68a8ea5a

プロジェクト設定から公開設定の項目で、keystoreファイルを作成する必要があります。

こんなん分かるか!💢

これは初見殺しだわ。

そして、公開はまだ遠い・・・

【北海道大戦2021】Vectorにて公開しました。

https://www.vector.co.jp/soft/winnt/game/se523424.html

たぶん、最後までプレイ出来るはず・・・。

今回の反省点。

一枚のマップに詰め込んだので、自治体のマスが小さい。

あと、データの扱い方も失敗した。

データのセーブ・ロード機能を実装しているときに気がついた。

オブジェクトにゲッタ・セッタでデータを個別に与えるのでは無く、

オブジェクト作成時に、使用するシングルトンのデータを参照渡しした方が良かった。

今後の予定。

今回はAltseedというライブラリを使用しましたが、

今後はUnity一本で行こうと思う。

広告収入を目論むことが出来るのが一番大きい。

今はほとんどの商用ゲームもUnityが多いしね。

それにUnityなら上の反省点も改善できるかもしれない。

ということで、今後も頑張ります。

【スペック比較】Pixel5a(5G)が発表されました。

こちらのサイトにもスペック詳細が記載されています。

https://store.google.com/jp/magazine/compare_pixel?hl=ja

Pixel4a(5G)との違い

基本的にはPixel4a(5G)に近いですが、

大きな違いとして、

防塵防水機能が追加されています。

水に濡れても大丈夫。

しかし、なくなった物もあります。

Googleフォトの容量無制限がありません

それでもPixel4a(5G)から9000円近く安くなるのですから、かなりお買い得かもしれません。

Pixel5との違い

低価格化しているため、色々とスペックダウンしています。

以下が削除されています。

  • ワイヤレス充電
  • バッテリーシェア
  • RAM8GB→6GB

しかし、

オーディオジャックが付いています。

オーディオジャック信者にはたまらないかもしれません。

価格も23000円近く抑えられているので、お買い得です。

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

複数のオブジェクト(Colleague)の制御を行うのにMediatorクラスを作成し、これを介して制御を行います。

package org.example.mediator;

public interface Mediator {
    public void createColleagues();
    public void colleagueChanged();
}
package org.example.mediator;

public abstract class Colleague {
protected Mediator mediator;
public abstract void setMediator(Mediator mediator);
public abstract void controlColleague();
}
package org.example.mediator;

public class ConcreteColleague1 extends Colleague {
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}

@Override
public void controlColleague() {
}
}
package org.example.mediator;

public class ConcreteColleague2 extends Colleague {
@Override
public void setMediator(Mediator mediator)
{
this.mediator = mediator;
}

@Override
public void controlColleague()
{
}
}
package org.example.mediator;

public class ConcreteMediator implements Mediator{
private Colleague concreteColleague1;
private Colleague concreteColleague2;

@Override
public void createColleagues() {
concreteColleague1 = new ConcreteColleague1();
concreteColleague1.setMediator(this);
concreteColleague2 = new ConcreteColleague1();
concreteColleague2.setMediator(this);
}

@Override
public void colleagueChanged() {
concreteColleague1.controlColleague();
concreteColleague2.controlColleague();
}
}
package org.example.mediator;

import java.util.Scanner;

public class Main {
public static void main(String[] args)
{
Mediator mediator = new ConcreteMediator();
mediator.createColleagues();
mediator.colleagueChanged();
}
}