20200703のAndroidに関する記事は3件です。

Androidスマホ・タブレットは何でもできる!Termuxで動かすアレコレまとめ

「使ってないAndroidスマホ,タブレットがある」
「これサーバーにできないかな?」

その夢,かなえられます。

少々めんどくさい作業もありますが,やっていけば必ずできます。

どうやって動かすか

Androidには「Termux」というアプリがあります。
これを使うと,Linuxを動かすことができます。
パッケージもAPTで管理されていて,豊富です。

https://play.google.com/store/apps/details?id=com.termux&hl=ja

また,GBoardなどのキーボードですと不便を感じるかもしれません。
「Hacker's Keyboard」がおすすめです。

https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard&hl=ja

下ごしらえ

Linuxに触れたことのある方は慣れていると思います。

まず,Termuxが端末内のファイルにアクセスできるようにするには権限を与える必要があります。

$ termux-setup-storage

これを実行すると,Android 8以降では権限ダイアログが出ますので許可してください。

Termuxではaptのエイリアスとして「pkg」コマンドが用意されています。

コマンド 説明
pkg update apt updateを実行後apt upgradeを行う
pkg install <package...> apt install <package...>
pkg remove apt remove <package...>

他にもコマンドがあります。pkgだけ実行するとヘルプを見れます。

さっそく,パッケージを最新にします。

$ pkg update

アップデートが完了したら,下ごしらえはおしまいです。

Termuxの基本

ディレクトリ

Termuxの中では,ルートディレクトリは /data/data/com.termux/files/usr になっています。
これは,$PREFIXで表せます。
以下に例を挙げます。

本来のディレクトリパス Termuxでのパス
/etc $PREFIX/etc
/usr/share $PREFIX/share
/bin $PREFIX/bin

エディタ

nanoが標準でついています。

$ nano filename

で起動できます。

よく使うキーボード操作を挙げておきます。

キーボード入力 意味
Ctrl + X 終了
Ctrl + O 保存

使用できるポートの制限

Termuxは 1024~65535 の範囲で使用できます。
80や443などは使えませんので,インターネットに公開する場合はポート変換が必要になる場合があります。

あれこれ

PCからシェルに入る (telnet)

本来はTelnetはネットに公開しちゃいけないものです。ローカルで使うだけにしておきましょう。

$ pkg install busybox

busyboxをインストールしたら

$ busybox telnetd -p 5888

とします。-p 数字はポート番号です。
TeraTermなどで,アクセス可能です。

HTTPサーバーを建てる

パッケージのインストール

Termuxにも apache2 (httpd),nginxパッケージがありますので,インストールできます。
PHPも使いたい場合は,apache2の場合は phpphp-apache が必要です。
nginxの場合は phpphp-fpm が必要です。

【apache2の場合】

$ pkg install apache2 php php-apache

【nginxの場合】

$ pkg install nginx php php-fpm

設定を変える (apache2)

設定ファイルは $PREFIX/etc/apache2/httpd.conf です。

PHPを使う場合,設定の変更が必要です。

$ nano $PREFIX/etc/apache2/httpd.conf

でエディタを起動します。

まず,先頭に ServerRoot "..."という項目があると思います。
その次の行に

HostnameLookups On

を記述します。これは,ログにホスト名を表示させるようにするための設定です。

次に,

LoadModule mpm_worker_module xxxxxxxx

と書いてある行があるはずです。それはコメントアウトします。
代わりに,その行の一つ上にある

#LoadModule mpm_prefork_module xxxxxxx

