Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

お名前.comの共用サーバーSDにWordPressのサイトを設置した際のメモ

最近(2020年10月)お名前.comの共用サーバーSD にWordPressのサイトを設置するという作業を行いました。 その際の手順についてのメモです。 SDサーバーは古いらしく現在新規では契約出来なくなっておりますが作業を再現できるようにするためにも残しておきます。

あくまでもメモなので、公式マニュアルのリンクを貼っただけの項目がありますがご容赦下さい。

前提条件

  • 新規でSDサーバーをレンタルしたのではなく、元々別のサイトを運営していた所にマルチドメイン機能で追加した
  • ドメインをお名前ドットコムで新規取得済み
  • Mac上での作業
  • 他の誰かと協業しない状況

公式サイト

お名前ドットコム内のマニュアル
共用サーバーSD活用ガイド

サーバーにドメイン追加

公式のヘルプはこちらです。
【共用サーバーSD】ドメインを追加するには?

1. お名前.com Naviにログイン https://www.onamae.com/navi/login/
2. レンタルサーバー > プランの中からドメイン追加対象のプランの「ドメイン追加」ボタンを押す
3. 「お名前.comで契約済みのドメイン」を押す
4. 追加したいドメインを選択
5. ネームサーバーは変更しない(何も押さないでOK)
6. 確認ボタンを押す

f:id:sakura_bird1:20201114171709p:plain
ドメイン追加

7. 内容の確認の画面が表示されるので「 確定ボタン」を押す
8. ドメイン追加からそのドメインでアクセスできるようになるまでは時間がかかる。

SSH接続設定有効化

公式のヘルプはこちらです。
【共用サーバーSD】telnetやSSHは使えますか?

FTPアカウント:Web設定

使用できるコマンド一覧はこちらです。
【共用サーバーSD】SSHで利用できるコマンドを教えてください

1. お名前.com Naviにログイン https://www.onamae.com/navi/login/
2. レンタルサーバー > プランの中から対象のプランのコントロールパネル「ログイン」ボタンを押す
3. サーバーにログインできるとコントロールパネルのメニューが表示されるので、「FTPSSHアカウント」をクリックする

f:id:sakura_bird1:20201114172441p:plain
ssh接続設定

4. 管理者アカウント接続情報が表示される
5. SSH接続設定を有効にして変更ボタンを押す

f:id:sakura_bird1:20201114172523p:plain
ssh接続設定

6. MacのターミナルからSSH接続する場合次のようなコマンドとなる

sshコマンドで接続する場合

$ ssh ①のアカウント@②の接続先
を入力するとパスワードを聞かれるのでパスワードを入力

sshpassコマンドでパスワードも含めて接続する場合
※sshpassがMacにインストールされている必要があります

$ sshpass -p'パスワード' ssh -x ①のアカウント@②の接続先

f:id:sakura_bird1:20201114173118p:plain
ssh接続コマンド

入力をミスするとしばらくログイン出来なくなるようなので個人的にはsshpassコマンドがいいと思います。

SDサーバーのプランでは公開鍵認証が使えません。
SDサーバーは色々古いみたいですね。

FTPアカウント追加

自動的に作成される管理者アカウントはサーバーの割り当てられたディレクトリ内のルートディレクトリにアクセスできますが、自分が作業するドメイン配下にしかアクセスしたくないのでFTPアカウントを追加します。

こちらの公式ページを見ればすぐ作れます。

FTPアカウント:Web設定

SSL設定

Let's Encryptを使ってhttpsでアクセスできるようにします。
追加料金などはかかりません。

こちらのページを見れば設定できます。
なお私が作業した時は状態が稼働中になってからも2時間くらいはSSLでアクセスできませんでした。

【共用サーバーSD】独自SSL Let's Encrypt を利用するにはどうすればいいですか?

注意点としてネームサーバーが共用サーバーのものになっている必要があります。

確認方法は
1.Naviにログイン https://www.onamae.com/navi/login/
2.ドメイン > ネームサーバー設定を開く
3.対象のドメインの「現在のネームサーバー情報」が「レンタルサーバー SDプラン」になっていればOK

