くりーむわーかー

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

その他もろもろ

CypressとJestのカバレッジをマージする

以前、Nuxtの単体テストをCypress使ってやる奴を書きましたが、実際にやってみてこれはこれでつらかった。

やっぱりメソッドとか簡単な部分はJestというかVue-test-util使ってちょこちょこっと書けた方が良い。

でもやっぱりあれこれやり始めるとVue-test-utilだとつらい・・・。

じゃー、使い分ければいいじゃんと。

で、そういう時に問題になるのが、カバレッジのマージ。

nycはいちをそれも出来るんだけど、マージの仕方が何か微妙な気がするのですが・・・。

どっちかにあるものの、MAXで見るか、平均で見るかって感じ?

単純に通ったコードのカウント部分マージしてくれればいいんだけどなー。

何でこういう感じになってるんだろ?何かやり方が間違ってるのかしら?

公式にも載ってるサンプルのリポジトリと同じやり方してみても、上手くいかない。

というか、ぶっちゃけ現状バグってますよね?istanble-lib-coverageがおかしいのかしら?色々やってみると大体結局↓のエラーが出る。

TypeError: Cannot read property 'start' of undefined

多分これ、coverage.jsonのファイルって下の感じの定義じゃないですか。

statementMap:{
 "0":{
     start:1,end:1
  },
 "1":{
     start:2,end:2
  }
},
s:{"0":3, "1", 4}

で、sのオブジェクトがstatementMapの定義してる行数を通った回数になってると思うのですが、

マージすると、statementMap側に存在しないキーがs側に出来る場合があるっぽ。

ダメじゃん。

同一ソースなら一緒になるはずなのですが、

jestとcypressで微妙に定義の仕方が違うん場合があるんですよね。行数は一緒なんですけど。


なので、cypressとjestの組み合わせ限定ですが、coverage.jsonをマージするスクリプトを作った。

別に大した事はやってないのですが、だいぶ面倒くさいところなので、何かに使えれば参考にどうぞ。

下記にあげました。

https://github.com/n79s/cy-jest-coverage-merge

10億人が笑うSVGからナゼか正規表現の話

Billion laughs攻撃っていうのがある。

XMLで参照を多重に定義して、メモリを食いつぶさせてPCとかアプリを固まらさせるやつ。

で、これってSVGでも可能だったんですね。

下の画像をFireFoxで見るとFireFoxのタブが固まる。(Chromeは大丈夫だった)

https://github.com/cirosantilli/web/blob/master/svg-billion-laughs.svg

上の画像をDLして、例えばパワーポイントとかに画像挿入しようとするとパワポも固まる。


上の画像のソースを見ればわかりますが、この程度の参照の組み方だけで、

組み合わせ爆発でヤバイ事になるという訳なんですが、

参照をネストさせるようなものはやっぱり考え物って事ですね。

正規表現なんかも、例えば

(a|b|c)(e|d|f)

みたいに組み合わせで色々やるとエライこっちゃになるパターンがあったと思う。

↑だけじゃ再現させられなかったんですが、昔どこかのコードで見たんだよなー。

組み合わせ爆発って怖いですね。結構意識せずにやっちゃいそうな気もする。


正規表現でいうとMSDNの正規表現のベストプラクティスのページがすごく面白かった。

長さが 5 文字を超えると、文字列の文字が 1 文字増えるたびに処理時間が約 2 倍に増加します。 つまり、有効に近い文字列の長さが 28 文字になると処理に 1 時間以上かかり、33 文字になるとほぼ 1 日かかることになります。

確かに正規表現作ってる時って、正しい文字列ばっかり考慮してるきらいがありますよね。

「*」とか「+」とかのネストとかもやばそう。

正規表現だと楽ーとか早いとかいう話は良く見聞きしますが、

やっぱり一概にそうも言えないですよね。

MariaDBのクエリログ

完全にメモ。ささっと確認したい時にいっつも忘れる。

SET GLOBAL general_log=1;
SET GLOBAL log_output='TABLE';
SELECT * FROM mysql.general_log\G

