くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2020年05月

プログラミング言語 最近の流行り廃り 2020

前に見てたの思い出したので今年(もう去年か)はどうなったのか確認してみた。2020のアンケートもそろそろ出るんじゃないかと思うんだけど、まだ2019までしかなさそうですね。


2020/5/28

と思ってたら昨日出てた。見た目すごい気合入ってる。

https://insights.stackoverflow.com/survey/2020


Googleトレンド

sample

まだ、Pythonの方が検索されてるのね。どこかでhaskelみたいな関数型やんなきゃダメだろーみたいな事言ってる人見たのでhaskelどんなもんかと思ったのですが、結構全然アレなのかしら。

StackOverFlowのアンケート(2020)

https://insights.stackoverflow.com/survey/2020

言語でまとめ

pg-order

フレームワークでまとめ

fr-order

プログラミング言語

sample-pg

去年からJavaをPythonが抜かしたのね。

WebFramework

sample-fr

jQueryは根強いですね。一時代を築いただけの事はある。レガシー的に残ってるのか、全然まだ第一線なのか。Angularも叩かれてる印象が強いのですが、使われ具合だとまだまだ健在?

MostLovedを見るとReactとVueがほぼっぽいし、jQueryはレガシー扱いになってそう?そもそも考え方違うしケースバイケース的なやつ?とりあえずの流行りはReactとVueでしょうか。

好きなフレームワーク

sample-loved-fr

嫌いなフレームワーク

sample-dreaded-fr

Database

sample-db

MySQLがちょっと復活。やっぱり一強。DBランキングだとOracle強いんだけど何でなんでしょ。対象にしてる人達が違うのかな?

MariaDBは個人的に頑張ってほしい。

Platform

sample-pf

開発者さんたちの環境的にはLinuxとWindowsって均衡してるんですね。世の中的にはWindowsダントツだったと思うけど。

そういえば、dockerってどうなんでしょ。たしか日本のdocker本番利用って15%くらいで伸び悩んでましたよね。あと、docker自体もクラウド環境での基盤?事業は売却して、開発者向けに注力するみたいなのをどこかで読んだ気がする。dockerは開発者さんのローカル環境で生き残ってく感じになるのでしょうか?CentOS8なんかも標準でPodmanになったみたいですし。先行き不透明。


Pythonの勢いはまだまだ健在?やっぱWebはjavascript祭りですね。ReactよりVue好きなんだけどなー。どっちも良いのですが。何かVueの方が好き。そういえば、nuxtのcore-js3.0で動かない問題はどうなるんだろうか。core-jsのメンテナ不在らしいですね。OSSのリスキーな面が推されちゃってる感じ。

あと、アンケート結果のMostLovedにも載ってたけど、Rustが割と良さそうな感じがするので、ちょっと本腰入れて使ってみようかな。。。

AWS CentOS8の公式イメージ

まだ無いらしい。

CentOSのForum上でも微妙に話題になってはいる。

誰かやってくれ~みたいな感じ?

今のところ、MarcketPlaceに2つの会社が上げてくれてる。コミュニティ上にも何個かはある。

ただ、公式イメージはない。

現状、自分でやる場合は↓の「CentOS-8-ec2-8.1.1911-20200113.3.x86_64.qcow2」使って自分でAMI登録しなさいって事みたい。

https://cloud.centos.org/centos/8/x86_64/images/

コミュニティ上のやつは、上げた人が自分用に作ってる感じなので、不要なパッケージとかも入ってたりするので、ちょっと微妙?まー十分ありがたいのですが。

日本人的に「公式」って言葉に弱いので、そろそろ対応して貰えると嬉しいんだけどなー。

あと、Stream版ってどうなんでしょ。開発に貢献したい人用な感じがするので、手を出すのはちょっと躊躇する。。。


20200704追記

コメントで教えていただきました。ありがとうございます。

今のところCentOS8の公式イメージはココに載っているAMIで提供してる模様。

東京リージョンなら↑のページのAMIのIDコピーして、AWSのAMIで検索して起動すれば、

とりえあず起動はいけました。

ami-01

ami-02

ami-03

動かしてみよ。。。

Nuxtの開発環境をDockerで

DockerでNuxtのローカルの開発環境作りたくなった。

やってみたのですが、なかなか思い通りにいかなかったので記載。

やりたい事としては、nodeとかnode_modulesとかはdocker側において、ソースはローカル。

で、ローカルのソースを修正したら、nuxtというかVueのホットリロードを動かしたい。

ひとまずソースの構成。

.
├── app
│   ├── Dockerfile
│   └── webapp # nuxtのアプリ
└── docker-compose.yml

nuxtのアプリを作る

cd app
npx create-nuxt-app webapp # 質問は適当に動けばとりあえず。。。

で、ここでは「npm install」はしない。やった場合は後述。

Dockerfile

FROM node:14.1.0-alpine

WORKDIR /app

# 多分、nuxt動かすだけなら、@vue/cliとか@vue/cli-initはいらないと思う。
RUN apk update && \
    npm install -g npm && \
    npm install -g @vue/cli && \
    npm install -g @vue/cli-init && \
    npm install -g create-nuxt-app

