2lu3のエンジニア技術アウトプット

AI,深層学習,機械学習,RescueSimulation,RoboCupJunior,neovimについて解説しています

消せないAndroidアプリをadbを使って強制アンインストール

前提

adbコマンドを実行できることが前提です。

また、開発者モードをOnにして、USBデバッグモードでPCに接続してください。

スマホに接続する

adb shellを実行して、スマホに接続します。

削除したいアプリのpackage名を調べる

am monitorを実行する。

am monitorは、起動するアプリをリアルタイムで把握するコマンドです。

HWPOT-Hスマホの機種によって変わると思います。

HWPOT-H:/ $ am monitor
Monitoring activity manager...  available commands:
(q)uit: finish monitoring

am monitor を実行した後、アンインストールしたいアプリを起動することで、下のようになります。

HWPOT-H:/ $ am monitor
Monitoring activity manager...  available commands:
(q)uit: finish monitoring
** Activity starting: com.android.calculator2

今回は、最初から入っている計算アプリを消そうとしています。

この、com.android.calculator2というpackage名をどこかに記録しておいてください。

そして、qを押してからエンターをおすことで、am monitorを終了し、次のコマンドを入力できるようになります。

アプリをアンインストールする

pm uninstall com.android.calculator2を実行します。(com.android.calculator2は削除したいアプリのpackage名に置き換えてください)

そうすると、そのアプリをアンインストールすることができます。

備考

DELETE_FAILED_INTERNAL_ERROR1が発生する場合

pm uninstall -k --user 0 package名pm uninstall package名の代わりに使用する。

機械学習についてのなぐり書き

AIについて僕が持っていることについてまとめます。

言語・ライブラリ

言語

Pythonが非常に有名かつ主流

RubyやGoで機械学習をするという話も聞いたことはある

ライブラリ

  • TensorFlow
    • Google
    • PyTorchと同じくらい使われている
  • PyTorch
    • Facebook
    • TensorFlowと同じくらい使われている
  • Keras
    • TensorFlow、CNTK、Theanoのラッパー
    • Kerasの本家と、TensorFlowにカスタマイズしたKerasがある
    • TensorFlow使うなら、TensorFlowのKerasを使うと良い

実行環境

Colaboratory

自前のGPU/TPU用意するより、Colaboratoryのほうが便利

本業で機械学習やる場合はまた別

有料版のColaboratory Proもある

GPU・TPU

TPUは小数の計算の精度を犠牲にして速くしている

迷ったらTPU使えば良い

TPUの凄さは、記事にもなっている。

Google ColaboratoryのTPUを試してみる

機械学習の手法

(狭義の)機械学習

機械学習の手法を挙げます。

LightGBM

LightGBM 徹底入門 – LightGBMの使い方や仕組み、XGBoostとの違いについてがわかりやすい。

非常によく使われていて、しかも奥が深い。

分析問題に対しては、後述する深層学習よりも精度が上になることが多い。

XGBoost

LightGBMより前に開発されたLightGBMと同じようなもの。 初心者に限って言うなら、XGBoostを使うならLightGBMを使ったほうが良さそう。

sklearnのモデル選択方法

状況に合ったモデルを選ぶための図 割と参考になる

  • classification

    • 教師あり学習・分類
    • 予め、このデータはAというように分類されている
    • 例:写真を入力したら猫か犬か判定するAI
  • regression

  • clustering

    • 教師なし学習・分類
    • データが与えられ、そのデータを分類する
    • K-means法とかが有名
  • dimensionality reduction
    • 次元削減
    • データの特徴を、より少ないバイト数で表現できるようにする
    • 深層学習の中間層を用いて次元削減するという話を聞いたこともある

Move mouse over image

引用元サイト

深層学習(ディープラーニング)

画像認識など、分析以外のタスクが得意

分析問題を解くときも、アンサンブルとして使うことが多い

深層学習で使う関数たち

詳しくは、絵やグラフつきのサイトがわかりやすい。

  • 最適化関数
    • 学習の進め方を決める関数
    • Adam, RMSpropなど
  • 活性化関数
    • 一つ前の層からきた値を、出力するために使う関数
    • sigmoid, tanh, relu, softmaxなど
      • softmaxは分類のときに出力層に使うことが多い
    • Kerasの公式ドキュメントにいろいろな活性化関数がある
  • 損失関数
    • 目標とする出力との違いを数値化する関数
    • この関数の値をもっとも小さく(または大きく)するように学習が進む
      • 学習の方向は最適化関数が決める
    • 基本的な使い分けはこのサイトがわかりやすい
  • 評価関数
    • 深層学習では、1度だけではなく、何度も何度も学習を繰り返す
    • 1回の学習ごとに今のスコアを表示する
    • 評価関数は学習自体には何の影響もない
      • 人間が、学習中もスコアを確認できるようにしているだけ
    • 損失関数は計算したスコアを学習に利用するが、評価関数は計算したスコアを学習に使わない
      • つまり、評価関数と損失関数はほぼ同じもの
    • accuracy, f値などがある
      • accuracyは複数ラベルの分類には使えない