戻すときは0にセット。

FILEの場合は多分この辺り。

/var/log/mysql/mariadb.log

公式DOC

AWSにVMイメージをインポートしてインスタンス作る(WindowsServer 2003)

WindowsServer2003という古のOSがありまして、

そのVMイメージをAWSで動かせるのかというお試し。

結果から言うととりあえず動かせはした。


VMインポートの手順は大まかに下記の流れ。

1. VMをエクスポートしておく
2. S3にバケット用意(既存を使うならそれはそれで
3. IAMで作業用のユーザ作っておく
4. aws cliをインストールしてconfig
5. aws cliでロールとか作る
6. aws cliでS3にVMイメージをアップロード
7. aws cliでアップロードしたイメージをAMIに変換
8. AMIからインスタンスを起動

基本的に公式のココのページ通りやっていけば大丈夫。


1. VMをエクスポート

色々やり方あると思うのですが、基本的にこのページのやり方でやらないとだめ。

2. S3にバケット用意

これはS3のサービス開けば問題ないでしょう。

3. IAMで作業用のユーザ作っておく

既存のユーザでも問題ないですが、後続のaws cliでアクセスキーとシークレットアクセスキーを使うのでそれが分からない場合は作るしかないかなと。

色々面倒そうなので、adminグループのユーザ作ってやった。。。

4. aws cliをインストールてconfig

公式のインストールのページから。windowsでやるのでwindows用をDLしてインストール。v2でやる。

インストールできたら、コンフィグ。

aws configure

> AWS Access Key ID [None]: *******
> AWS Secret Access Key [None]: *******
> Default region name [None]: ap-northeast-1
> Default output format [None]: json

東京リージョンは ap-northeast-1
5. aws cliでロールとか作る

公式のドキュメント

  • trust-policy.jsonを作成
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}
  • JSON作ったら vmimport っていう名前で作成
aws iam create-role --role-name vmimport --assume-role-policy-document "file://C:\work\trust-policy.json"
  • role-policy.json を作る
{
    "Version":"2012-10-17",
    "Statement":[
       {
          "Effect": "Allow",
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket" 
          ],
          "Resource": [
             "arn:aws:s3:::ines-wr-tempdata",
             "arn:aws:s3:::ines-wr-tempdata/*"
          ]
       },
       {
          "Effect": "Allow",
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:PutObject",
             "s3:GetBucketAcl"
          ],
          "Resource": [
             "arn:aws:s3:::ines-wr-tempdata",
             "arn:aws:s3:::ines-wr-tempdata/*"
          ]
       },
       {
          "Effect": "Allow",
          "Action": [
             "ec2:ModifySnapshotAttribute",
             "ec2:CopySnapshot",
             "ec2:RegisterImage",
             "ec2:Describe*"
          ],
          "Resource": "*"
       }
    ]
 }
  • JSON作ったら vmimport に反映
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://C:\work\role-policy.json"

※ローカルのファイルパスはフルパスで作ったJSONファイルを指定。

6. aws cliでS3にVMイメージをアップロード

下記の感じ。

aws s3 cp "C:\work\hogehoge.disk1.vmdk" s3://work/vm

vmdkだけあればよいっぽいけどとりあえずエクスポートで作られたファイルは全部上げた。

7. aws cliでアップロードしたイメージをAMIに変換
  • containers.json ファイルを作る
[
  {
    "Description": "Disk01",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk1.vmdk"
    }
  },
  {
    "Description": "Disk02",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk2.vmdk"
    }
  },
  {
    "Description": "Disk03",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "work",
        "S3Key": "vm/hogehoge.disk3.vmdk"
    }
  }
]

vmdk複数ある場合は↑の感じ。

  • インポートする
aws ec2 import-image --description "HogeTestVM" --disk-containers "file://C:\work\containers.json"
8. AMIからインスタンスを起動

インポートが終わったら、AMIにイメージが出来てるのでそれを選んで起動すればOK。


ここまでで、大体動くようにはなってると思う。