ENV HOST 0.0.0.0

CMD ["npm", "run", "dev"]

Docker-compse

version: '3'
services:
  webapp:
    build: ./app
    ports:
      - 13000:3000
    volumes:
      - ./app/webapp:/app
    tty: true

ホスト側のPortは適当に。tty:trueはあっても無くてもどっちでも。docker内のコンソール出力を全部見たいのでひとまず付ける。

そしたら「docker-compose build」

build終わったら下記でコンテナ内で「npm install」する。

docker-compose run webapp ash
npm install
exit

そしたら「docker-compose up」

これで、上記のポートの割り当てだったら「http://localhost:13000」でnuxtのデモ画面が出る。

そのまま、ローカルのファイルを修正すればDocker側にも反映されてホットリロードされると。

全ソースはここに上げてます


で、ここから出来なかった事。

本当はbuildのところもdockerfile側に置きたい。↓の感じ。

COPY ./webapp/package.json /app/package.json
COPY ./webapp/package-lock.json /app/package-lock.json
RUN npm install

↑は上手くいくのですが、nuxtの実行をすると、「.nuxt」ってディレクトリ作られるじゃないですか?

こいつがかなりやっかいで、実行時に動的に作ってるらしく、ローカルのディレクトリと共有してると権限がおかしくなって動かなくなるのです。

dockerignoreとかマウントしてからvolumeで部分的に上書きして~とかローカルのuidと合わせて~とか色々やってみたのですが、どうにも上手くいかない。

今のところ上手くいった方法が上述のnpm installはbuild後にupする前にコンテナ内で実行しておくという手順。

んーカッコ悪いんだけど、開発環境としてローカル側にソース置きたい場合はこれしかやりようがなさそう。


途中でnpm installとかnpm run devしちゃって「node_modules」「.nuxt」出来ちゃってる場合はコンテナ内に入る前に全部消す。

sudo rm -rf .nuxt
sudo rm -rf node_modules

Python Djangoで単体テストの結果をマージ

Djangoで単体テストやってる時の話。規模が大きくなると実行対象分割して実行させたくなる。分割の仕方は色々あると思うので割愛。

で、分割実行した場合って結果のcovrageとかも分割されるので、結果をどうにかマージしたい。

jenkinsなんかに表示させてる場合、xunit形式の結果と.coverageが必要になる。

これをどうマージするのかという話。


coverage

Coverage.pyというのがあり、それを使う。というかDjangoの中でも使ってる模様。

普通の単体テストは「python manage.py test」みたいに実行すると思うのですが、

色々やりにくいので、Coverage.pyを通して実行するように変える。↓の感じ。

coverage run --source='.' manage.py test app/tests

で、これだとcoverageのデータファイルが全部「.coverage」になっちゃうので、ファイル名を変えるために下記にする。

COVERAGE_FILE=.coverage_datafile coverage run --source='.' manage.py test app/tests

環境変数の「COVERAGE_FILE」にファイル名指定しておいてから実行するらしい。

そうすると分割したテスト毎にファイル名固定出来るのであとはそれを最後に下記でマージする。

coverage combine .coverage_*

「.coverage_」でファイルを全部指定みたいな。上を実行すると「.coverage」ってデータファイルにまとまるので、あとは、「coverage html」とか「coverage xml」何かで必要なレポート形式に変換する。


xunit

xunitも同様にマージが必要。とりあえず、テストの実行時に下記のオプション指定して結果のファイル名を実行毎に指定してあげる。

manage.py test app/tests/target --with-xunit --xunit-file nose_result_xxx.xml

そしたら、こっちも実行毎にファイルが出来るので、これをマージする。

で、pythonでこれをマージするツール無いかなーって探してみたのですが、下記しかない。

https://pypi.org/project/xunitmerge/

ただ、このツール開発止まってるぽくて更新6年くらい止まってるんですよね。。。

ついでに、python3系で出来ない書き方してるようでそのままだと動かない。

下のプルリクの修正が必要みたい。

https://github.com/miki725/xunitmerge/pull/9

本体に取り込まれる事は無さそうな気がするので、自分でリポジトリ作ってそっち直して、そっちからPIPでインストールする。

GitHubとかGitLabとかリモートリポジトリからpipインストールする場合は↓の感じ。

※別に直で実行してもOK。

pip install  -b release git+https://github.com/***/***/xunitmerge

実行できるようにしたら、下記でマージする。

xunitmerge nosetests_*.xml nosetests.xml

「nosetests_」で始まるファイルを「nosetests.xml」にマージするみたいな。

あとはこれらをjenkinsなりに食わせればOKという寸法です。


最終的にDjangoのtest実行する時のコマンドはもろもろオプションとかつけた感じにすると下記の感じ。

COVERAGE_FILE=.coverage_datafile coverage run --source='.' manage.py test app/tests --settings=dapp.settings_hoge.py --keepdb --with-xunit --xunit-file nosetests_xxx.xml

問合せ