じゃんけんアプリ RPS-101を実装したい

RPS-101 101手あるじゃんけん

https://dalomo.net/blog/2019/05/30/464/

の続き。

もうちょっと整形するんじゃ

いくつか調べてみたところ、JavaにはMapというものがあるみたい。連想配列っていうみたい。他にList っていうのもある。この前の表をもうちょい整形して、csvとかにしてAndroidStudioで読み込んでやれば扱えそう。多次元配列でもいいんかな。例えば

ResultSentence[1][2] = "OUTCLASSES TORNADO"
ResultSentence[1][3] = "CLEARS QUICKSAND"
…
ResultSentence[101][50] = "FLIES OVER SPIDER"

みたいな?うーん。Map使ったことないから使ってみたいな。ということで、

Sub setno()

    For i = 101 To 1 Step -1
    
        Columns(i).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    
        For j = 2 To 51
        
            Dim hand As Long
        
            If j + i - 1 > 101 Then
                hand = j + i - 102
            Else
                hand = j + i - 1
            End If
            
            Cells(j, i).Value = CStr(i) & "_" & CStr(hand)
            
        Next j

    Next i
    
End Sub

こんなんと、

Sub move()

    For i = 3 To 201 Step 2
        rc = Cells(Rows.Count, 1).End(xlUp).Row
        
        Range(Cells(1, i), Cells(50, i + 1)).Copy Range("A" & rc + 1)
        Range(Cells(1, i), Cells(50, i + 1)).ClearContents
    Next i

End Sub

こんなん書いて、カンマ区切りcsvで出力して、

https://dalomo.net/blog/files/ResultSentence.csv

こんなんできました。ついでに

https://dalomo.net/blog/files/Hands.csv

出し手のマスタも作った。

コードに書いてないけど、Trimで消えないスペースとセル上で見えない改行に悩まされた。Chr(13)とChr(32)とChrW(160)あたりをReplaceするんや。

参考

https://thom.hateblo.jp/entry/2016/09/20/150650

https://www.lifedesignedit.com/note/remove_white-space_in_vba

CSVの読み込み

public Map CSV2Map(String TargetCSV) {
    Map<String, String> map = new HashMap<>();

    try {
        InputStream inputStreamResult = getResources().getAssets().open(TargetCSV);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStreamResult);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] strArray = line.split(",");
            map.put(strArray[0], strArray[1]);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return map;
}
ResultSentence = CSV2Map("ResultSentence.csv");

こんなコードを書いて、csvからMapに格納する。これそういえばjson読み込む時にやったな。忘れてるなー。

参考

https://qiita.com/atsuk0r0/items/8d6e4b57821817b65bd0

https://www.programming-shimomura.com/2017/06/23/%E3%80%90android%E3%80%91csv%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%88%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E4%BB%98%E3%81%8D%EF%BC%89/

https://www.autumn-color.com/archives/1506

https://docs.oracle.com/javase/jp/8/docs/api/java/util/StringTokenizer.html

http://java-code.jp/799

読み込んだCSVをSpinnerにセットする

手数分ボタンを設置するわけにいかんので、なんかないかなーと調べてみたらSpinnerというのがあった。ドロップダウンリストみたいなもんみたい。ところが、Spinnerを作成する時にはAdapterが必要なんだけど、AdapterはResourceに配列か、データベースクエリかで、配列の場合Listか文字列Resource(String.xmlとか)でないと駄目っぽい。なんだと…。ここら辺よく分かってない。.createFromResourceだと駄目で、.Addする分には大丈夫なのかな。試しにとりあえず書いてみたけど

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rps101);

    ResultSentence = CSV2Map("ResultSentence.csv");
    Hands = CSV2Map("Hands.csv");

    spinner = findViewById(R.id.spinner);
    arrayAdapter.add(Hands.get("1")); ←ここでエラー。
}

駄目でした。