のコメントアウトを解除します (#を外します)

次に,どんどん下へ行くと DocumentRoot "..."の行が見えてくると思います。
その周辺にある

Options Indexes FollowSymLinks

の行に,ExecCGI を書き足します。書き足すと

Options Indexes FollowSymLinks ExecCGI

となります。
その下の

DirectoryIndex indexうんたら

DirectoryIndex index.php index.html index.htm

に変えます。

最後に,ファイルの一番最後の行に

LoadModule php7_module libexec/apache2/libphp7.so
AddHandler php7-script .php

を追加しておしまいです。
Ctrl+Oで保存するのを忘れずに!

設定を変える (nginx)

httpdより,少し厄介かもしれないですね。

設定ファイルは $PREFIX/etc/nginx/nginx.conf です。

$ nano $PREFIX/etc/apache2/httpd.conf

でエディタを起動します。

まず,

location / {
 ...
}

という行があると思います。その中の

index index.html index.htm;

index index.php index.html index.htm;

にします。

次に

# pass the PHP script ほにゃららら
#
location ~ \.php$ {
 ...
}

という行があると思います。
コメントアウトされているはずですので,その部分すべて外します。

その後,その部分は以下のように置き換えます

location ~ \.php$ {
 root (任意のディレクトリ);
 fastcgi_pass unix:/data/data/com.termux/files/usr/var/run/php-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
}

Ctrl+Xで保存して,エディタを終了します。

次にPHPの設定をします。

$ nano $PREFIX/etc/php-fpm.d/www.conf

でエディタを起動します。

スクロールしていくと, listen = ....という行があります。
そこを

listen = /data/data/com.termux/files/usr/var/run/php-fpm.sock

に書き換えます。
Ctrl+Oで保存して,おしまいです。

httpdを起動

httpdを起動させるには

$ httpd

だけでいいです。何かログを吐きますが特に気にする必要はありません。
止める時は

$ httpd -k stop

または


$ killall httpd

です。

nginxを起動

nginxは

$ nginx

とするだけです。

なお,PHPを使う場合は nginx を実行する前に

$ php-fpm

を実行する必要があります。

止める時は

$ killall nginx

です。

DiscordBot (Python)を動かす

PythonでBotを作ったのであれば,それもTermuxで動かせます。

Pythonは3.8をインストールできます。

$ pkg install python make automake autoconf clang build-essential git

なお,このインストール作業には約500MBを消費します。ストレージに2GB以上の空きがあるか確かめてください。

その後,

$ pip install wheel requests
$ pip install -U "discord.py[voice]"

を実行します。
途中PyNaClのビルドが行われます。スマートフォン・タブレットの性能によっては,完了するまで2~5分かかる場合があります。時間に余裕をもって行ってください。

さきほどgitもインストールしたので,リポジトリからプログラムを下ろしたりできます。

GitHubからプログラムを下ろす

Gitの使い方に慣れている人は説明はいらないと思います。
ということで,事前に使い方を知っているものとしてコマンドを記載します。

$ git config --global user.name "Your Name"
$ git config --global user.email "youremail@example.com"
$ git config --global crediential.helper "cache"
$ git clone https://github.com/xxxx/xxxx.git

botを起動

起動するプログラムがあるディレクトリにいる状態で

$ python filename.py

とします。

Minecraft (PC版) のサーバーを建てる

なんと,TermuxではJavaを動かせます。

さっそくインストールしましょう。
ここでは有志の方のものを使います。なお,OpenJDK 8となります。

$ pkg install wget && wget https://raw.githubusercontent.com/MasterDevX/java/master/installjava && bash installjava

ダウンロードが終わるまで時間がかかるかもしれません。気長に待ちます。
その後,java と打ってヘルプが出てきたら完了です。

server.jar をダウンロードする

サーバーは https://mcversions.net/ からダウンロードできます。
使用法については割愛します。
建てたいバージョンにあったサーバープログラムをダウンロードします。

バージョン URL
1.15.1 https://launcher.mojang.com/v1/objects/4d1826eebac84847c71a77f9349cc22afd0cf0a1/server.jar
1.15.2 https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar
1.16 https://launcher.mojang.com/v1/objects/a0d03225615ba897619220e256a266cb33a44b6b/server.jar
1.16.1 https://launcher.mojang.com/v1/objects/a412fd69db1f81db3f511c1463fd304675244077/server.jar

上のURLをコピーして,

$ cd ~
$ mkdir mcserver
$ cd mcserver
$ wget コピーしたURL

を実行します。
貼り付けは,画面のどこかを長押しして出る「PASTE」を押すとできます。
ダウンロードできたら

$ echo "eula=true" > eula.txt
$ java -jar server.jar

とします。
いろいろログが出て,ワールドの生成が行われます。
あまりにも性能が低いと,クラッシュする場合がありますので注意してください。

また,Android 8以降ではこのままだと

$ java -jar server.jar
Bad system call
$

となってしまいますので,このコマンドを実行する前に

$ proot -0

を実行してください。

おわりに

いかがでしたか?結構できること,ありましたね。
ネットにはもっと詳しいことが書いてありますので,ぜひ挑戦してみてください。
それではよいTermuxライフを!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flutter辞書

Widget

ー部品

Constraint Programming

ー制約プログラミング

「問題を制約の集合として記述してコンピュータに与えると、コンピュータが制約を充たした答を見つけてくれる」

ことを目指すプログラミング・パラダイムのことだと言えます。

Sandbox

コンピュータセキュリティ技術において、サンドボックスは、外部から受け取ったプログラムを保護された領域で動作させることによって、システムが不正に操作されるのを防ぐセキュリティ機構のこと

ただの英和辞典

  • anatomy:解剖学
  • emulate:模倣する
  • deploy:展開する
  • configure:構成・機能
  • resource hog: A computer function that slows processing time.

その他

  • みてから自分でやってみよう
  • ノートをとるのはありだよ
  • 動画は飛ばさない
  • わからないことがあれば自分でググってみて、そのあと少し時間をおいてから見直すといいよ
  • The most improtant thing is "Practice"
  • 映画に出てくるような天才ハッカーはいない、エンジニアはその時間の90%は、画面を見つめてるだけ→そういうときはGoogleとstack over flowに頼ろう!
  • Struggle is Good!

【The Complete 2020 Flutter Development Bootcamp with Dart】
にてわからなかった単語を抽出

そん他技術的なこと

  • 10.15以降のCatalinaならシェルの変更を

→AppleはmacOS Catalinaにおいてデフォルトのインタラクティブシェルをbashからzshに変更した。macOSとLinuxの双方を普段使いしているのであれば、macOSに合わせてLinuxのデフォルトシェルをzshに変更するのも1つの手と言える

-Piが出てこない問題

リソース

【トラブルシューティング】

【コースが出してる参考資料が詰まったGitHub】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Kotlin】onClickListenerのパターンとその使い分け方

はじめに

 この記事では私がインプットしたonClickListenerの3つの記法と、そのメリットデメリットを記しています。今回記していくのは3パターンですが、私が恣意的にチョイスしただけで、この3つが全てを網羅している事など無いので悪しからず。

一つ目:クラス全体に掛かるインターフェースを用いる

 MainActivityに実装すると仮定したとき、クラス自体にView.OnClickListenerのインターフェースを参照します。

class MainActivity : AppCompatActivity(), View.OnClickListener {

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button1.setOnClickListener(this)
    }

     override fun onClick(v: View) {
        val b = v as Button
        textView.text = "${b.text} is pushed"   
    }
}