ただ、本当はここから下記の設定をした方がよいっぽい。

インスタンス上げてみてみると、EC2Configの方は勝手にインストールされてた。

ただ、ENAとNVMe のドライバーのインストールはWindowsServer2003では不可能っぽい。

何でかって言うとPowerShellが2.0しか入れられないから。

がんばれば3.0以降も入るのかな?どこかで2003は2.0しか動作しないような事を見た記憶ががが...

ENAとNVMeはあきらめましたとさ。

でも、とりあえず動いてはいる。

顧客向け用の環境としてはあり得ないんだけど、開発用でどうしても一時的に必要な状況はあるので、何かの参考に置いておきます。

windows server 2003をAWS上に復元するのとか検索しても全然出てこなかった。

まーやる人なんかいないですよね。。。

AWSのWindowsサーバを日本語化する

デフォでローカルが英語なので日本語化したい。

前は設定から日本語選べば自動的に言語パックDLして適用してくれたみたいなのですが、

最近はやってくれない模様。そのうち治るのかしら?


①インターネットオプションで信頼済みサイトに下記

https://*.microsoft.com

➁IEのURLに下記を入れて直DL


https://software-download.microsoft.com/download/pr/17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso

➂上記をダブルクリックで「Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab」がある事を確認。

④Windowsキー + Rでファイルを指定して実行:langpacks

⑤で、上記のja-jp.cabを選択してインストール

⑥ウィンドウズキー⇒設定⇒言語

⑦言語でAddからjapaneseを追加

⑧あとはリージョンとか適当に設定。

20200716追記

⑨コンパネから行く地域も日本にしないとダメでした...


言語パックのDLってMicrosoftのページに無いのかしら。

見つけられなかったのですが...

プログラミング言語 最近の流行り廃り 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のwikiに載ってた。(20200704追記)

コメントありがとうございます。

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

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

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

ami-01

ami-02

ami-03

動かしてみよ。。。

以下、当初に書いたもの。


まだ無いらしい。

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版ってどうなんでしょ。開発に貢献したい人用な感じがするので、手を出すのはちょっと躊躇する。。。

VirtualBox CentOS7のディスクを拡張する

タイトル通り。やり方はググれば色々出てくるのですが、何となく古い気がするので記載。

コマンドで拡張して、OSに認識させてー。みたいな感じなのですが、

今のVirtualBoxなら拡張はGUIからいける。

ファイル⇒仮想メディアマネージャー。

vbox01

拡張したいvdi選択して、プロパティクリック⇒増やしたいサイズに変更して適用。

vbox02

これでディスクの拡張はおしまい。楽。

そしたら、拡張した分をOS側に認識させる。

CentOS7だったら、上記拡張後に左上のアプリケーション⇒ユーティリティ⇒ディスクで拡張分の

ディスクサイズが未使用領域として見えてるはず。これを使えるようにする。


ここから先は「root」でやる。

fdiskで対話的に作業する。これってGUIで作業できないんだろうか。。。


$ fdisk /dev/sda

コマンド (m でヘルプ): p  #テーブルの確認はp
コマンド (m でヘルプ): d  #dでいったん現状のメインのパーティションを削除
パーティション番号 (1,2, default 2): 2  #大体2番になってると思うけど↑で出た一覧参照
コマンド (m でヘルプ): n # 新しいパーティションを作成
Select (default p): p #プライマリ
パーティション番号 (2-4, default 2): # 2でよいのでエンター
Last sector, +sectors or +size{K,M,G} (2099200-62914559, 初期値 62914559): #デフォでよいのでエンター
コマンド (m でヘルプ): w # 保存して終了

# 終わったらOS再起動

途中で削除してて、最初ビビったんだけど、設定変えてるだけだからデータは大丈夫らしい。

起動し終わったらLVMの再設定。

$ pvresize /dev/sda2
$ lvextend -l +100%FREE /dev/centos/root
$ xfs_growfs /dev/centos/root

早すぎる最適化 Computer Programming as an Art

クヌースさんのチューリング賞受賞時のスピーチ?

