Httpサーバーを作ってPHPも動かす(Windows10)

Androidアプリで画像をアップロードしたいぞぉ!ということで調べたら、アップロードの手段が大変なことが判明。やることは2つ

(1)apache tomcatをインストールしてhttpサーバーを動かす

programming-style.com

(2)phpをインストールしてphpスクリプトがサーバーで動くようにする

qiita.com

(2-1)php動作確認

C:\tomcattomcatをインストールしている場合、C:\tomcat\htdocs\test.phpというファイルに

<?php
phpinfo()
?>

を作成して、ブラウザで http://localhost/test.php にアクセスする。「PHP Version 8.0.5」で色々なデータが表示されればOK.

ボタンを置く(Android)

前回はフラグメントが2つのHello Worldから始めてしまいました。 ちょっと改造するには、ややこしいので、アクティビティが1つだけの簡単なハローワールド にボタンを配置してみます。

Android Studioを起動したら、上のメニューバーから「File」→「New」→「New Project...」を選んで 出てきたTemplateから「Empty Acitivity」を選んで「Next」を押します。

f:id:kuukaix:20210429151659j:plain

(1)名前とか保存場所を適当に変更して「Finish」を押します。

(2)とても簡単なMainActivityができました。

f:id:kuukaix:20210429152110j:plain

(3)res→layout にある activity_main.xml はこんな感じ。TextViewが1つだけ。

f:id:kuukaix:20210429152232j:plain

(4)接続しているデバイス名の右の緑三角を押して、実行すると、端末に Hello World!の文字がでます。

f:id:kuukaix:20210429152632j:plain

(5)ここからボタンを画面に配置していきます。res→layout にある activity_main.xmlをクリックして、「Design」画面にします。中央やや左のPaletteにあるButtonsをクリックして、その右の一覧にあるButtonをドラッグ。マウスボタンを押した状態で、その下のComponent TreeのTextViewの下にドロップ(マウスのボタンを離す)します。  この時点ではエラー状態です。

f:id:kuukaix:20210429152823j:plain

(6)一度「Code」(右上のボタン)を確認してみます。(別にしなくてもいいのですが)TextViewの下に Buttonが追加されて、赤文字(エラーだよ)になっています。TextにあるButtonが黄色になっているのは警告です。(今回警告は無視します)

f:id:kuukaix:20210429153249j:plain

(7)「Design」(右上のボタン)画面にして、中央やや左のPaletteにあるLayoutsをクリックして、その右の一覧にあるLinearLayout(vertial) (横線が2本あるやつ)をドラッグして、その下のComponent Treeのbuttonの下にドロップします。  この時点ではエラー状態です。

f:id:kuukaix:20210429153525j:plain

(8)Component TreeのTextViewをドラッグして、LinearLayoutの中にドロップします。buttonも同様にLinearLayoutの中にドロップします。  これでエラーが解消します。警告が残っていますが、無視で。

f:id:kuukaix:20210429154032j:plain

(9)「Code」(右上のボタン)で確認してみます。LinearLayoutの中にButtonとTextViewが入っていることがわかります。ButtonとTextViewを表示したい場合は、その並び方を指示しないといけないので、LinearLayoutの中にいれる必要があります。LinearLayoutにandroid:orientation="vertical"とあるのが並び方で、縦に2つを並べることを意味します。ちなみにtextの"Button"が黄色なのは、多言語対応するとき、ここに文字があると色々な言語にできないので、strings.xmlを使って間接参照にする必要があるからです。今回言語で文字を変える予定がないので、警告は無視しています。

f:id:kuukaix:20210429154331j:plain

(10)ボタンが置けたので、実行してみます。接続しているデバイス名の右の緑三角を押して、実行すると、端末に ButtonとHello World!の文字が出ます。ボタンと文字が左上にあるのが気になる人がいると思いますが、画面中央に持ってくるのは面倒なので、今回はこれで進めます。  なお、ボタンをタップしても何も起きません。

f:id:kuukaix:20210429155156j:plain

(11)ボタンをタップすると何か起きるようにします。MainActivityにボタンが押された時の機能を実装します。 importに2つのwidget(ButtonとToast)を追加します。 findViewById<Button>(R.id.button)の、findViewById(R.id.button)で activity_main.xmlにあるandroid:id="@+id/button"にあるボタンを取ってきて<Button>でButton widgetにします。続く.setOnClickListener {...}でボタンが押されたときの動作を記述します。Toastは数秒だけ画面(の下に)文字を出すWidgetで、"button clicked"の文字が、画面の下に出てそのうち消えます。

  import androidx.appcompat.app.AppCompatActivity
  import android.os.Bundle
  import android.widget.Button
  import android.widget.Toast

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

        findViewById<Button>(R.id.button).setOnClickListener {
            // ボタンが押されたら実行される
            Toast.makeText(this, "button clicked", Toast.LENGTH_LONG).show()
        }
    }  
  }