深層学習でのパラメーター

  • batch size
  • ニューロン数(ノード数)・隠れ層数
    • 小さすぎると精度は低くなる
      • モデルが、データセットの複雑さに対応するだけのキャパシティがない
    • 大きすぎると精度は低くなる
      • モデルが大きすぎると、非常に複雑なデータセットに対応できる
      • 逆に、データ一つ一つに対して過学習する
      • イメージとしては、
        • 目標:画像を猫と犬に分類する
        • 理想:猫耳があれば猫、犬耳があれば犬と判定する
        • 現実:この生き物は猫、この生き物は犬と判定する
      • つまり、データの共通の部分を見つけなくても、このデータはこうだ、とおぼえてしまうだけのキャパシティを持つ
  • Drop Out
    • 過学習を防ぐために使う
    • 0.25~0.5ぐらいがよい

GAN(敵対的生成ネットワーク)

  • 本物そっくりの画像を生成する人工知能 Aさん
  • Aさんの画像と本物とを見分ける人工知能 Bさん

Aさんは、Bさんを騙せるようにがんばります

Bさんは、Aさんに騙されないようにがんばります

お互いに切磋琢磨しあって、結果的にAさんの生成した画像は本物と見分けがつかないレベルになります

詳しい説明は下の参考サイトに譲ります。

参考サイト:今さら聞けないGAN(1)基本構造の理解

その他

アンサンブル

複数のモデルを使って最終的な出力を出すこと。

例えば、LightGBMとディープラーニングなど

Optuna

ハイパーパラメータチューニングを自動で行ってくれます

かなり便利です

学習手段

  • Kaggleで勝つ!
    • とりあえず読む
  • 詳解 ディープラーニング
    • Tensorflow1.0のときのものなのであまり...
    • 内容は詳しいし、わかりやすい
  • Androidアプリ開発の教科書
    • 基本的なやり方がよく分かる
    • Androidアプリを作り始める人にはオススメ
    • 実践的にアプリを作ろうとすると足りない
  • Cクイックリファレンス
    • 辞書的な使い方で役に立つ
    • メジャーアップデートが来るとかいう噂を聞く
  • C言語総合講座15講
    • 理論編しか読んでいないが、下のprogramming place plusで足りない知識が身についた
  • プログラミングコンテストチャレンジブック
  • プログラミングの宝箱 アルゴリズムとデータ構造
  • アルゴリズムデザインアルゴリズムイントロダクション
    • アルゴリズムの辞書
    • 初めて読んだとき、両方とも数学の知識がないと手も足も出なかった(当時中3)
    • それ以来読んだことはない
  • 理科系の作文技術
    • 論文だけでなく、文章を書く上で非常に役に立つ
    • 絶対読むべき
  • 数学文章作法
    • 数学ガールの人が著者らしい
    • こちらも理科系の作文技術と同じくらい読んだほうが良い

サイト

全体

  • Qiita
    • 困ったらここに行けばいい
  • Teratail
    • エンジニア版のyahoo知恵袋
  • Progate
    • プログラミング初心者が学ぶのには良いと思う
    • 既に他の言語をマスターしていて、新しく言語を学ぶには冗長すぎる

Android

  • 公式リファレンス

    • 正確で手厚いが、情報量が多いので慣れるまでは解説サイトを見たほうが良い
  • nyan のアプリ開発

    • メジャーな機能についてはだいたい解説されている
    • サンプルコードもほとんど動く

Python

  • 検索するとだいたい出てくる
    • 特定のサイトを使うことはあまりない

C/C++

Kaggle

コミュニティ

  • kaggle-ja@slack
    • kaggleのコミュニティで、初心者が簡単に質問できる

ConohaでVPSサーバーを借りてApache2でウェブサーバーを構築!

VPSサーバーを借りて、ウェブサーバーを構築する手順について説明します!

前提

Windows 10 PCのsshは設定済み

この記事は現在進行系で開発中です。

単語説明

VPS

サーバーを借りるのには、いくつか種類があります。

名称 料金 管理者権限 主な使用用途
共用サーバー 安い X ブログ
VPS 普通 O プログラミング・サービス提供
専用サーバー 高い O 本格的なサービス提供