やっぱMapじゃなくて配列のがいいのか。そもそもcreatefromresourceってやんなきゃあかんのかな。それかnew?つーことで

public String[] CSV2Array(String TargetCSV) {
    String[] rtarray = new String[102];

    try {
        InputStream inputStreamResult = getResources().getAssets().open(TargetCSV);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStreamResult);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] strArray = line.split(",");
            rtarray[Integer.parseInt(strArray[0])] = strArray[1];
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return rtarray;
}

CSV2Mapをコピペし配列っぽくしてみる。んで

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rps101);

    ResultSentence = CSV2Map("ResultSentence.csv");
    Hands = CSV2Array("Hands.csv");

    spinner = findViewById(R.id.spinner);
    arrayAdapter = new ArrayAdapter<>(this, R.layout.support_simple_spinner_dropdown_item, Hands);
    spinner.setAdapter(arrayAdapter);

}

こう。

ふむ。できた。

参考

https://developer.android.com/guide/topics/ui/controls/spinner?hl=ja

https://developer.android.com/reference/android/widget/ArrayAdapter.html?hl=ja

https://www.javadrive.jp/android/arrayadapter/index2.html

Spinnerで選択したものを取得

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        myHand = i;
        
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
});

こんな…?int i がpositionっぽいのでそれを取得しとけば数値で扱えそう…。なんかだんだん不安になってきたな。

参考

https://advancement-of-it-dwarfs.blogspot.com/2018/01/android-spinner-how-to-get-select-event.html

ボタンを押して勝負する

選択時にそのまま勝負でもいいかなと思ったんだけど、なんとなくボタンを押して勝負する感じに。

public void Bout(View view) {
    Toast toast;
    Random rand = new Random();
    int eneNum;
    int resNum;
    String resKey = null;
    String winHand = null;

    if (myHand < 1 || myHand > 101) {
        toast = Toast.makeText(this, "select hand", Toast.LENGTH_SHORT);
        toast.show();
        return;
    }

    eneNum = rand.nextInt(101) + 1;
    tvEnemy.setText(Hands[eneNum]);

    resNum = (myHand - eneNum + 101) % 101;

    if (resNum == 0) {
        tvResult.setText("draw");
    } else if (resNum >= 1 && resNum <= 50) {
        tvResult.setText("lose");
        winHand = Hands[eneNum];
        resKey = eneNum + "_" + myHand;
    } else if (resNum >= 51) {
        tvResult.setText("win");
        winHand = Hands[myHand];
        resKey = myHand + "_" + eneNum;
    }

    tvResultSentence.setText(winHand + " " + ResultSentence.get(resKey));
}

こんな感じになった。結局なんか同じ感じのコードが並んじゃったなぁ。

なんなんだろね、いまいち消化不良だ。

カテゴリー: したい | タグ: , , , , | コメントする

基本情報技術者試験の合格証書が送られてきた

合格!

もしかしたら証書の元号は平成かなーとか思ってたら、令和だったのでラッキーってなった。受かったのは平成31年度春期だけど、証書は合格発表日の日付だから令和にしてくれるのね。やったぜ、実感が湧いてきたー。令和の証書を手に入れちゃったから、応用受けるのめんどくさくなってきたな。どうしよっかなー。

カテゴリー: のーと | タグ: | コメントする

じゃんけんアプリ色々

じゃんけんアプリ

本を読んでいたらじゃんけんアプリの決定表を用いた実装方法が載っていた。目からウロコだったので書いてみたくなった。初学者に教育する流れとしてよく使われるらしいので周知の物みたいだけど。

関係ないけど新しくアプリ作ろうとしたら選択言語でKotlinが上に来てた。。。初めからKotlin使ってればよかったな。

ifで条件分岐したじゃんけんアプリ

普通の、というとちょっと語弊があるけれど、ifで条件分岐するやつを愚直に書いてみる。