f:id:sakura_bird1:20201114174243p:plain

レンタルサーバー SDプラン」 になっていなければ、同じページの「2.ネームサーバーの選択」で「レンタルサーバー SDプラン、お名前メールのネームサーバーを使う」を選択して変更する必要があります。

アクセスログを有効にする

デフォルトではアクセスログが無効になっています。
こちらのページを見れば設定できます。

【共用サーバーSD】アクセスログを確認できますか?

メールアドレス追加

メールアカウント:メール設定

Outlook2013の設定:Windows | メールクライアントソフトの設定

いくつかメールアドレスを作りました

データベースを作成する

こちらのページを見れば作成できます。

導入の事前準備:WordPress | アプリケーションの設定 | 共用サーバーSD 活用ガイド:

データベースはパスワードとメモしか変更できません。
データベースの名前では何のために使用しているかわかりにくいのでメモに書いておくといいと思います。

PHPのバージョンを変更する

PHPバージョン変更:Web設定

202010月時点で最新のPHP 7.4.2に変更しました。

WordPressのインストール

【共用サーバーSD】WordPress は利用できますか?|ヘルプサポート | ドメイン取るならお名前.com:
WordPressは自分でローカルからサーバーに転送して導入する方法とお名前.comが用意しているコントロールパネルからインストールする機能を利用する方法があります。

確実に動作しそうなのでコントロールパネルからインストールしました。

マニュアルはこちらです。

WordPressインストール:Web設定

データベースは事前に作成していたものを使用したので新規作成しませんでした。

注意点としてネームサーバーが共用サーバーのものになっている必要があります。
確認方法は本記事内の「SSL設定」内に書いております。

もしくはこちらの記事も参照してください。
ネームサーバーの変更(共用サーバーSD、お名前メール)

インストールが終了すると自分のドメインのアドレスでブラウザにアクセスするとWordPressのテーマが適用された画面が表示されます。

f:id:sakura_bird1:20201114182048p:plain

phpMyAdminのインストール

データベース操作のためphpMyAdminを自力でインストールしました。
この作業では2つほど失敗したためかなり時間がかかってしまいました。

インストール手順はこちらです。

導入の事前準備:phpMyAdmin

基本的には上記の公式マニュアルの順にインストール作業をしていきます。
DBはもう作成済みだから作らない、Macを使っているからマニュアルとは別のFTPクライアントソフトを使うといったように自分の状況に合わせて読み替えます。

失敗その1

WAF設定を有効のままインストール作業を行った

WAF設定を有効のままインストールしてphpMyAdmin管理画面にアクセスすると「403 Error – Forbidden」が表示されてしまいました。

公式サイトの導入の事前準備にちゃんと無効にするか除外設定をするように書いてあったのですが、読み飛ばしてしまっていました。

WAF(ウェブアプリケーションファイアウォール)とは、株式会社JP-Secure(ジェイピー・セキュア)が提供する不正アクセスによるサイト改ざんや情報漏洩を防ぐ機能です。

インストール作業を終えるまで一時的にWAF設定をオフにします。

公式マニュアルはこちらです。

WAF設定

WAF設定のオン・オフをすると反映されるまで時間がかかります。
作業の最初に行うとよいでしょう。
私が作業した時は一時間以上かかりました。

失敗その2

phpMyAdminのバージョン4.6.6を導入してなかった

https://自分のドメイン/phpmyadmin
にアクセスすると画面が真っ白になってしまい何も表示されない状態になりました。

phpMyAdminのバージョンは最初は5.0.4をインストールしたのですが(新しすぎてうまくいかないかもと思いつつ)、うまくいかず4.6.4を導入しました。
が、やはり画面が白くなります。

導入すべきバージョンは、公式マニュアルに4.6.4とあります。

入手:phpMyAdmin | アプリケーションの設定 | 共用サーバーSD 活用ガイド:

f:id:sakura_bird1:20201114182805p:plain
お名前.comの画像

しかしながら途中から公式マニュアルがバージョン4.6.6導入という話に変わっています。