共用サーバー

  • 1つのサーバーを複数人で共有する
  • 管理者権限なし
    • ソフトを新しくソフトをインストールできない
  • ブログを公開する、ファイルを保存するといった用途がメイン
  • 処理時間の長いプログラムを実行すると止められる
  • 同じサーバーの他の人の使用状況によって、自分の使えるリソースが変わる
    • 例えば、他の人が10万PVのブログを運営していたら、自分のサーバーの処理が遅くなる

VPSサーバー

  • 1つのサーバーの中に仮想的に複数のサーバーを作成する
  • (割り当てられた仮想サーバーの)理者権限あり
    • ソフトのインストールが可能
  • メモリが予め割り当てられている
    • 性能が他の人の使用状況に左右されにくい

専用サーバー

  • サーバー丸々借りる
  • サーバー全体の管理者権限を持つ
    • 好きなように何もかもいじることができる
  • 性能は常に保証される

今回は、VPSサーバーを使用します。

アカウント登録

conohaのVPS公式サイトから、アカウント登録をします。SMS認証が必要です。

ssh通信するまで

VPS追加画面

下のように設定します。

パソコンのメモリは16GBとかありますが、サーバーは1GBでも機械学習とかしない限り大丈夫です。

リージョン(サーバーの場所) 東京
メモリ 1GB
OS Ubuntu

f:id:tlaloc:20200306150143p:plain

メモること

  • 逆引きホスト名(またはIPアドレス)
  • (サーバー追加したときに登録した)rootパスワード

とりあえずsshして初期設定

設定する内容は、以下の通り。

  • 通常のログイン用のユーザーを作成する
  • rootユーザーでログインできないようにする

通常のログイン用のユーザーを作成する

ssh root@上でメモした逆引きホスト名
// ユーザーの追加
sudo adduser 好きなユーザー名(今回はtlaloc)
// パスワードなどを聞かれるので入力

// ユーザーに管理者権限を付与
sudo gpasswd --add ユーザー名(今回はtlaloc) sudo

windowsから簡単にsshできるようにする

sshで公開鍵を作っていない人は、ssh-keygenでググってください。

Windowsの設定をする

Windows側の.ssh/configに以下のように記載

Host conoha
  HostName 上でメモしたホスト名
  User 上で作成したユーザー(今回はtlaloc)
  Port 22 (後で変更しますが、最初は22です)
  IdentityFile ~/.ssh/id_rsa(自分のid_rsaの場所に置き換えてください)

サーバー側の設定をする

Windows以下のコマンドを実行する。パスワードを聞かれるので、上でメモしたパスワードを入力します。

[注意点]

  • .ssh/id_rsa.pubは、id_rsa.pubへの相対pathを指定してください。
  • conohaは、.ssh/configHostで設定した名前です。
  • パスワードを聞かれるので入力してください
scp .ssh/id_rsa.pub conoha:~/.ssh/authorized_keys

これは、Windowsid_rsa.pubというファイルを、サーバーの~/.ssh/authorized_keysにコピーする操作です。

試してみる

ssh conoha

パスワードを聞かれることなくログインできたら成功です。

初期設定

セキュリティ関連

最低限することは、 * rootログインの拒否 * パスワード認証の無効化 * 使わないポートを閉じる

rootでログインできないようにする。

sudo vi /etc/ssh/sshd_config

yesをnoに変更

// 変更前: PermitRootLogin yes
PermitRootLogin no

これ以降(少なくともこの記事の範囲では)rootのパスワードを使用することはありません。 これより下でパスワードというときは、adduserで追加したユーザーのパスワードを指します

注: 何らかの原因で、作成したユーザーでログインができなくなったとき、conohaのコンソールからログインするときに使用するかもしれません。なので、rootのパスワードはどこかに保存しておいたほうが良いでしょう。

パスワード認証を許可しないようにする

sudo vi /etc/ssh/sshd_config
PasswordAuthentication no
// 変更前: #PasswordAuthentication yes

使わないポートを閉じる

// ufw の起動
systemctl start ufw

// ufwの有効化
sudo ufw enable

// sshに使うportのみ許可
// 空いている49152番から65535番の中から選ぶ
// この番号はどこかにメモっておいたほうが良い
sudo ufw allow 49157

// 追加した番号が許可されているか確認する
sudo ufw status

// 出力結果
To                        Action     From
--                         ------      ----
49157                  ALLOW   Anywhere
49157 (v6)           ALLOW   Anywhere (v6)

// 許可したport以外からは拒否する
sudo ufw default deny

// sshを受け入れる番号を変更する
sudo vi /etc/ssh/sshd_config

Port 49157
// 変更前: #Port 22

この状態で、先程の自分のPCの.ssh/configの中のポート番号を必ず新しいものに変更してください。