public class RPS3Activity extends AppCompatActivity {
    TextView result;
    TextView ophand;
    static final int ROCK = 0;
    static final int SCISSORS = 1;
    static final int PAPER = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rps3);

        result = findViewById(R.id.ResulttextView);
        ophand = findViewById(R.id.OpponentHandtextView);

    }

    public void onClick(View v) {
        Random rand = new Random();
        int num = rand.nextInt(3);

        switch (v.getId()) {
            case R.id.btRock:
                if (num == ROCK) {
                    ophand.setText(R.string.rock);
                    result.setText(R.string.draw);
                } else if (num == SCISSORS) {
                    ophand.setText(R.string.scissors);
                    result.setText(R.string.win);
                } else if (num == PAPER) {
                    ophand.setText(R.string.paper);
                    result.setText(R.string.lose);
                }
                break;

            case R.id.btScissors:
                if (num == ROCK) {
                    ophand.setText(R.string.rock);
                    result.setText(R.string.lose);
                } else if (num == SCISSORS) {
                    ophand.setText(R.string.scissors);
                    result.setText(R.string.draw);
                } else if (num == PAPER) {
                    ophand.setText(R.string.paper);
                    result.setText(R.string.win);
                }
                break;

            case R.id.btPaper:
                if (num == ROCK) {
                    ophand.setText(R.string.rock);
                    result.setText(R.string.win);
                } else if (num == SCISSORS) {
                    ophand.setText(R.string.scissors);
                    result.setText(R.string.lose);
                } else if (num == PAPER) {
                    ophand.setText(R.string.paper);
                    result.setText(R.string.draw);
                }
                break;
        }
    }
}

こんななった。同じようなコードが並んでるねっと。

これでも一応動くは動く。

配列を使ったじゃんけんアプリ

ほんで配列使ったやつ。

public class RPS3Activity extends AppCompatActivity {
    TextView result;
    TextView ophand;
    int[] ihand = {R.string.rock, R.string.scissors, R.string.paper};
    int[][] judge = {
            {R.string.draw, R.string.win, R.string.lose},
            {R.string.lose, R.string.draw, R.string.win},
            {R.string.win, R.string.lose, R.string.draw}
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rps3);

        result = findViewById(R.id.ResulttextView);
        ophand = findViewById(R.id.OpponentHandtextView);
    }

    public void onClick(View v) {
        Random rand = new Random();
        int num = rand.nextInt(3);
        int hand = HandtoInt(v);

        result.setText(judge[hand][num]);
        ophand.setText(ihand[num]);
    }

    public int HandtoInt(View v) {
        int rt = 0;

        switch (v.getId()) {
            case R.id.btRock:
                rt = 0;
                break;
            case R.id.btScissors:
                rt = 1;
                break;
            case R.id.btPaper:
                rt = 2;
                break;
        }
        return rt;
    }
}

予め結果の表

相手の手
0 1 2
グー チョキ パー
自分の手 0 グー 引き分け 勝ち 負け
1 チョキ 負け 引き分け 勝ち
2 パー 勝ち 負け 引き分け

こういうの、を、配列として作っておき、どのボタンを押したかを数値化して、その数値を配列の添字にして結果を引っ張り出す。考えた人頭い~ね。

計算で結果を求めるじゃんけんアプリ

表を使わずに、出し手の数値から計算して勝利判定するやつ。本には載ってなかったけど、じゃんけんで他になんかないかなとネットで探してたら見つけた。

public class RPS3Activity extends AppCompatActivity {
    TextView result;
    TextView ophand;
    int[] ihand = {R.string.rock, R.string.scissors, R.string.paper};
    int[] judge = {R.string.draw, R.string.lose, R.string.win};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rps3);

        result = findViewById(R.id.ResulttextView);
        ophand = findViewById(R.id.OpponentHandtextView);
    }

    public void onClick(View v) {
        Random rand = new Random();
        int num = rand.nextInt(3);
        int hand = HandtoInt(v);

        int res = (hand - num + 3) % 3;

        result.setText(judge[res]);
        ophand.setText(ihand[num]);
    }

    public int HandtoInt(View v) {
        int rt = 0;

        switch (v.getId()) {
            case R.id.btRock:
                rt = 0;
                break;
            case R.id.btScissors:
                rt = 1;
                break;
            case R.id.btPaper:
                rt = 2;
                break;
        }
        return rt;
    }
}