f:id:kuukaix:20210429155429j:plain

(12)実際に実行して、ボタンをタップすると、こんな感じで画面の下に文字が出て消えます。Toastはちょっとした動作確認に使うWidgetです。

f:id:kuukaix:20210429161323j:plain

HelloWorldの説明(Android)

(1)3つのkotlinプログラムで構成されている。MainActivityがメインの画面でその上に、FirstFragmentとSecondFragmentのどちらかが乗っかるように表示される。

(2)MainActivityには3つのFunction(fun)が実装されている。onCreate()は、画面全体を作る。onCreateOptionsMenu()は、オプションメニュー(右上の縦の点が3つあるボタンの機能)を作る。onOptionsItemSelected()は、オプションメニューの内容をクリックしたときの動作を作る。

f:id:kuukaix:20210425211820j:plain

(2-1)onCreate()は、引数にsavedInstanceStateを受け取る。kotlinではC言語(型 変数名)と順序が逆で、変数名 : 型 になる。 fun onCreate(savedInstanceState: Bundle?)は、nullを許すBundle型の値をsavedInstanceStateで受け取るという意味。 次のsuper.onCreate(savedInstanceState)は、基底クラスのonCreate()を呼び出すという意味。ここで行うonCreate()以外の諸々の仕事は基底クラスのonCreate()でやってもらう。 setContentView(R.layout.activity_main)は、画面のレイアウトを決定している。レイアウトの実体はres->layout->activity_main.xmlに記述されている。 setSupportActionBar(findViewById(R.id.toolbar))は、上にあるツールバーを設定している。R.id.toolbarの実体は、activity_main.xmlに含まれている。 findViewById<FloatingActionButton>(R.id.fab).setOnClickListener {なんたら}は、メイン画面の右下のメールアイコンが押されたときの動作を記述している。R.id.fabの実体は、activity_main.xmlに含まれている。ボタンが押されると{なんたら}の部分が実行される。

(2-2)onCreateOptionsMenu()は、引数にmenuを受け取る。fun onCreateOptionsMenu(menu: Menu): Booleanは、nullを許さないMenu型の値をmenuで受け取って、Functionの結果はBoolean型を返すという意味。 次のmenuInflater.inflate(R.menu.menu_main, menu)は、res->menu->manu_main.xmlで記述されるメインメニューを作るようにしている。

(2-3)onOptionsItemSelected()は、引数にitemを受け取る。fun onOptionsItemSelected(item: MenuItem): Booleanは、nullを許さないMenuItem型の値をitemで受け取って、Functionの結果はBoolean型を返すという意味。 次のreturn when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) } は、item.itemIdがid.action_settingsならtrueを、それ以外なら基底クラスのonOptionsItemSelected()を呼び出すという意味。

(3)FirstFragmentには、2つのFunction(fun)が実装されている。onCreateView()は、フラグメント画面を作る。onViewCreated()は、画面の表示が終わった直後に実行され、ボタンの動作を定義している。

f:id:kuukaix:20210425211842j:plain

(3-1)onCreateView()は、引数を3つ持つ。 inflater.inflate(R.layout.fragment_first, container, false)は、画面のレイアウトを決定している。レイアウトの実体は、res->layout->fragment_first.xmlに記述されている。

(3-2)onViewCreated()は、引数を2つ持つ。 super.onViewCreated(view, savedInstanceState)は、基底クラスのonViewCreated()を呼び出すという意味。ここで行うonViewCreated()以外の諸々の仕事は基底クラスのonViewCreated()でやってもらう。 次の view.findViewById<Button>(R.id.button_first).setOnClickListener {なんたら}は、フラグメント画面のボタンが押されたときの動作を記述している。R.id.button_firstの実体は、fragment_first.xmlに含まれている。ボタンが押されると{なんたら}の部分が実行される。 なんたらの部分の findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)について、R.id.action_FirstFragment_to_SecondFragmentの実体は、res->navigation->nav_graph.xmlに含まれている。

(4)SecondFragmentもFirstFragmentと同様。

f:id:kuukaix:20210425211857j:plain

(5)activity_main.xmlを開くと、画像だけが表示される。Designになっている(右上にあるボタン)が、SplitかCodeを選ぶとよい。私はCodeが好み。

f:id:kuukaix:20210425214818j:plain

(5-1)xmlはこういうものと理解してもらうしかないが、 上から、ツールバー、中心部分(content_main)、フローティングボタンの3つで構成されている。

