似非プログラマーの雑多な日記

似非プログラマーの雑多な日記

「継続は力なり」の実証実験してます

【Mac m1 Big Sur】R & RStudio をAnaconda経由でインストールする

MontereyがリリースされたばかりですがBig Surの話題。
R及びRStudioをインストールして使えるようにするのにかれこれ2時間くらいネットを徘徊することになったので備忘録として残します。

アプリからインストールできない

せっかくAnaconda-Navigatorというものがあるのに当のアプリケーションからRStudioをインストールしようとしてもできないっていう困ったことがおきました。やれやれやーれ、と思ってネットで調べると似た事象が起きたという人がちらほら。
原因がさっぱりわからなかったためアプリからのインストールは断念し、コマンドからインストールする方法にシフトしました。
ちなみに私が持っているWindowsMacはどちらもアプリからのインストールはできませんでした。

condaコマンドでインストールする

前提条件

  • R及びRStudioはどちらもインストールしていないこと
    →anaconda経由ではなく個別でインストールしているとパスの設定が面倒。
  • Anacondaは事前にインストール済みでconda activateしている状態であること
    →してなかったらあとですればいい話ですが。

次のコマンドを順に実行するだけ。

$ conda install r-essentials
$ conda install -c r Rstudio
$ conda install -c r r=3.6.0

# Proceed([y]/n)? が出てきたら全部y

# 上記の方法で無理だったら追加で以下のコマンドも試す
#$ conda install r-base
#$ conda install r-irkernel

以上

【Unity】初心者がUnity Editor上で地図を表示する

GoogleのMaps Static APIを使用してUnity Editor上で地図を表示してみる。

1.環境

PC

MacBook Air M1

Unity

バージョン:2019.4.20f1

2.コード全容

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class GoogleMapTile : MonoBehaviour
{
    // Google Maps API Staticmap URL
    string API_KEY = "自分のAPIキー";    
    string STATIC_MAP_URL = "https://maps.googleapis.com/maps/api/staticmap?";

    // オプションでURLに付加するパラメータ
    public string center = "";
    public string zoom = ""; 
    public int size;
    public string maptype = "";
    public string markers = "";
    public string format = "";
    public string sensor = "";

    // centerに指定するためのもの //
    // 経度
    public float longitude ;
    // 緯度
    public float latitude;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(getStaticMap());
    }

    // Update is called once per frame
    void Update()
    {
        // ただ固定の地図を表示するだけだから特になし
    }

    IEnumerator getStaticMap()
    {
        var req = UnityWebRequestTexture.GetTexture(STATIC_MAP_URL + 
                                                   "center=" + longitude + "," + latitude + 
                                                   "&zoom=" + zoom + 
                                                   "&format=" + format + 
                                                   "&sensor=" + sensor + 
                                                   "&size=" + size + "x" + size + 
                                                   "&maptype=" + maptype +
                                                   "&key=" + API_KEY);
        // リクエスト実行
        yield return req.SendWebRequest();
 
        if (req.error == null)
        {
            GetComponent<Renderer>().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture;
        }
    }
}

3.実行結果

なぜかデフォルトだと地図が180度回転して表示されるため、InspectorウィンドウでTransform.Rotation.Yを180に設定している。Transform.Position.Yを10に設定しているのは地図を大きく見せるため。
※ 画像ではGoogleMapTileスクリプトが複数あるが1つあればいい。

f:id:captaindream0502:20211113191650p:plain
キャプチャ1

スクリプト内でpublic宣言した変数はInspectorウィンドウで任意のパラメータを設定することができる(赤枠内)。
今回は画像の通りにパラメータを設定して実行。

f:id:captaindream0502:20211113193952p:plain
キャプチャ2

4.コード解説

ポイントの部分だけをかいつまんで解説する。

URLの指定

Google Maps Static APIの利用にはGoogle Cloud Platform(GCP)へのアカウント登録が必要である。登録後、自分のAPIキーを確認し、API_KEYの部分に代入する。

// Google Maps API Staticmap URL
string API_KEY = "自分のAPIキー";    
string STATIC_MAP_URL = "https://maps.googleapis.com/maps/api/staticmap?";

経度・緯度について

経度、緯度はcenterの値として使用する。地図の取得には経度、緯度の情報が必要不可欠である。今回はGoogle Maps API Staticmap公式ページの経度37、緯度-122をそのまま使用した(面倒だから小数点以下は切り捨てた)。
国、あるいは都市によっては、centerにその名称を指定する方法でも地図の取得は可能なようだ。

/* centerに指定するためのもの */
// 経度
public float longitude ;
// 緯度
public float latitude;

非同期処理での実行

StartCoroutine(class in UnityEngine.MonoBehaviour):Unityの公式Scripting API
コルーチンの開始。非同期処理(≒並行処理)のことを言うらしい。IEnumeratorで定義された関数が、非同期処理として動かすことができる。

StartCoroutine(getStaticMap());

リクエストの定義

UnityWebRequestTexture(class in UnityEngine.Networking):Unityの公式Scripting API
ネットワークと通信して画像を取得するくらいのニュアンス。GetTextureはTextureの作成。