「早すぎる最適化は諸悪の根源」ってクヌースさんの割と有名な格言?みたいなものがある。

原本読むと、別にここだけが大事な話じゃないよね?って思ったのと、

色々思ったので残しておこう。

原本


最適化ってそこそこ広い意味があるように思う。

クラス構造を整理するのも最適化って言ったりするし、、、

クヌースさんが言うところだと、パフォーマンスとかメモリ効率の

チューニング的な意味だと思う。

で、そういう対応するためのコードってかなり複雑な処理になりがち。

「このメソッドの中でインスタンス化してるの無駄が多いかな~」

とか

「ここはこういう使われ方をする”かも”しれないからこうしておこう」

みたいな。

そういうことを初期の段階から考えるべきじゃないよって感じ?

最初から完璧な状態を作ろうとするんじゃなくて、変更とかテストが簡単に出来るように、

今この時点での要件を満たすようにコードを書くようにする みたいな。

必要なコトを必要な時に必要な分だけやる みたいな。

完璧なモノは最初から作れないんだから、変更しやすいように組んだ方が良いよね。

で、「ここは遅くなるかなー」って思ってたところでも、

実際にはたいして全体には影響がほとんどないでしょ。って事がよくある。

そういう推測だけでのあーだこーだには対して意味がないから、

作った後に、解析用のツールとか使ってどこにボトルネックがいるかを

ちゃんと実測してから性能的なチューニングをしようねと。

「推測より実測」が大原則だよねと。

っていう話だと思うのですが、そーはいっても、ある程度の性能的な観点は

最初っからやっといた方がよいと思う。

例えば、ループの中でSQL毎回発行して、画面開くたびに100回クエリ発行してるとか

ほったらかしにしてると、結構よく出てきません?

このくらいの意識は持った方が良いとは思う。

で、早すぎる最適化はそんな感じなんだけど、原本読んでみると、

それよりもぐっと来たのがあったのでそっちを書いておきたい。

『誰もが「最良の」スタイルは存在しないことを覚えておくことが最も重要です。』

つまりは、

『芸術は分かんないけど、これが好きなのはわかる』

って事。

コーディングのスタイルってたまに聞くけど、

良いスタイルとは何だろう、悪いスタイルは何だろう。

他の人が作った作品について厳しく批判するべきじゃないでしょう。

みんな自分の好みがあるからね。

他人の好みを「変革」するために自分の「偏見」を押し付けると、

良かれと思って指摘しててもそれはその人の好みを無意識に否定しちゃう。

それって楽しくないよね。

その人は自分が美しいと感じモノをその人なりに作ってるんですよ。

そう感じたものが他の人からも有用だと思って貰えたならそれは素晴らしい事だよね。

創造性の余地を残したい。

何かこう、色々見てると、あーしなきゃだめ。こう書いたらダメ。

こう書いてるやつは分かってないとか、デザインパターンが~、とかとか。

プログラミングは確かに型にはめるとすごく楽だし、

多分きっと、生産性も品質も良くはなるんでしょう。

でも、つまんなくね?

その型を考えた人は楽しいかもしれないけど、

やらされてる方は、毎回毎回同じ感じのコード書くだけになるので

はっきりいって苦痛。

こういう統制がとれた美しさみたいなものもあるでしょうし、

そこが美しいと感じる人もいるでしょう。

でも、つまんなくね?

って、自分もそういう枠組みを考える側なのですが、

どうにかして、実際に作ってる人、個々人の創造性みたいなものを

出せるような感じにしたいのです。

ただ単に自由にさせるだけじゃもちろんダメなんですけど、、、製品としてはね。

確かに、ある側面では明らかにダメな実装っていうのは一杯あると思いますが、

それを書いた人が、何でそう書いたのか、それが何でいいと思ったのかは

ちゃんと聞いてみないとですよね。。。

まーでも、コピペでしかPG書いたこと無いような人も結構いるし、

創造性を出せるようにーとか自分が鼻息荒くしたところで、って感じもする。