こうするともう表もいらなくなる。コードを書く量がめっちゃ減ってるのがかっこいい。こういうコードを1からパッと書けるとかっこいいなぁ。

RPS-101、じゃんけんのすごいやつ

じゃんけんのことを色々探していたらRPS-101というのを見つけた。

http://www.umop.com/rps101/rps101chart.html

101手ある。その前に5手のやつはもうあってこのサイトの人は7, 9, 11, 15, 25を作って、101手も作っちゃったということみたい。おー。せっかくなので作ってみようかな。

仕組みを見る

上記ページの左上の方にチャートの見方が載っており読んでみると1は2-51に勝つ。2は3-52に勝つ。以下101は1-51に勝つ、まで。あと勝利の際の文言がそれぞれに用意されてる。例えば1のダイナマイトは

OUTCLASSES TORNADO
CLEARS QUICKSAND
CREATES PIT
EXPLODES CHAIN
OUTCLASSES GUN
BREAKS LAW
EXPLODES WHIP
EXPLODES SWORD
EXPLODES ROCK
CAUSES DEATH
EXPLODES WALL
SMOKE BLOTS OUT SUN

と、相手によって勝利文言を変えてるようだ。余計なことを。凝ってるね。勝利判定部分はすぐできそうなので、文言を集めよう。

ExcelVBA+IEでスクレイピング

スクレイピングは色んな方法があるけど、これしか知らんので、これでいく。

http://www.umop.com/rps101/alloutcomes.htm

ここに文言の一覧があるので取ってこよう。そういえば、Windows10にしてからやってねーな、Edgeになったけどできるのかな?

Sub rps()
 
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
     
    objIE.Visible = True
    objIE.navigate "http://www.umop.com/rps101/alloutcomes.htm"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
    DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.document
    
    Dim b As IHTMLElementCollection
    Set b = htmlDoc.getElementsByTagName("b")
    
    For i = 0 To 100
        Cells(1, i + 1).Value = b(i).innerText
    Next i
    
    Dim table As IHTMLElementCollection
    Set table = htmlDoc.getElementsByTagName("table")
    
    For j = 0 To 100
    
        Dim td As IHTMLElementCollection
        Set td = table(j).getElementsByTagName("td")
    
        Cells(2, j + 1).Value = td(0).innerText
        Cells(3, j + 1).Value = td(1).innerText
        Cells(4, j + 1).Value = td(2).innerText
        Cells(5, j + 1).Value = td(3).innerText
    
    Next j

End Sub

こんな感じでコードを書いた。Win10にもIEあるのね。するとこんな感じになる。

うまく1行ずつ取れんかった。

もうちょい整形

こんなコードを書いて

Sub splitcell()

    Dim arw As Variant
    
    For k = 1 To 101
        For i = 2 To 5
            arw = Split(Cells(i, k).Value, vbLf)
            
            rc = Cells(Rows.Count, k).End(xlUp).Row + 1
            
            For j = 0 To UBound(arw)
                Cells(rc + j, k).Value = Trim(Replace(arw(j), Chr(32), " "))
            Next j
        Next i
    Next k

End Sub

多重Forを書くと心が痛むけどこれしか分からん。こうなる。

ここまでやって、あれ?これ作ったところでどうやってアプリで扱うんだ?となる。

長くなりそうなので、ちょと記事分けよう。

カテゴリー: のーと | タグ: , , , , | コメントする

平成31年度春期情報処理技術者試験に合格した

基本情報技術者になった

やったあああああああああああああああああああああああああああああああ!!!!!!!!!!!!!!

結果