var req = UnityWebRequestTexture.GetTexture(STATIC_MAP_URL + 
                                           "center=" + longitude + "," + latitude + 
                                           "&zoom=" + zoom + 
                                           "&format=" + format + 
                                           "&sensor=" + sensor + 
                                           "&size=" + size + "x" + size + 
                                           "&maptype=" + maptype +
                                           "&key=" + API_KEY);

取得した画像をタイルテクスチャに設定

GameObject.GetComponent:Unityの公式Scripting API
このスクリプトがアタッチされているゲームオブジェクトのコンポーネント(Inspectorに表示される各種設定)を取得。今回はPlaneにWEBリクエストで取得した画像をタイルテクスチャとして設定する。

GetComponent<Renderer>().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture;

 

本来は位置情報を組み合わせてユーザの位置とともに地図を更新する処理を組みたいところだが、なかなか難易度が高く、まずは固定地図の表示ということでやってみた。

以上

【Unity】Mac m1からAndroidの実機にアプリをビルド&デプロイする

※ 2021/10/24時点の情報。

Mac m1上のUnityでAndoridアプリをビルド、実機にデプロイするときに躓いたことの備忘録。

1. 環境

PC

MacBook Air M1

Unity

バージョン:2019.4.20f1

Android

端末:Xperia XZ1 SO-01K

バージョン:9

2. Androidの設定

  1. Android端末とPCをUSB接続する
  2. 開発者オプションを開く
  3. [デバッグ]→USBデバッグをオンにする
  4. [ネットワーク]→デフォルトのUSB設定をファイル転送にする
  5. 「コンピュータにドライバをインストールしますか?」的な文言が出てきたら「はい」。PC側でドライバの設定を行う。無ければスルー
    ※今回はソニーのドライバがPCにインストールされたため設定した

3. Unityの設定

  1. メニューバー[File]→「Build Settings...」
  2. PlatformでAndroidを選択
  3. Run DeviceでUSB接続しているAndroidを選択
  4. Scenes In BuildにAdd Open Scenesから任意のシーンを追加
  5. Build And Run

以上

【Bash】job_spec [&]

Bashの組み込みコマンド「job_spec [&]」を解説

job_specとは?

job_specはコマンドもしくはジョブ番号を指す。job_specというコマンドが存在するわけではない。

jobsコマンドを実行すると現在実行されているジョブを表示することが出来る。

f:id:captaindream0502:20210925131715p:plain

使用方法

適当に無限ループのシェルスクリプトを用意して試す。

f:id:captaindream0502:20210925132908p:plain
3秒毎にHelloと出力するスクリプト

フォアグラウンドでジョブを実行する

(=^·ω·^=) $ %1
f:id:captaindream0502:20210925131820p:plain
実行例

バックグラウンドでジョブを実行する

オプションでアンパサンド(&)を指定するとバックグラウンド実行することが出来る。

(=^·ω·^=) $ %1 &
f:id:captaindream0502:20210925131833p:plain
実行例

なお、ジョブ番号ではなくコマンドを実行した場合はフォアグラウンド実行、「&」を指定するとバックグラウンド実行となる。

sekaiwoshiritai.hatenablog.com

以上

【Bash】組み込みコマンド一覧

Bashの組み込みコマンドを全部試したいもの好き(自分)へ。

環境

組み込みコマンド一覧

# コマンド
1 job_spec [&]
2 (( expression ))
3 . filename [arguments]
4 :
5 [ arg... ]
6 [[ expression ]]
7 alias [-p] [name[=value] ... ]
8 bg [job_spec ...]
9 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function または readline-command]
10 break [n]
11 builtin [shell-builtin [arg ...]]
12 caller [expr]
13 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
14 cd [-L|[-P [-e]] [-@]] [dir]
15 command [-pVv] command [arg ...]
16 compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
17 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
18 compopt [-o|+o option] [-DE] [name ...]
19 continue [n]
20 coproc [NAME] command [redirections]
21 declare [-aAfFgilnrtux] [-p] [name[=value] ...]
22 dirs [-clpv] [+N] [-N]
23 disown [-h] [-ar] [jobspec ... | pid ...]
24 echo [-neE] [arg ...]
25 enable [-a] [-dnps] [-f filename] [name ...]
26 eval [arg ...]
27 exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
28 exit [n]
29 export [-fn] [name[=value] ...] または export -p
30 false
31 fc [-e ename] [-lnr] [first] [last] または fc -s [pat=rep] [command]
32 fg [job_spec]
33 for NAME [in WORDS ... ] ; do COMMANDS; done
34 for (( exp1; exp2; exp3 )); do COMMANDS; done
35 function name { COMMANDS ; } または name () { COMMANDS ; }
36 getopts optstring name [arg]
37 hash [-lr] [-p pathname] [-dt] [name ...]
38 help [-dms] [pattern ...]
39 history [-c] [-d offset] [n] または history -anrw [filename] または history -ps arg [arg...]
40 if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
41 jobs [-lnprs] [jobspec ...] または jobs -x command [args]
42 kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... または kill -l [sigspec]
43 let 引数 [引数 ...]
44 local [option] name[=value] ...
45 logout [n]
46 mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
47 popd [-n] [+N | -N]
48 printf [-v var] format [arguments]
49 pushd [-n] [+N | -N | dir]
50 pwd [-LP]
51 read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
52 readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
53 readonly [-aAf] [name[=value] ...] または readonly -p
54 return [n]
55 select NAME [in WORDS ... ;] do COMMANDS; done
56 set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
57 shift [n]
58 shopt [-pqsu] [-o] [optname ...]
59 source filename [arguments]
60 suspend [-f]
61 test [expr]
62 time [-p] pipeline
63 times
64 trap [-lp] [[arg] signal_spec ...]
65 true
66 type [-afptP] name [name ...]
67 typeset [-aAfFgilnrtux] [-p] name[=value] ...
68 ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
69 umask [-p] [-S] [mode]
70 unalias [-a] name [name ...]
71 unset [-f] [-v] [-n] [name ...]
72 until COMMANDS; do COMMANDS; done
73 wait [-n] [id ...]
74 while COMMANDS; do COMMANDS; done
75 { COMMANDS ; }