プログラム作る事を楽しんでないとやっぱダメよね。

「we ought to give the programmer-user a chance to direct his creativity into useful channels.」

プログラマーが自分の創造性を有用なチャンネルに向ける機会を作りましょう。

CentOS8をVirtualBoxでインスト、ついでにMariaDBとRedis

CentOS8が出てたので、VirtualBoxでとりあえずインスト。

centos8のisoをDL

現時点で「CentOS-8-x86_64-1905-dvd1.iso」

VirtualBoxで適当に作成。

新規作成で枠を作ってから、設定でストレージ⇒コントローラ:IDE⇒CDマーク押してDLしたISOを選択してから起動。

インストールの流れはCentOS7と変わらずかな?

ソフトの選択でサーバGUI選ぶのかワークステーション選ぶのか迷うくらい?

そーいえば、.netCoreの開発みたいなアドオンが出てた。あとで試してみよ。

そしたら色々更新。

dnf -y update
dnf -y install epel-release
dnf -y groupinstall "Development Tools"
dnf -y install dkms bzip2 gcc make kernel-devel kernel-headers

CentOS8からyum ⇒ dnfに変わったらしい。

「yum install」でも動くんだけど、dnfへのリンクになってるだけなんだってさ。

で、GuestAddtionのインストールをするのですが、

前はデバイス⇒GustAddtion選んでたと思うのですが、やってみるとエラー。

何でかなと思ったらどうも既にCDが入ってる事になってるらしい。

なので、アクティビティ⇒ファイルでVBox_Guest~~みたいなのがあるので選択してソフトウェアの実行すればOK。

割とハマらずにウィンドのリサイズとかクリップボードの共有とかできるようになってる。

よかたよかた。

ほいで、CentOS8はPython3がデフォになってるそうで。

でもコマンドが「python3」みたいなので、うーん。

いつも通り仮想環境作るか。。。

そしたら色々触ってみましょかね。。。

ひとまず、MariaDBとRedisをインストする。

MariaDB

MariaDBなんだけど普通にやるとまだCentOS8に対応してないよーって出る。

なので↓。

# dnf localinstallで必要なrpmをもってくる
curl -O https://downloads.mariadb.com/MariaDB/mariadb-10.4.8/yum/centos/mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍
tar xvf mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍先に移動
cd mariadb-10.4.8-rhel-8-x86_64-rpms

# インストール
sudo dnf localinstall -y galera-4-26.4.2-1.rhel8.0.el8.x86_64.rpm MariaDB-client-10.4.8-1.el8.x86_64.rpm MariaDB-common-10.4.8-1.el8.x86_64.rpm MariaDB-server-10.4.8-1.el8.x86_64.rpm MariaDB-shared-10.4.8-1.el8.x86_64.rpm

# サービスの有効化と起動
sudo systemctl enable mariadb
sudo systemctl start mariadb

# rootのパスワードとかの設定(最初にパスワード聞かれるけど、空のままエンター)
sudo mysql_secure_installation

#いちを再起動
sudo systemctl restart mariadb

MariaDBは10.4.8じゃないとCentOS8で動かせない様子。

新しい分には別に良いか。。。

Redis

Redisは何か楽になった。

Redis5.0っぽい(2019/11/2)

# インストはこれだけでイケた
sudo dnf install -y redis

# サービスの有効化と起動
sudo systemctl enable redis
sudo systemctl start redis

# 動作確認
redis-cli

# ↑のクライアント上で↓打って PONGって出てくればOK
ping

# いったん抜ける
exit

# ちょろっと設定
sudo vi /etc/redis.conf 

bind 127.0.0.1
↓
bind 0.0.0.0

requirepass  <パスワードを入れる>

# 再起動
sudo systemctl restart redis

# もう一回クライアント
redis-cli

# pingでこんどは「(error) NOAUTH Authentication required.」って出ればOK
ping

# そしたらログイン
auth <上で指定したpassword>

# もっかいpingで、PONGって出ればOK
ping

両方ともインストールはなんか楽になりましたね。。。

問合せ