インストール:phpMyAdmin | アプリケーションの設定 | 共用サーバーSD 活用ガイド:

f:id:sakura_bird1:20201114182853p:plain
お名前.comの画像

こちらの記事にたどり着いたおかげで4.6.6に入れ替えたらインストール成功し、phpMyAdminのログイン画面ができました。

助かりました。ありがとうございました!

お名前.comでphpMyAdminが入れられなくてお困りの方へ。バージョンを確認してみよう | 猫でもわかるWordPressレッスン:

それにしてもこんなに厳密にバージョン指定しないといけないのかと驚きました。

設定を終えたらWAFを再び有効化するのを忘れないようにします。

トラブル

コントロールパネルから行うサーバー設定とは関係ありませんが、サイトにアクセス出来なくなってしまうトラブルが発生しましたので書いておきます。

発生したトラブル

サイトにアクセスしようとすると、次のようなメッセージが表示される

このサイトにアクセスできません
{自分のドメイン}のサーバーのIPアドレスが見つかりませんでした。
DNS_PROBE_FINISHED_NXDOMAIN

f:id:sakura_bird1:20201114183624p:plain

発生した時の状況

サーバーの設定が終わってサイトも無事表示されて何日か経過しており特に問題なさそうだった。
複数のブラウザ、別の人が違うPCでアクセスしてもエラーになる。

原因

ドメイン情報認証手続きを行っておらずドメインWhois上のステータスが「clientHold」となってしまったためエラーになった

公式ヘルプページはこちらです。

【ドメイン】ドメインのWhois上のステータスが「clientHold」となって利用できない

サイトのオーナーの方がお名前.comでドメインを契約した際に送られてきたメールにリンクを踏んで手続きをしないといけない手順があったがそのままになっていた。
しばらくしてドメイン利用制限したというメールが来たがそれも放置されていた。

対応

サイトのオーナーの方のメールアドレスに、お名前.comから来た 【重要】[お名前.com] ドメイン 情報認証のお願い というメールがあるのでその中のリンクを踏むとしばらくしてアクセス出来るようになった。

リンクを踏むとこのようなメッセージが表示されます。

f:id:sakura_bird1:20201114184346p:plain
メールアドレスの有効性認証フォーム

Whois上のステータスについて

こちらでWhois情報を表示します。
Whois検索|ドメイン取るならお名前.com:

Domain Status: clientHold

このようになっていたら認証完了していない可能性があります。 認証完了したらステータスはokに変わりました。

Domain Status: ok

DNS_PROBE_FINISHED_NXDOMAINというエラーで検索するとクライアント側の問題が多いように思いますが、DNSの設定やWhoisドメインステータスも確認してみるといいですね。


以上となります。

Androidアプリ「投資名言」リリースしました!

こんにちは。 2019年11月、個人開発のAndroidアプリ「投資名言」をリリースしました。
投資に関する名言ですが、人生に応用できるようなよい言葉がたくさん入っているアプリです。
ネットワークアクセスもほとんど無い電池に優しいアプリですので是非お試しください(^^)

play.google.com

それにしても私らしく地味なアプリです(笑)
画面も黒っぽいです。
機能はシンプルです。毎日通知が届くのでそこから名言の解説画面に遷移するような使い方になると想定しています。

f:id:sakura_bird1:20191202214925p:plain:w500

アプリを作る前はこんな感じの画面遷移図を作って大体のイメージを作るようにしています。
この図はSketchというMacのアプリで作成しました。

f:id:sakura_bird1:20191202215804p:plain:w500

こういうのを作る度にもっとデザイン方面に力を入れていきたい、とずっと思っています。


Android開発の技術面では、全体的に新しいコンポーネントを使っています。

  • Android Jetpack
  • Kotlin
  • LiveData
  • Navigation
  • Room
  • Kotlin Coroutines
  • Dagger2

などなど試行錯誤で作りました。
最近のコンポーネントの習得はほとんどGoogle Developers Codelabsで学習しました。
しかしながら進化が早いため、教材と最新版がずれてしまうことがザラであり進めるのはコツがいる感じでした。