変更の反映

// sshを管理するソフトの再起動
service ssh restart

入れるかテスト

ssh conohaして入れるかどうか確かめてみましょう。 成功するまでは、すでに接続しているsshは切断しないようにしてください。

pyenv

複数のバージョンのpythonを使えるようにします。

pyenvを使わない場合、(例えば)3.6.9のバージョンのpythonしか使えません

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
source ~/.bash_profile
sudo groupadd developer
sudo gpasswd --add tlaloc developer
sudo visudo
// 以下を書き込む
Defaults exempt_group="developer"

sudo apt update -y
sudo apt upgrade -y
// Pythonのインストールに必要なライブラリー
sudo apt install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev -y

virtualenv

pyenvでは、複数バージョンのpythonを使えるようにしました。

virtualenvでは、フォルダごとにpythonにインストールしたライブラリを保存することが可能です。

git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile

Pythonのインストール&使用

このサイトを参考にしてください。

neovim

neovimのインストール

3.8.3は好きなバージョンに変更することが可能です。

pyenv install 3.8.3
pyenv virtualenv 3.8.3 neovim3
pyenv activate neovim3
pip3 install pynvim -y
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update -y
sudo apt upgrade -y
sudo apt install neovim -y

deinのインストール

curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh ~/.cache/dein
rm installer.sh

サーバーとして使えるように

現在執筆中

apache2のインストール

UbuntuとApacheでウェブサーバを立てる

phpのインストール

PHP 7.4 を Ubuntu 18 / 19 などにインストールする方法 PHPのリリース日とサポート期限

https

Ubuntu 18.04でApacheの自己署名SSL証明書を作成する方法

【apache】conohaのUbuntu18.04にLet's EncryptでSSL設定するまで

その他

  • ssh-keygen -t rsa -b 4096 -C ""sshキーを作成(""内はメールアドレス

その他便利な設定

ファイルの検索で大文字小文字を検索しない

~/.inputrcに以下を記述

set completion-ignore-case on

コマンド一挙コピペ用

現在作成中

参考サイト

SambaでUbuntuのフォルダをWindowsから操作!(共有フォルダ)

Sambaを使ってUbuntuのフォルダにWindowsからアクセスできるようにします。 UbuntuのフォルダとWindowsのフォルダが同期して、どちらからでも簡単にフォルダをコピーできるようにします。

環境

Windows 10 Ubuntu 18.04 2020/02/28時点

やること

UbuntuのフォルダをWindowsに共有するやりかたを解説します。

Ubuntu

Sambaのインストール

Ubuntusshでログインしてください。 直接、Ubuntuの端末でコマンドを打ち込んでも大丈夫です。

sudo apt update
sudo apt upgrade
sudo apt install samba

共有フォルダを作成

# 好きな場所にフォルダを作る
mkdir /home/secureshare
sudo chmod 777 /home/secureshare

Sambaの設定

sudo 好きなエディタ(nvimなど) /etc/samba/smb.conf

で、設定ファイルを開き、下のように変更する。

[global]
  min protocol = SMB2
  max protocol = SMB2
  client max protocol = NT1

  // コメントアウトされているので、コメントインしますj
  interfaces = 127.0.0.0/8 Windows(共有される方)のIPアドレス/24

// 最終行に書き加えます
[Share]
  browseable = yes
  writeable = yes
  path = /home/share
  create mode = 0770
  directory mode = 0770
  guest ok = no
  // secureshareというグループにのみファイル操作を許可します
  valid users = @secureshare

sambaにログイン用のユーザーを登録します

sudo useradd sambalogin
sudo pdbedit -a sambalogin

と入力し、passwordを設定します(ubuntuのアカウントのパスワードとは違うほうが良いです)

成功すると、下のような画面が出てきます(右側にアカウント情報が書かれていますが、あえてカットしています)

f:id:tlaloc:20200306145922p:plain

そして、secureshareというグループにsambaloginというユーザーを追加します。

sudo groupadd secureshare
sudo usermod -G secureshare sambalogin

sambaの設定を読み込むため、再起動します。

sudo systemctl restart smbd
sudo systemctl enable smbd

最後に、sambaにファイアウォールの許可を与えます。 これにハマって2時間ぐらい溶かしました。

sudo ufw allow samba

Windows

ネットワークドライブを割り当てるをクリックします

f:id:tlaloc:20200306145936p:plain

UbuntuのPCのIPアドレスをxxxに入れてください

f:id:tlaloc:20200306145951p:plain

あとは、pdbeditで設定したパスワードを入力するだけです。 おそらく、ユーザー名も入力しないといけない場合、どこかが間違っています