<com.google.android.material.appbar.AppBarLayout なんたら> なんやかんや </com.google.android.material.appbar.AppBarLayout> 〆 と

<androidx.appcompat.widget.Toolbar なんやかんや /> 〆

の2種類が使われている。

content_mainは別のxmlファイルのcontent_main.xmlに記述されていて、navigation/nav_graphを経由して、fragment_first.xmlとfragment_second.xmlのどちらかが表示されるようになっている。

(6)fragment_first.xmlを開く

f:id:kuukaix:20210425220417j:plain

(6-1)上からテキストとボタンの2つで構成されている。 テキストは、android:text="@string/hello_first_fragment" ボタンの文字はandroid:text="@string/next" で記述されていて、res->values->strings.xmlを使って文字にしている。このように間接に文字を入れるのは、多国語対応したいときは、stringsの部分を各国語に翻訳すればよい。

Android Studio始めました

息子がAndroid Studioの使い方を教えてと言ってきたので、ここでAndroidのプログラミングを少し書きます。Swift解説からちょっと浮気です。 久しぶりにAndroid Studioを使ってみましたが、Hello Worldがリッチになっているのでした。

(1)Android Studioのインストール(簡単なので説明省略)

(2)Android Studioを起動 f:id:kuukaix:20210425194643j:plain →create new projectをクリック

(3)Basic Activityをクリックすると以下の画面に Name, Package Name, Save Location,Minimum SDKを少し編集 f:id:kuukaix:20210425194747j:plain

(4)1,2分待つとデバイスが選べるようになります。(それまでなんか仕事してます) Pixel_3a_API_30_x86 を選びます。 f:id:kuukaix:20210425195109j:plain

(5)その横の緑三角(実行ボタン)を押すて、1,2分待つと AndroidエミュレータでHelloWorldが実行されます。

f:id:kuukaix:20210425202145j:plain

(6)First Fragmentと Second Fragmentの2画面あるのね。実行されているアプリの「NEXT」ボタンを押すと、 First Fragment から Second Fragment に切り替わって、「PREVIOUS」ボタンになるのね。 で、「PREVIOUS」を押すと、Second Fragment からFirst Fragmentに戻ってくる仕組み。

Windows98をWindows10環境で動かす(2021年版)

2022年版を作成しました
Windows98をWindows10環境で動かす(2022年版) - kuukaixの日記

1.用意するもの

1.1 Windows98 Japanese (MSDN)インストールディスク(CDブート未対応)
- MSDN契約しないともらえない
1.2 Oracle VM VirtulBox バージョン 6.1.14 Windows
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html
1.3 FreeDOS 1.2
http://www.freedos.org/download/
1.4 Win98用のグラフィックドライバ(VirtulBox)140214.zip
https://web.archive.org/web/20190210203844/http://bearwindows.boot-land.net/vbe9x.htm

2.胆になるところ

2.1 セキュリティのメモリ保護にVT-xを使わないようにする
  手順: Windows10->スタート→設定→Windows セキュリティ→デバイス セキュリティ→コア分離の詳細→メモリ整合性→オフ
2.2 FreeDOSのインストール時 TABキー押して、最後に rawを追加
2.3 Win98SEのインストール時 setup.exe /nm /is /ie /c /p j;a とする

3.作業

3.1 Win10に最新のVirtulBoxをインストール(最新じゃないと動かないこと多し)
3.2 FreeDOS1.2サイトからFD12CD.isoをダウンロード
3.3 セキュリティのメモリ保護にVT-xを使わないようにする
  手順: Windows10->スタート→設定→Windows セキュリティ→デバイス セキュリティ→コア分離の詳細→メモリ整合性→オフ
3.4 VirtulBoxマネージャーを起動
3.5 「新規」ボタンを押す
3.6 名前に「Win98SE」といれると
  →良しなにしてくれるので→「作成」を押す
  →良しなにしてくれているので→「作成」を押す
3.7 新しく作ったWin98SEを選択して「設定」ボタンを押す
  ディスプレイ→スクリーン→ビデオメモリを18MBから32MBに変更
  (後で32MB用のグラフィックドライバを入れるため)
  ストレージ→丸いCDアイコン(空)をクリック
   →右に小さい▼のついた丸いCDアイコンが出るのでクリック
   →ディスクファイルを選択して、あらかじめダウンロードしておいたFD12CD.isoを選ぶ
  ネットワーク→ネットワークアダプターを有効化のチェックを外す
  USB→USBコントローラーを有効化のチェックを外す
  「OK」を押してダイアログを閉じる