今後はiOS版も作りたいと思います。
読んでくれてありがとうございました。

【AndroidX】Jetpack のNavigation で戻るボタンの処理をカスタマイズする(Backキーのイベントを拾う, OnBackPressedDispatcher, OnBackPressedCallback, ToolBarの戻るボタン)

AndroidJetpackのNavigationコンポーネントを使って画面遷移をハンドリングしているアプリで、戻るボタンが押された場合の処理をカスタマイズする必要が出た時に、最近出た新しい方法で戻るボタンの処理を書きました。
その時のメモです。
Navigationコンポーネント内の機能というわけではないので、Navigationを使っていないアプリでもonBackPressedメソッドをoverrideする代わりにその方法を使えます。
おまけでActionBarのToolBarでも戻る矢印のボタンを使っている場合のハンドリングについても書いています。

公式サイト

実行した環境

  • Android Studio 3.5
  • com.android.tools.build:gradle:3.5.0
  • Kotlin 1.3.50
  • androidx.appcompat:appcompat:1.1.0-rc01
  • androidx.navigation:navigation-fragment-ktx:2.2.0-alpha02
  • androidx.navigation:navigation-ui-ktx:2.2.0-alpha02

参考サイト様

何がやりたいのか

JetpackNavigation componentを使って戻るボタンの処理をNavigationに任せている場合でも、カスタマイズしたい時があります。

例えば何らかの処理を行わないでユーザーが画面を離脱しようとした時に、警告ダイアログを表示するなどが考えられます。

古くからある戻るボタンのハンドリング方法は、Activityクラスの中でonBackPressedメソッドをoverrideして、その中に処理を記述していましたが、個々のFragmentから見ると親のActivityに処理を任せなくてはならず使い勝手がよくありませんでした。

Jetpackで登場したComponentActivityOnBackPressedDispatcherを使うと、戻るボタンのイベントを受け取って処理を記述できるようになります。
Activityにコードを書かずに済むし、有効と無効の切り替えも簡単に出来ます。

onBackPressedメソッドのオーバーライドの代わりにこれを使って処理を書いてみます。

注意事項

  • AndroidX 移行済みの前提です。
  • Jetpackは進化が早いので、この記事も古くなっているかも知れません。参考にされる場合はご了承ください。
  • この記事では実装はKotlinのみを使用しています。Javaでの実装は扱っておりません。

必要なライブラリ

AndroidXのActivity が必要となります。
2019年4月25日にリリースされたandroidx.activity:activity:1.0.0-alpha07で大幅にアップデートされたバックボタンのハンドリングの機能を使います。

その後も変更やメソッド削除等があるので、androidx.activity:activity:1.0.0androidx.activity:activity-ktx:1.0.0の安定版以降を使うのがよいと思います。

公式サイトのAndroidXのActivityの導入ガイドはこちらです。
Activity  |  Android Developers

依存ライブラリのバージョンの確認

少し話がずれますが、androidx.activity:activityのライブラリは、
androidx.appcompat:appcompatandroidx.navigation:navigationからも依存されています。

そのためわざわざbuild.gradleのdependenciesに記述しなくてもandroidx.activity:activityのパッケージを使用出来ます。
ですが、少し古いリリースのものだとまだ実装されていないかもしれないので、一応バージョンの確認をしておくといいでしょう。

依存関係の確認方法の一例として、下記のコマンドをプロジェクトのルート配下で実行すると、depends.txtというテキストファイルが出来ます。
これを開いてバージョンを確認します。

$ ./gradlew app:dependencies > depends.txt

次の画像は手元で実行した時のスクリーンショットです。

f:id:sakura_bird1:20190919123514p:plain:w500

androidx.activityで検索すると、この例ではandroidx.activity:activity:1.1.0-alpha03 (*)となっています。
1.0.0以降ですのでバージョンはOKです。

色々なライブラリがandroidx.activityを参照していてバージョンが異なったとしても、Gradleの依存関係のルールでは参照されてる中で最も最新のものが全てに強制的に適用されます。(カスタマイズも可能)
Gradleの依存関係のルールについては公式サイトをご覧ください。