出来は微妙だけど受かったよおおおおおお!!!!!!!!!

22日が発表だったけど忘れてて、今日見たら受かってた!よかったー受験代が無駄にならずにすんだぜ。得点見てみると午後は配点高めのやつを掴めてたみたいだ。60点ギリギリでどっちかはもう運だと思ってたけど蓋を開けてみれば!受験直後の記事を見ると落ちる気満々だったね。予防線張りまくりウケる。

https://dalomo.net/blog/2019/04/21/402/

午前は自己採点どおりー。あーほんとよかった。嬉しい!この後どうしようっかな!応用も受けちゃおうっかな!!

こんな記事を見かけた

https://this.kiji.is/503848730188219489?c=110564226228225532

9歳て。マジか。。。

カテゴリー: できた | タグ: | コメントする

Windows7からWindows10にアップデートした

Windows10にする

いい加減アップデートしないとなー、と思っててちょっと時間ができたのでやってみることにした。なんかもっと手間取るかなーと思ったけど全然だった。勘違いしてたこととして

https://www.microsoft.com/ja-jp/software-download/windows10

ここに

Windows 10 を選択した場合、Enterprise エディション以外のすべての Windows 10 を利用できます。

って書いてあったので、HomeでもProにできるのかなーと思ってたんだけど、そんなことはなく、普通にWin10Homeにアップデートされた。

使ってた大抵のソフトは動くし、特に不具合という不具合はまだ無い。Google日本語入力だけなんか対応してないってなって使えてないぐらいかしら。UIの変更に慣れるかなー?と思ってたのだけど、ClassicShellがそのまま引き継がれたので、それも気にすることがない感じ。

他にやったこと

といってもほとんど無い。クイック起動をタスクバーに設置したぐらい。

https://www.tipsfound.com/windows10/06007

よかよか。こんなだったらもっと早くやっとけばよかった。

カテゴリー: のーと | タグ: | コメントする

Wi-Fiの位置情報を利用すると引っ越し前の位置が表示される+Speed Wi-Fi HOMEの_nomap設定

Wi-Fiの位置情報ズレ

UQWimaxを利用してネットに接続してる。最近引っ越して、スマホでWi-Fi経由でネットに接続すると、GoogleMapアプリなどで位置が引っ越し前の場所に表示される。なんでかなーと思って調べた。

原因

Googleは無線LANのアクセスポイントの位置情報を収集しているそうで、引越し後にその情報が更新されていないため、ということみたい。こわっ。便利なのはいいけど、ちょっと間違うとなんか事故起きそうよね。

問題点を解説してる記事

http://takagi-hiromitsu.jp/diary/20111126.html

対策

アクセスポイントの位置情報を収集しないようにする設定というものがあり(オプトアウト)、それをすることによってスマホでの位置情報取得時に、そのアクセスポイントの位置情報を利用しないようにしてやれば良いみたい。

やってみる(Speed Wi-Fi HOMEの場合)

http://speedwifi.home/html/login.htm

にアクセス。

ログインのユーザー名とパスワードはルーターに書いてある。

設定 > LAN 設定 > セキュリティ設定 2.4GHz

設定 > LAN 設定 > セキュリティ設定 5GHz

を変える。

ここの”SSID1(WPA2/WPA):”ってところの末尾に”_nomap”をつけてあげる。

こんな。あとは適用ボタンを押してちゃんと変わったかどうか確認すればおっけー。SSIDって変えても大丈夫なんだね。

スマホは再接続が必要

SSIDが変わるとスマホで設定してたWi-Fiが切れるので、再度パスワード入れて接続してあげる。パスワードなんだっけと思ったら、ルーターに貼ってあった。そういえばそうだった。

たんとSSIDに_nomapってついてるね。このあとGoogleMap開いてみたら、ちょっと考えたあとにちゃんと正しい位置が表示された。よかったー。

参考

https://support.google.com/maps/answer/1725632?hl=ja