3.8 「起動」ボタンを押す→起動ハードディスクを選択になるのでFD12CD.isoを選んで、「起動」を押す
3.9 Welcome to FreeDOS 1.2の画面が出る→TABキーを押す★重要
  .linux /isolinux/memdisk initrd=/isolinux/fdboot.img
  の後ろに rawを追加入力して[Enter]を押す。
3.10 Englishを選んでEnter→Yes でEnter→Yes でEnter→Yes でEnter→再起動して
  再びWelcome to FreeDOS 1.2の画面が出る→TABキーを押す★重要
  .linux /isolinux/memdisk initrd=/isolinux/fdboot.img
  の後ろに rawを追加入力して[Enter]を押す。
3.11 Englishを選んでEnter→Yes でEnter→Yes でEnter→Enter
  →US English (Default)を選んでEnter→Full Installationを選んでEnter
  →Yes でEnter→Yes でEnter→再起動して
3.12 Boot from system harddiskを選んでEnter
  →1. Load FreeDOS with JEMMEX, no EMS (most UMBs), max RAM freeを選んでEnter
(これでFreeDOSのインストールは終わり。次にWin98のインストール)
3.13 Windows10のCDドライブにWindows98 Japanese (MSDN)ディスクを入れる
3.14 FreeDOS画面の下のCD(丸い)アイコンを右クリック
  →FD12CD.isoが選ばれているが、ホストドライブからCDを入れたドライブに変更
※変更できない場合は、VirtualBoxマネージャーでWin98SEを選んで
   →「設定」から「ストレージ」→丸いCDアイコン(空)をクリック
   →右に小さい▼のついた丸いCDアイコンが出るのでクリック
   →ホストドライブを選択
3.15 FreeDOSの画面でC:>で、D:と入れる(英語キーボードになっているので注意)
3.16 dir[Enter]すると、JAPANESE.ATとJAPANESE.NECが見えるが、CD JAPANESE.AT
  して、CD WIN98SEする。dir/wするといくつかのCABファイルとSETUP.EXEが見える
3.17 setup.exe /nm /is /ie /c /p j;a ★重要と入力して Enter
3.18 これでWindows98のセットアップが起動する。
3.19 あとは画面の指示に従ってセットアップを進める
3.20 音楽が鳴ってWindows98へようこそダイアログがでます。ただし画面が16色

(これでWindows98のインストールは終わり。
 次にグラフィックドライバのインストール)

3.21 Win98用のグラフィックドライバ(VirtulBox)140214.zipを解凍したものをCDに焼く
※Win98だとクリップボード共有とかホストからのドラッグ&ドロップが使えないため
※Win98だとzip解凍が面倒なので、解凍しておく
3.22 すでにWindows98 MSDNディスクの代わりに140214.zipが入ったCDがホストPCに
 入っているはずなので、
3.23 Win98SEのマイコンピュータをダブルクリックしてDドライブ(CDのはず)から
 032MBが見えるのを確認する
3.24 Win98SEのデスクトップで画面のプロパティを開いて、「設定」タブの「詳細」ボタンを押す
3.25 「アダプタ」タブの「変更」ボタンを押す→
  「次へ」→特定の場所にあるすべての...を選んで「次へ」
  「ディスクを使用」→「参照」から032MBのフォルダーを選ぶ
  vbemp.infが選ばれる→「OK」
  VBE Miniport - Standard PCI Graphics Adapter (VGA)が選ばれる
  「OK」を押して「次へ」→「完了」→「適用」
3.26 一度Win98を再起動
※Win起動を真っ黒になったら、VirtualBox仮想マシンからACPIシャットダウン
3.27 16ビット 1024x768ピクセル が選べるようになる→「適用」

Win10でOracle VM VirtulBoxを使ってWinXpを動かす(2021年版)

  1. 用意するもの

1.1 アップデート版のXPのインスト―ルCD
1.2 Windows2000のインスト―ルCD
1.3 Oracle VM VirtulBox バージョン 6.1.14 Windows
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

  1. 手順

(2.1) アップデート版のXPのインスト―ルCDなので、途中で旧WindowsのCDを入れるように指示されるが、旧WinCDが認識されず。
2.2 Win2000のインストールCDをあらかじめ*.isoイメージにして、HDDに保存。Win10のエクスプローラーで開いて、仮想CDドライブに割り当て。
2.3 上記WindowsのCD入れ替え指示のときにVirtualBoxから、カレントのCDドライブを変更して、Win2000のCDを認識させて、WinXpのCDドライブに変更することで、この問題を回避。
2.4 Windows + IEMicrosoft Update カタログ
 https://www.catalog.update.microsoft.com/Home.aspx
 にアクセスして、『KB936929』で検索すればSP3をダウンロードできる。
 注)検索「SP3」では見つからない。