以上

【競プロ(AtCoder)】ABC044 : B - 美しい文字列 / Beautiful Strings《C++ ver.》

f:id:captaindream0502:20210810000601p:plain
C++_logo

ABC044:B - 美しい文字列 / Beautiful StringsをC++で解いたときの解答。

1. 問題

問題文
wを、英小文字のみからなる文字列とします。wが以下の条件を満たすならば、wを美しい文字列と呼ぶことにします。
  • どの英小文字も、w中に偶数回出現する。
文字列 w が与えられます。w が美しい文字列かどうか判定してください。
制約
  • 1≤∣w∣≤100
  • wは英小文字(a-z)のみからなる文字列である

2. 解答

#include <iostream>

using namespace std;

int main(){

    string w;
    cin >> w;

    sort(w.begin(), w.end());
    
    int count = 0;
    bool flag = true;

    for(int i = 0; i < w.size(); i++){
        if(i > 0 && w[i] != w[i-1]){
            if(count % 2 != 0){
                flag = false;
                break;
            }
            count = 0;
        }
        count++;
    }

    if(flag == true){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
}

3. 所感

ゴリ押しの解法で我ながら実装が綺麗じゃない。iostreamしか使っていない(実際にはstringとかも使われている)分ある意味綺麗な実装ではある。

以上

【AWS】MacBookでEC2にSSH接続する方法

たまにしか使わず忘れてしまうため備忘録として残す。

コトの発端はこれ

時代の流行りに乗るためにAWSでサーバ構築しようと思ったのに入れないじゃん...

ssh: connect to host <IPアドレス> port <Port番号>: Connection refused

SSH接続するための準備

EC2インスタンスは任意の設定で作成済みであることが前提として話を進める。ちなみに勉強用に使うだけならほぼデフォルトの設定で問題ないと思っている。
SSH接続する時のポイントは「キーペア」と「セキュリティグループ」。あとあと確認or変更するから頭に入れておくといい。

f:id:captaindream0502:20210907005559p:plain
EC2ダッシュボード

で、まずはMacのターミナル開いてホームディレクトリに「.ssh」というディレクトリを作る

(=^・ω・^=) ~ % mkdir .ssh

作成したディレクトリにインスタンスと一緒に作成したキーペア、「<キー名>.pem」を入れる。すでに作成済みのキーペアをインスタンスに設定した場合はそれ。

さあ、接続してみよう

準備が済んだらターミナルのメニューバー的なところ「シェル→[新規リモート接続]」をクリックする

f:id:captaindream0502:20210907010452p:plain
新規リモート接続

下記の画面が表示されたら「セキュアシェル(ssh)」を選択。上から2つめの長い赤枠に接続時のコマンドを入力する

f:id:captaindream0502:20210907074749p:plain
セキュアシェル

接続時のコマンドは下記

ssh -i ~/.ssh/<pemファイル> <ユーザ名>@<EC2のPublic DNS (IPv4)もしくはIPv4 Public IP>

例えば、.sshディレクトリに置いたpemファイルの名称が「secret_key.pem」、ユーザ名が「madao」、IPv4 Public IPが「100.1.2.30」だったら

ssh -i ~/.ssh/secret_key.pem madao@100.1.2.30

IPv4 Public IPで入れなかったらPublic DNS (IPv4)を指定するといい。

チクショー、接続できない

これまで説明した通りにやっても接続できない時は、インスタンスに設定されている「セキュリティグループ」のポートが開放されていることを確認する。

  1. セキュリティグループのインバウンドルールを編集
  2. タイプ「SSH」をルールに追加
  3. ソースに「マイIP」を選択し、編集内容を保存。

f:id:captaindream0502:20210907230157p:plain
セキュリティグループ

再度、ターミナルからSSH接続を行うと接続できるはずだ。
ただし、この方法だと自分の居場所が変わる or Wi-Fi接続が変更される度にセキュリティグループの設定を更新する必要があるため、頻繁に自分のPCからSSH接続する場合は別途設定が必要。

以上