カテゴリー: のーと | タグ: , , , | コメントする

試験勉強用タイマーを作りたい

試験勉強用タイマー

基本情報技術者試験の勉強をしていたときにあったらいいなーと思ったやつを作りたい。

どんな機能がいいかな

基本情報技術者試験は午前と午後で分かれてて、どちらも時間は150分。その内午前は80問、午後は大問7問を解く(平成31年度春期の場合)。だから、午前は1問112.5秒=1分52.5秒、午後は大問1つ約21分で解いてく感じになる。なので、全体の試験時間と、個別の解答時間をお知らせしてくれるようなアプリができればいいんじゃないかなーと。午後試験の時、時間配分が掴めないまま受けたので焦ってしまい大爆死という結果になったので、こういうのがあればちょっとは慣れたんじゃないのかなーと思った。

同じようなやつあるやんけ

と思ったら同じコンセプトのアプリを見つけた。

https://www.aozora-create.com/service/%E8%A9%A6%E9%A8%93%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC

https://play.google.com/store/apps/details?id=com.create.aozora.examtimer

しかもこっちのが俺が思い描いたのより全然高機能だ!なーんだ、あるんじゃん…。

GooglePlayにタイマーはいっぱいある

ほんとにもうこれでもかってぐらいある。単機能タイマーからマルチタイマー、インターバルタイマーなど。そりゃまぁ被るよなって話だ。見つけてないだけで同じようなタイマーはそれこそいっぱいあるんだろうなぁ。と言ってても始まらんので、上の試験タイマーには敵わないにしても作ってみたいから作ってみようと思う。

カテゴリー: したい | タグ: , , , | コメントする

令和!

令和だ!

カテゴリー: のーと | コメントする

いつの間にかサンタレーダーが消されてた

なんでや

削除の理由:  Android 広告 ID の使用ポリシー及び Google Play デベロッパー販売 / 配布契約 4.8 への違反

アプリが個人情報や個人情報や機密情報を扱う場合、有効なプライバシーポリシーを掲載して頂く必要があります。お客様のアプリは Android 広告 ID の収集及び転送を行うことが確認されましたので、プライバシーポリシーを掲載して頂く必要があります。

アプリが Android 広告 ID の収集を行う場合、有効なプライバシーポリシーを Play コンソールの所定の箇所及びアプリ内に掲載して頂く必要があります。プライバシーポリシーの中でユーザープライバシーについて明記し、URL が有効であることをご確認ください。

メールが来てたので見てみると、アプリでなくて、アプリに載せてる広告が個人情報を収集してるからプライバシーポリシーを載せなきゃいけない、みたいなことらしい。

どうすればいいの

必要な対応: プライバシーポリシーをストアの掲載情報及びアプリ内に追加してください

  1. に関するポリシー、ユーザーデータに関するポリシー、Google Play デベロッパー販売 / 配布契約を確認し、アプリを修正します。個人情報や機密情報を要求する場合、上記 Google Play ポリシーに準拠した上で、有効なプライバシーポリシーへのリンクをストアの掲載情報及びアプリ内に掲載して頂く必要があります。
  2. アプリが、デベロッパー プログラム ポリシーに含まれるすべてのポリシーに準拠していることを確認します。再度ポリシーに違反したアプリには追加措置が取られることがあります。
  3. デベロッパー コンソールにログインし、ポリシーに準拠した修正済みの APK をアップロードします。必ず APK のバージョン番号を更新してからアップロードを行ってください。

ということでプライバシーポリシーを作る必要がある。アプリ内にも作んなきゃならんのか…。

プライバシーポリシーを作る

作ったことないし、どんなこと書けばいいのかも分からんちんなところ、こんなサイト

https://app-privacy-policy-generator.firebaseapp.com/

を見つけた。英語だけどこれでいいんじゃないかな。

カチポチして作ったのがこちら。

https://dalomo.net/app/privacy_policy/santaradar_privacy_policy.html