この方法のメリットは、インターフェースから実装するのでミスが減るという事と、冗長なボタン処理をonCreate内に書かずに済むという事、複数のボタンに同じ処理を簡単に実装する事などが挙げられます。ボタンごとに異なる処理を書かないといけないときなどは、かえって分かりにくくなる場合もあるので、考えて使う必要があります。

二つ目:個々のボタンにメソッドを実装する

 各ボタンにsetOnClickListenerメソッドを実装する方法です。

class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button2.setOnClickListener {
            val b = it as Button
            textView.text = "${it.text} is pushed"
        }
    }
}

この方法は、複数個のボタンのそれぞれに全く異なる処理を実装させるときに便利です。各ボタンそれぞれに処理を書いていくので、処理が同じ複数のボタンがあるときには向きません。また、各ボタンについて書いていくので、全体としてコードが冗長になりがちです。

三つ目:変数に処理を代入する

 ある変数にView.OnClickListenerを介して処理を実装します。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val listener = View.OnClickListener {
            val b = it as Button
            textView.text = "${b.text} is pushed"
        }
        button3.setOnClickListener(listener)

    }

今回はlistenerという変数に処理を記述し、setOnClickListener(listener)でボタンに適用させています。この方法のメリットは、複数個のボタンに同じ処理を適用させやすい事や、そういったケースが複数種類あるときも簡潔に記述できる事にあります。しかし、処理が複雑になるとonCreate内が冗長になってしまうというデメリットがあります。

さいごに

 今回は以上三つの方法と、そのメリットデメリットについてまとめました。勿論、細かい記法を変えることでさらにスマートに記述できるかもしれませんが、分かりやすさも兼ねてあの状態で記しておきます。意外とクリック処理を体系的にまとめている記事が無かったので、お役に立てれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む