戻るボタンの処理を記述する

OnBackPressedDispatcherにコールバックを追加する

公式サイトより引用します。

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

説明(ほぼ公式サイトより)

FragmentActivityAppCompatActivityの継承元クラスであるComponentActivityでは、getOnBackPressedDispatcher()を呼び出して取得できるOnBackPressedDispatcherを使用して戻るボタンのハンドリングを行うことが出来ます。

OnBackPressedDispatcheraddCallback()メソッドを呼び出されるとOnBackPressedCallback オブジェクトを返してhandleOnBackPressed()メソッド内で戻るボタンのイベントをキャッチした時の処理を書くことが出来ます。

コールバックの引数にはLifecycleOwnerを渡します。
OnBackPressedCallbackLifecycleOwnerの状態がLifecycle.State.STARTEDになってから追加されます。

複数のコールバックを登録できます。
登録された順の逆の順序で有効なコールバックが呼び出されます。

コールバックの有効と無効を切り替える

isEnabled()メソッドで切り替えます。デフォルトでtrueになっています。

callback.isEnabled = false

コールバックはChain of Responsibility パターンに従っています。

コールバックの有効と無効を切り替えることは、呼び出し順序を維持するためにも一時的な変更にすることがおすすめです。
特に複数のネストされたLifecycleOwnerにコールバックが追加されている場合は特に重要です。

OnBackPressedCallbackを削除する

OnBackPressedCallbackを完全に削除する場合は、remove()メソッドを呼び出す必要があります。
ただし、コールバックは関連付けられているLifecycleOwnerが 破棄されると自動的に削除されるため、通常は必要ありません。

ActivityのonBackPressedメソッド

ActivityonBackPressedメソッドをoverrideする方法をとっている場合は、
OnBackPressedCallbackを代わりに使うのがおすすめです。
この変更を行うことができない場合は、次の規則が適用されます。

  • addCallbackで登録されたコールバックは、super.onBackPressed()を呼び出した時に評価される
  • onBackPressed()はOnBackPressedCallbackのインスタンスに関係なく常に呼び出される。

Navigationで一つ前の画面に戻る

Navigationのバックスタックを一つ遡るには、NavController.popBackStack()メソッドを使います。
特定の画面に遷移したい場合は公式サイトをご覧ください。

        requireActivity().onBackPressedDispatcher.addCallback(this@MyFragment) {
            // Handle the back button event
            ...

            findNavController().popBackStack()
        }

ActionBarのUpボタンの処理(おまけ)

NavigationUI.setupActionBarWithNavController()を使用してNavigationコンポーネントとアクションバーの挙動を結びつけると、NavigationがToolBarの領域に戻る矢印のUpボタンなど状況に応じて適切なナビゲーションを表示してくれるようになります。 (レイアウト内のfragmentタグで「app:defaultNavHost="true"」となっている前提です)

f:id:sakura_bird1:20190920223516p:plain:w300

参考コード

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        // レイアウト内のfragmentタグで「app:defaultNavHost="true"」となっている前提

        setContentView(main_activity)

        val host: NavHostFragment = supportFragmentManager
                .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return
        val navController = host.navController

        setSupportActionBar(binding.toolbar)

        val appBarConfiguration = AppBarConfiguration(navController.graph)

        setupActionBarWithNavController(navController, appBarConfiguration)
    }

    override fun onSupportNavigateUp(): Boolean =
        findNavController(R.id.nav_host_fragment).navigateUp()
}

Upボタンのイベントを取得して処理をカスタマイズする場合は
Fragment内でonOptionsItemSelectedメソッドをオーバーライドしてMenuItemのidが android.R.id.homeの時にUpボタンが押された時の処理を記述します。

class MyFragment : Fragment() {

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            android.R.id.home -> {
                // Upボタンが押された時の処理

                // falseを指定すると、Upボタンの処理が続行されて前の画面に戻る
                // trueを指定した時は自分でfindNavController().popBackStack()などを実行して前の画面に戻る
                false
            }
            R.id.action_share -> {
                // 何らかの処理
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}