内容わかってないけどいいだろ。

ついでに恵方巻きコンパスのも作った。

https://dalomo.net/app/privacy_policy/ldrc_privacy_policy.html

アプリにリンクを追加する

http://android-note.open-memo.net/sub/text_view__link_text.html

こちらを参考に。

できた。

で、署名付きapkを作ろーと思ったら、パスワード忘れてて

http://sakebook.hatenablog.com/entry/2016/05/03/164415

こちらを参考に探した。あぶねー。

まとめ

再公開はされた

https://play.google.com/store/apps/details?id=net.dalomo.santaradar

みたいなので良かった。これでまた蹴られたらどうしようね。

カテゴリー: のーと | タグ: , , , | コメントする

GoogleSpreadsheet+AppSheetで燃費記録アプリを作った

AppSheet

以前からGoogleSpreadsheetを利用して燃費の記録を取っている。

スマホから入力できるのでまぁいいっちゃいいんだけど、日付だったり燃費の計算だったりが若干めんどくさいからなんかできないかなーと思っていた。

こう、正攻法で行くならば、APIを使ってゴニョゴニョしていく感じになるんだろうなーといろんな記事を見て思ったんだけど

https://qiita.com/InoueDaiki/items/77e5798a4933a2531c13

https://developers.google.com/sheets/quickstart/android?hl=ja

なんのこっちゃ。

という感じなので他の方法を探していたら、アドオンでAppSheetというのを見つけた。GoogleSpreadsheetと連携してアプリを作れるみたい。これは…俺にもできそう?と思ったので使ってみることにした。

ちなみにおんなじようなヤツで、Glideというものがある。

https://www.glideapps.com/

どっちも使ってみたんだけど、どちらかというとAppSheetのほうが好みだった。

データの準備

準備というほどのものでもないが、アドオンをインストールして利用できるようにする。データはもうあるし。

アドオン→AppSheet→Launchといくと右側に

こんなのが現れるのでGO!を押す。そうするとアカウントの紐付け等のステップがあるので、それこなすと

こんな感じの画面になる。

表示とかを編集

これでもう8割方できてるので、気になるところをちょちょいと変える。

リストに表示されてる内容が気に入らんので変えよう。

UX→View→PrimaryViewのViewOptionで、Primary header, Secondary header, Summary columnを変更する。ついでに色も変える。

できた。

新しいデータが上に来てほしいので変えよう。

Sort byを給油日の降順にする。

設定項目がいろいろあって、他にもいろんな事ができるんだろうけど、それはそれぞれ探せばいいと思いました。

使ってみる

https://www.appsheet.com/Template/Apps

に行き、PrototypeAppsの項にさっきのやつがある。

こっからPreviewで行ってもいいし、メールを覗くと

これがおまはんのアプリやで!てなもんでお知らせが来てる。ちなみにAppSheetのアプリを入れないと使えない。アプリ内でアカウントの紐付け等したら…

できーたー。

個別データの編集も

新規データの追加もできる。

すごいなーと思ったのが、日付はちゃんと今日の日付が入ってるしタップするとカレンダーからの入力になる、給油量・走行距離・単価は数値入力になってる(設定で変えれもする)。あと、燃費と合計金額はシート上だと数式が入ってるんだけど、そこもちゃんと認識して入力しないようになっている。

試しに入力してみると、

数式は自動で入力してくれる…!すげー

欲を言えば店舗名と住所はドロップダウンリストと手入力の複合とかになってくれると嬉しかったんだけど、それは無理よね。いや、できるのかもしんないな。

まとめ

とまぁこんな感じで、簡単にアプリが作れた。ただ起動がちょっと遅いのが難点かな。あとこれ作ったからといって記録が楽になったかというとそうでもない気がする。もっと好きなように作るってなるとやっぱAPI使って~とかになるのかなー。でも十分だと思う。すごいなー。

カテゴリー: できた | タグ: , , , , | 1件のコメント