kotlinで動画を再生する(VideoView)
kotlinでandroidアプリを絶賛開発中です。
androidをなるべくiOSっぽくするために日々奮闘しながら開発しているのですが、なかなかうまく行かない。
iOSでは動画を再生するときに自動でviewを作ってくれるのですが、androidではそういったことはしてくれないのでiOSっぽく動画を再生してみます。
ボタンクリック -> 動画再生 -> 終わったら元の画面へ
この流れで作成します。
環境
- ubuntu 16.04.1 (elementary OS 0.4.1 Loki)
- android studio 3.1.2
- kotlin 1.2.41
準備
activity2つ(empty activityでおk)・適当な動画が必要になります。
以下が手順。
まずはプロジェクト作成
名前は何でもおk。今回はMovieAppにしときます。
それ以外は変更せずnext連打で。
動画用viewを用意するためもうひとつactivityを作成します。
名前はMovieActivityで。
Activityの準備はこれでおk。
動画を入れるディレクトリを準備
動画のリソースはraw
というディレクトリに格納します。音声ファイルもここ。
app/res
上で右クリック、New -> Android Resource Directry
を選択します。
Directory name
とResource type
をraw
に変更してOKを押下。
作成されたのが確認できました。
動画のリソースを入れる
今回はニコ二・コモンズから取ってきたこれを使います。
かっけぇ。
このファイルをctrl + c
でコピーする。
なぜかubuntuのandroid studioでは最初に選択したものが認識されないので、別のファイルを最初にして一緒に選択した状態でctrl + c
でコピーする(意味わかるかな)。
そして、android studioのraw
ディレクトリ上でctrl + v
で貼り付け。
上みたいなウィンドウが出てくるので、ファイル名glass.mp4
へ変えて「OK」。
ちゃんと入ってますね。
ファイル名に注意
リソースのファイル名は自由につけることが出来ますが、全角文字やハイフン、ドットをつけるとエラーになります。
元のファイル名が例えばglass-effect.mp4
となっていた場合、貼付け時のウィンドウでglass_effect.mp4
と変更するようにしましょう。
MainActivityとactivity_main.xml
MainActivityのレイアウトファイルにボタンを配置、MainActivityファイルでボタンを押した時のイベントを作成します。
activity_main.xmlファイルを編集
app/res/layout
にあります。
アプリ名が@string/app_name
とバグってますが気にしない。たぶんビルドしたら直るはずです。
まず最初に邪魔なhello worldの文字を消します。
選択してdeleteで。
準備おk。
パレットにあるButtonをドラッグアンドドロップで貼り付けます。
位置はとりあえず真ん中に持ってきましょ(そしたらレイアウト気にしなくていいので)。
Component tree
のとこで注意マークが出てますが、今は気にしなくておkです。
次に右にあるAttributes
のIDをstartButton
、textをstart
に変更します。
こんな感じ。
これでlayoutファイルの編集は完了。
MainActivityの編集
処理は簡単。
- ボタン押下でMovieActivityに遷移する処理
これだけ。
ActivityでxmlのオブジェクトのIDを取得するときにわざわざfindViewById
するのがだるい。
なので、import kotlinx.android.synthetic.main.activity_main.*
をclassの前に記述します。
もろもろ書いたのが以下の画像。
xmlで設定したボタンのIDstartButton
を押した時の処理、setOnClickListenerの中に、移動する定石の処理を書いただけです。
MovieActiviryとactivity_movie.xml
xmlの背景を黒にし、VideoViewのオブジェクトを配置、Activityの方で動画の処理を書きます。
activity_movie.xmlの編集
まずは背景を真っ暗にします。
xmlのファイルを選択した状態で、左下らへんにあるTextを押すと、xmlの形式を直接変更できます。
7行目を追加すれば背景が黒になる。
でも、これは色の指定をxmlに直書きしているので、適切な場所で色を定義します。
app/res/colors.xml
で色を作成。
これをxmlから@color/black
で参照します。
Design
の方を見てみると以下のように。
真っ暗になってますね。
次に、VideoView
を配置します。
Palette -> Widgets -> VideoView
をボタンのときと同じように配置。
配置すると画面全体に広がるので、画面中央に来るように縮小します。
ボタンの時と同じように、IDを変更。 videoVIew2
からvideoView
へ(わかりやすければとりあえずおk)。
これで、xmlは完了です。
MovieActivityの編集
コードが以下。
import kotlinx.android.synthetic.main.activity_movie.*
で該当のxmlのオブジェクトをIDで参照できるようにしています。
Handler(mainLooper).postDelayed({~~~}, 200)
を設定しているのは、動画の読み込みに若干時間がかかるので設定(これがないと、動画の最初がキモいことなる)。
簡単な説明はコメントに書いてるので見てください。
もっとVideoViewについて知りたければこちら。
https://developer.android.com/reference/android/widget/VideoView
完成!!
ビルドをすると、Component tree
に出ていた注意マークが消えます。
おわりに
gif動画の方では見せてなかったですが、動画をタップすると再生メニューが表示されるようになってます。
是非参考にしてみて下さーい。
なにかあればコメントに。
【備忘録】locateコマンドで検索結果が出なくなったとき
最近locate
を使っても検索結果が出なくなったので放置してましたが、いい加減不便になってきたので改修しました。
原因
locateコマンドは予め用意されたDBを検索するので、更新してない状態では検索結果に現れないとのこと。
知らんかった。
環境
- ubuntu 16.04.1 (elementary OS 0.4.1 Loki)
対処
$ updatedb updatedb: `/var/lib/mlocate/mlocate.db' 用の一時ファイルを開けません
なんか出たのでスーパーユーザーでやります。
$ sudo updatedb
終わり
locateコマンドが参照するDBはこれで更新できました。
いつもどおりlocate <ファイル/ディレクトリ名>
で検索できます。
これでやっとファイル検索ができる・・・。
画面遷移時に「Canvas: trying to draw too large bitmap」で落ちる
特にエラーも無く実装できたと思っていたんですが、意味のわからないエラーで落ちました。
結論を言えば、画像サイズがデカすぎて、入っているディレクトリにふさわしくなかったみたいです。
環境
- android studio 3.1.2
- kotlin 1.2.30-release-78 (JRE 1.8.0_161-b12)
ディレクトリの確認
android studioを最初開いた時は必要なディレクトリしか表示されないようになっています。
「android」を押下して「Project」を選択。
すると以下のようなディレクトリ構造が出てきます。
僕の場合drawable-mdpi
ディレクトリに画像素材をガンガン入れていたんですが、それがダメだったようです。
なので、ひとつ上の階層のdrawable-xhdpi
ディレクトリにdrawable-mdpi
にあった画像を全部ぶち込みます。
ドラッグ & ドロップでいけます。
ぶち込んだあとにまた「android」の方を表示するとこんな感じ。
後ろについてる括弧が入っているディレクトリを表してます。問題なさ気ですね。
これでもダメだったら。。。
もうひとつ上のディレクトリdrawable-xxhdpi
に入れてみてください。
解決するはずです。
何かあればコメントの方に。
Docker初心者が超絶簡単にDockerfileをまとめてみた その2
前回のブログの続き
前回使わなかった命令の中でよく使うものを紹介したいと思います。
実行環境
前回と一緒。
- ubuntu16.04.1(elementary OS 0.4.1 Loki)
- Docker version 17.12.0-ce
MAINTAINER命令
Dockerfileをチームで共有して開発する場合、誰がこのDockerfileを作ったのかを明示的にしておくようにします。
チームとしてはわかった方が嬉しいですよね。
多分Dockerfileとかコピペするだろうから意味ないと思うけど。
イメージ作成に直接関係があるかといえば、なんとも言えないです。
自分しか触らないのであれば書く必要は無いですね、きっと。
一応書き方。
MAINTAINER <名前> # 例えばこんな感じ MAINTAINER motty93 rdwbocungelt5@gmail.com
必要になったら書き方ググればいいと思います〜まあ無くても大丈夫かな。
WORKDIR命令
ディレクトリ移動の命令。
ディレクトリがなければ、自動的にディレクトリが作成されます。
FROM ubuntu WORKDIR work WORKDIR shop RUN pwd
pwd
の結果は/work/show
です。
主にRUN
・CMD
・ENTRYPOINT
・COPY
・ADD
命令実行時の作業ディレクトリを指定するときに使います。
Rails環境を作った時にも使ったので、別の記事でそれはあげたいと思います。
VOLUME命令
(※1)マウントポイントを作成して外部マウント可能な(※2)ボリュームを作成する命令。
よく、データの永続化で使われます。
てかほとんどそれ。
FROM cenos:latest RUN yum install -y httpd RUN mkdir /var/log/httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] VOLUME /var/log/httpd
こんな感じにすると、apacheのログがVOLUME
で指定されたディレクトリへ溜まっていきます。
詳しくはdocker-compose
でwordpress環境を作成するときに、データの永続化でやってみたいと思います。
※1 マウント:OSに読み書きできるように認識させる
※2 ボリューム:マウントされた領域のこと
ADD命令 & COPY命令
どちらかといえばCOPY命令を使った方がいいらしい。
第一引数に、ホストOS(自分のPC)のディレクトリ/ファイルを、第二引数にコンテナ内のディレクトリを指定します。
こんな感じ。
FROM centos RUN mkdir app # index.htmlはDockerfileと同じディレクトリにあるものと仮定します ADD index.html /app COPY index.html /app
要は、自分のPCのにあるファイルやらディレクトリやらをコンテナ内に持っていくって感じです。
コンテナ起動してから作成すればいいやん!って思った方、いると思います。
前回も書いたんですが、直接コンテナに入って行ったことは、コンテナを停止するとイメージを作成した状態まで戻ってしまいます(場合によります)。
だからイメージを作成する命令(Dockerfile)を書いてあげるんですよ(これで何回かハマりました、Dockerを理解していない証拠・・・)。
ENV命令
環境変数の設定です。
WORKDIR
命令などのディレクトリを指定する命令と一緒に使われることがしばしばです。
FROM centos RUN $DIR /dir WORKDIR /usr/$DIR COPY index.html /usr/$DIR
ここで環境変数を設定しておけば、コンテナを作成しても有効なままです。
設定されている値はdocker inspect
で参照できます。
EXPOSE命令
特定のポートをコンテナが実行された時に読み取るようにdockerに教えてあげる命令です。
問題なのが、この命令があってもホストのブラウザからコンテナにアクセスできないんですよ。
なので、-p
オプションで開くポートを指定する必要はあります。
FROM centos RUN yum install -y httpd EXPOSE 3000 CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
こんな感じで
$ docker run -d -p 3000 イメージ名
で起動できます。
いじょー
とりあえず主要なものだけピックアップして簡単に説明してみました。
初心者の説明なので、全く当てにならないかもしれないですが、参考にできるところだけ見てみてください。
今度はdocker-compose
でいろんな環境を作ってみたいと思います。
お疲れ様でした!
Docker初心者が超絶簡単にDockerfileをまとめてみた その1
前回の記事で簡単なDockerfileを初めて作ってみました。
ですが、全くDockerfileの書き方について触れてなかった、というよりスルーしていたのでちょっとまとめてみたいと思います。
他にDockerfileの記事を書いている人はだいたいわかりにくい・・・
多分簡単です。慣れれば。
Dockerfileってなによ
簡単に言えば、「コンテナを作るときの説明書」および「手順書」のこと。
Dockerfileのおかげで以下
- dockerイメージを作成
- コンテナ内で行うコマンド操作
- 環境変数の設定
- コンテナ内で動作させるデーモン実行
をビルド時に実行してイメージを作成したりします。
ね!簡単でしょ?
Dockerfileの命令一覧
命令 | 説明 |
---|---|
FROM | ベースイメージの指定 |
MAINETAINER | Dockerfileの作成者情報 |
RUN | コマンド実行 |
VOLUME | ボリュームのマウント |
ADD | ファイル/ディレクトリの追加 |
COPY | ファイルのコピー |
CMD | デーモン実行 |
ENTRYPOINT | デーモン実行 |
LABEL | ラベルの設定 |
USER | ユーザの指定 |
EXPOSE | ポートのエクスポート |
WORKDIR | 作業ディレクトリの指定 |
ENV | 環境変数の設定 |
ONBUILD | ビルド完了後に実行される命令 |
上の表がDockerfileの命令です。 これを元にやっていきます。
今回はほんと簡単な命令しか書きません。
次回以降暇があれば記事にします。
実行環境
- ubuntu16.04.1(elementary OS 0.4.1 Loki)
- Docker version 17.12.0-ce
準備
わかりやすいようにディレクトリの準備をします。
$ cd ~ && mkdir docker-practice && cd !!$ && touch Dockerfile
homeディレクトリに移動してdocker-practiceディレクトリ作成&移動、Dockerfileを作成します。
FROM命令
DockerfileではコンテナはどのDockerイメージから生成するかという、「ベースイメージ」が必要なので、それをFROM命令で書いてあげます。
FROM イメージ名 or FROM イメージ名:タグ名 or FROM イメージ名@ダイジェスト
上記の形で書きます。
が、上2つだけ覚えておけばとりあえず大丈夫です。
たとえば、最新のubuntuイメージを取ってきたい場合は
FROM ubuntu:latest
でおk。超簡単。
試しにイメージを作ってみますか。
docker build -t <イメージ名> <Dockerfileのディレクトリ>
で実行してみる(<イメージ名>:<タグ名>でタグをつけることができます)。
# 作成したDockerfileと同じディレクトリにいるはずなので"."でおk $ docker build -t test . Sending build context to Docker daemon 2.048kB Step 1/1 : FROM ubuntu:latest latest: Pulling from library/ubuntu d3938036b19c: Pull complete a9b30c108bda: Pull complete 67de21feec18: Pull complete 817da545be2b: Pull complete d967c497ce23: Pull complete Digest: sha256:9ee3b83bcaa383e5e3b657f042f4034c92cdd50c03f73166c145c9ceaea9ba7c Status: Downloaded newer image for ubuntu:latest ---> c9d990395902 Successfully built c9d990395902 Successfully tagged test:latest
まあまあ時間かかりました。
ちゃんとDockerfileを元にイメージが作成されているか確認してみる。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test latest c9d990395902 2 days ago 113MB ubuntu latest c9d990395902 2 days ago 113MB
できてますね。
他のディレクトリにあるDockerfileを指定する時は、ディレクトリパスをdocker buildの最後に書いてあげてください。
今書いたDockerfileを元に別のイメージ名にしてdocker buildしてみると、前よりかなり早くbuildが完了するはず。
これは、ubuntu:latest
のベースイメージがローカル環境にダウンロードされているためです。
同じイメージを使用するときはかなり早くbuildできます。
RUN命令
コンテナ上で実行するコマンドの命令です。
CentOS系のyumとUbuntu系のapt-getを元に検索かけていけばいいと思いますよ(多分)。
さっきのイメージを元にApache
を入れてみたいと思います。
FROM ubuntu:latest # apt-getパッケージ管理のupdateとapache2のインストール RUN apt-get update && apt-get install -y apache2
※ apt
コマンドは使えませんでした。
↑
いけたけど、WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
が出てあんま推奨されてないっぽい。
じゃあbuildしましょう。
# リビルドするときはタグ名を後ろにつけたらおk $ docker build -t test:latest . ・ ・ ・ Step 1/2 : FROM ubuntu:latest ---> c9d990395902 Step 2/2 : RUN apt-get update && apt-get install -y apache2 ---> Using cache ---> 5a2551cf2ad8 Successfully built 5a2551cf2ad8 Successfully tagged test:latest
ちょっと確認
本当に入っているかどうか、コンテナの中に入って確認してみます。
$ docker run -it c9d990395902 /bin/bash #
これでさっきのイメージIDを元にコンテナの中に入れます。
# apache2 -v Server version: Apache/2.4.18 (Ubuntu) Server built: 2017-09-18T15:09:02
ちゃんとApache入ってました\(^o^)/
ここでctrl + p + q
を押せばコンテナを起動したまま出ることができますが、今回はその必要もないのでexit
コマンドで出ます。
exit
だとコンテナ起動と終了を一緒にやってくれます。
ちなみに
直接コンテナに入ってから、apt-get
で何かパッケージをインスコした場合、exitで出てしまうとそのインスコはなかったことになります。
これは、imageがbuildした際の状態を保っているからです。
なので、「あれ〜この前インスコしたのになぁ〜」ってなったときはこの可能性が多いです。
要注意です。まじで。
CMD命令
デーモン実行。
イメージを元に生成したコンテナ内でコマンドを実行するために使うやつ。
ちなみにこいつはDockerfile内で一つしかかけない。複数書いた場合は、最後のだけが実行される。
さっきのDockerfileの最後に、Apacheサーバーを立てるコマンドを記載してみます。
FROM ubuntu:latest # apt-getパッケージ管理のupdateとapache2のインストール RUN apt-get update && apt-get install -y apache2 # デーモン起動 CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
ここでちょっと詰まったのですが、デーモン起動の際に/usr/sbin/apache2
では起動しませんでした。
要注意です。
CentOSの場合は/usr/sbin/httpd
です。
コンテナを起動
docker run
でポート指定(-p
オプション) & デタッチド(-d
オプション)で起動します。
$ docker run -d -p 80:80 test or $ docker run -p 80:80 -d test
長い文字列が出ると思います。
なにか問題があればメッセージが出るはず。
本当に起動してるか確認しましょー。
docker ps
コマンドで。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78fe3aafeada test "/usr/sbin/apachectl…" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp nervous_morse
動いてなければここで表示されないです。 今回はちゃんと表示されているので問題なしです。
特定のものだけ表示したい場合はフォーマットを指定すればおk。
例えばこんな感じ。
$ docker ps --format={{.Image}} {{.Command}} {{.Ports}}
こうすれば、イメージ名と実行したコマンド、ポートが表示されます。参考程度に。
画面の確認
ポートを80 -> 80
に開放しているので単純にlocalhostでアクセスできます。
問題なさげ!
終わり
次回はファイルの追加やボリュームの指定、ポートのエクスポート等を簡単なDockerfileを元に作成したいと思います。
みんなDockerfileかけるようになろう(自問自答)。
ubuntuで初めてのDockerfile
今まで人が作ったDockerfileを使ってdocker build
していてほとんど触れていなかったのですが、それもDockerfileを作るのが難しいという勝手な苦手意識からでした。
ですがそうも言っていられないので、もっとdockerとお友達になるために超簡単なDockerfileを作成してみたいと思います。
環境
- ubuntu16.04.1(elementary OS 0.4.1 Loki)
- docker 17.12.0-ce
予想以上に簡単だった
最近Linuxに触れたからというのもあるとは思うのですが、結構簡単でした。
UNIXコマンドをDockerfileに書くことが多いので、Linuxの知識がある前提です。
Macでも同じようなコマンドが使えるのでLinuxを触っておいて損はないと思います。
てか、MacでubuntuやらCentOSやらのコンテナ立ててシェルに入ってコマンドの練習すればいいんじゃないですかね。
winは知らん。
Dockerfileを作成する
それぞれ命令の意味はリファレンスが一番わかり易いと思います。
Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
なんか適当なディレクトリを作ってそこにDockerfileを作成します。
$ mkdir ~/docker-pratice && cd !!$ && touch Dockerfile
ベースイメージをCentOS7にしてapacheでサーバーを立ててみます。
$ vim Dockerfile FROM centos:centos7 RUN yum install -y httpd CMD ["usr/sbin/httpd", "-D", "FOREGROUND"]
多分これでおk。単純にCentOS上でapacheをインストールしてサーバー立てる命令を入れただけ。
ビルドするぞお
$ docker build -t docker-practice . ・ ・ ・ Complete! Removing intermediate container 1f221c2502d5 ---> 328e4875d499 Step 3/3 : CMD ["usr/sbin/httpd", "-D", "FOREGROUND"] ---> Running in 20abda19727c Removing intermediate container 20abda19727c ---> 9f2a89281a6a Successfully built 9f2a89281a6a Successfully tagged docker-practice:lates
ビルド成功したのでイメージが作成されているか確認。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-practice latest 9f2a89281a6a 52 seconds ago 334MB
いけてますね\(^o^)/
作成したdockerイメージを起動する
先ほどのイメージでapacheコンテナを立てます。デタッチドでポートを指定して起動すれば行ける。
$ docker run -d -p 80:80 docker-practice
本当に起動しているのかわからんので一応確認。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 754fab174a33 docker-practice "usr/sbin/httpd -D F…" 10 seconds ago Up 9 seconds 0.0.0.0:80->80/tcp gifted_boyd
おお動いてますね。
これでlocalhostにアクセスしてみる。
いけました\(^o^)/
最後に
立てたサーバーのコンテナは閉じるのを忘れないように。
$ docker stop 754fab174a33 #=> docker psで出てきたコンテナID
とりあえずここまで出来たらDockerfile作成できるって言っていいんじゃね?とか偉そうなこと思ってみたりする。
ubuntu(elementary OS)16.04.1へdocker-composeをインストール
前回のつづき的な感じです。
というか書き忘れてました\(^o^)/
リファレンスの言うとおり
以下を参照。
Docker Compose のインストール — Docker-docs-ja 17.06.Beta ドキュメント
最新のdocker-composeをcurlで取ってきます。
1.21.0-rc1がプレリリースされてますが安定しているかわかんないので一個前のやつにします。
$ curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose bash: /usr/local/bin/docker-compose: 許可がありません
許可がないみたいなので、sudoでやっちゃう。
$ curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` > sudo /usr/local/bin/docker-compose #=> まあまあ時間かかる
いけた!
docker-composeに対して実行権限を与えます。
$ chmod +x /usr/local/bin/docker-compose
ここでchmod: '/usr/local/bin/docker-compose' にアクセスできません: そのようなファイルやディレクトリはありませんと言われました。
見てみると、docker-composeファイルが存在しない。
てなわけで、root権限でcurlします。
$ sudo -i # curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose # exit #=>root権限から抜ける
確認
$ docker-compose -v docker-compose version 1.20.1, build 5d8c71b
無事docker-composeが入りました。
引き続きdocker教科書をやっていきまっす。