Saturday, March 28, 2020

NYC新型コロナの人口との比較

NYCの新型コロナ肺炎の感染状況がNYCから毎日発表されています。
現場の皆さんが大変苦労して対応されている中、取得した情報から毎日の状況をアップしてくださっているので大変ありがたいことです。
https://www1.nyc.gov/site/doh/covid/covid-19-main.page

ただ、発表されている数字がそれなりに加工されてしまっているので、実際にどういう状況なのか分かりづらいので私なりに状況をまとめ直してみました。

NYC市の年齢別人口
2020年の統計はありませんので2016年のデータを近似値として使いたいと思います。
元ネタ:https://www.baruch.cuny.edu/nycdata/population-geography/pop-demography.htm
From AgeTo AgeNumber
04553277
59496622
1014467016
1519466963
2024588268
2529804436
3034728985
3539625351
4044550081
4549553115
5054553489
5559530749
6064464246
6569388657
7074265894
7579199912
8084139369
85max161243



NYCの現在の感染者数 3/28の数字
https://www1.nyc.gov/assets/doh/downloads/pdf/imm/covid-19-daily-data-summary.pdf
Total
30765
Age Group NumberProp
-  0 to 17 5910.02
-  18 to 44 132130.43
-  45 to 64 105960.35
-  65 to 74 35710.12
-  75 and over 27240.09
-  Unknown 70 


上記の2つを表をまとめ直してみたいと思います。
感染者数の17歳までと18歳からという数字が人口統計には無いので0歳から44歳までを一括りにまとめます(後ほど時間があれば15歳から19歳は1歳づつ均等に、と仮定して作りなおします)

そうすると以下の様になりました。

Age GroupCasePopulationCase/Population
0 to 44 1380452809990.002613899
45 to 64 1059621015990.005041875
65 to 74 35716545510.005455648
75 and over 27245005240.005442296

44歳以下の感染者数の比率が年齢別人口の0.25%、それより高齢の方の感染率がおよそ0.5%くらいとなります。44歳以下の感染者数の割合は、それ以上の方に比べて半分程度になると考えられます。これは症状が軽いために、同じ割合で感染していたとしても、検査自体をしないためなのでは無いかと思われます。活動的な年代なのでそれ以上の割合で感染していると思われます。


入院患者数の割合
この中から重症化する人の割合を求めてみたいと思います。
感染者数を母数にした入院患者数はNYCから発表されています。
https://www1.nyc.gov/assets/doh/downloads/pdf/imm/covid-19-daily-data-summary-hospitalizations.pdf
シンプル過ぎて申し訳ないですが、入院している人を(比較的)重症な方とします。
(単純に金持ちなので医者が金をたかる為に入院させているのかもしれませんが)

Age Group HospitalizedHosp/CasesCases
-  0 to 17 5810%591
-  18 to 44 12249%13213
-  45 to 64 235022%10596
-  65 to 74 126735%3571
-  75 and over 138851%2724
-  Unknown 00%70

やはり高齢の方の入院される割合が高いですね。感染者の半分が入院しています。
年齢がUnknownの人で入院している人はいません。身分証明書も無く家族もいないので、そもそも入院できない人なのでしょうか?ただ冷やかしで検査しただけのひとでしょうか?

入院患者数も年代別の総人口から割合を求めてみます。
Age GroupHospitalizedPopulationHosp/Population
0 to 44 128252809990.000242757
45 to 64 235021015990.001118196
65 to 74 12676545510.001935678
75 and over 13885005240.002773094

75歳以上は0.27%が入院しているので、400人に一人強がCOVIDで入院しています。
65歳以上74歳以下は0.19%が入院しているので、500人に一人弱が入院しています。
45歳以上64歳以下は0.11%が入院しているので、1000人に一人強が入院しています。
44歳以下に至っては0.024%ですので、4000人に一人くらいの割合です。

大体こんな感じです。

Saturday, December 22, 2018

Spring MVC 5 で文字化け対策

Spring MVCを使う機会があったが、
POSTしたリクエストがいつも文字化けする。

Web上を調べると、server.xmlの値を変えないといけないとか
@RequestMappingにproduces = "application/json; charset=UTF-8"を付けろとか
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>がJSPのヘッダに必要だとかありましたが、
結論としては上記のどれでも無かったです。

私が作成しているプロジェクトの構造ですが、

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "jp.co.jdserve.serviceinfo")

public class AppConfig {

というコンフィギュレーションと

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

というInitializerを使っています。
このInitializerの方に下記のメソッドを追加すると、
全てUTF-8で登録表示できるようになりました。

    /**
     * リクエスト、レスポンス共にUTF8で統一する。
     */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }    

Sunday, December 2, 2018

CircleCIで docker-php-ext-install がフォルダアクセス権限無しでエラー

先週、CircleCIでライブラリの更新があったせいか、ビルドがエラーで落ちまくりましたので、メモしておきます。

Build Fail メールを受けて見に行くと、


/usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent


 というエラーメッセージが出ていました。

何故今まで普通にインストール出来たのが、急に出来なくなったのか分かりませんが、どうやらフォルダ権限に問題があるようなので、

sudo docker-php-ext-install intl pdo pdo_mysql

としていたところを-Eオプションを付けて、

sudo -E docker-php-ext-install intl pdo pdo_mysql

としたところ、正常にビルドできました。

Monday, November 19, 2018

AWSのインスタンスの更新が永遠に終了しなさそうな時

今日、Elastic Beanstalk の Load Balancer の設定を変更したとき、バランサ側の変更とタイミングが重複してしまったためか、1時間以上ずっと更新中のままになってしまった。

AWSコンソールからは EB だろうが EC2 だろうが、操作のしようが無いので、どうしたものかと考えていたが、この方法がStack Overflowで紹介されていた。

https://serverfault.com/questions/881033/elastic-beanstalk-stuck-for-more-than-12-hrs

要するにインスタンスのスケーリングの最大値をゼロにしてしまえば、それで自動的にインスタンスが停止される。その後、数値を元に戻せば更新の終わった状態で立ち上がって来てくれる。

Sunday, October 28, 2018

PHP 7.2 and CakePHP 3.6, You must enable the intl extension to use CakePHP.

I got this error when I  was deploying CakePHP 3.6 project to AWS EB Environment with PHP 7.2.
Fatal error: You must enable the intl extension to use CakePHP.
the error occurred when deploy process run migrations script.

In /etc, there are PHP-7.1.d and PHP-7.2.d.
I checked configuration with
php -i | grep 7.2
Then console displayed no configuration file and directory.
I changed 7.2 to 7.1 and show the /etc/php-7.1.conf and list of .ini files under /etc/php-7.1.d/.
There is no 20-intl.ini file inside /etc/php-7.1.d/.

Simply changing config to PHP 7.2 solved my problem.

But I don't understand why there are configurations of 2 versions.
I created totally new environment and never installed PHP 7.1.

Saturday, March 10, 2018

chef fails start because of wrong mysql GPG key URL.


We use vagrant and chef for create local developing environment.
As you know, both are nasty developer helping tool,
Today I encountered this nasty error.

Vagrantとchefというツールを使っている現在のプロジェクト。正直こういう便利そうなツールほど落とし穴が多いものです。
今日もchefでのMySQLのインストールと起動に失敗してます。

       
==> develop: Recipe: yum-mysql-community::mysql56
==> develop:   * yum_repository[mysql56-community] action create
==> develop:     * template[/etc/yum.repos.d/mysql56-community.repo] action create (up to date)
==> develop:     * execute[yum clean metadata mysql56-community] action nothing (skipped due to action :nothing)
==> develop:     * execute[yum-makecache-mysql56-community] action nothing (skipped due to action :nothing)
==> develop:     * ruby_block[yum-cache-reload-mysql56-community] action nothing (skipped due to action :nothing)
==> develop:      (up to date)
==> develop: Recipe: trl-lamp::mysql-server
==> develop:   * mysql_client_installation_package[server] action create
==> develop:     * yum_package[mysql-community-client, mysql-community-devel] action install
==> develop:
==> develop:
==> develop:       ================================================================================
==> develop:       Error executing action `install` on resource 'yum_package[mysql-community-client, mysql-community-devel]'
==> develop:       ================================================================================
==> develop:
==> develop:       Chef::Exceptions::Exec
==> develop:       ----------------------
==> develop:       yum -d0 -e0 -y install mysql-community-client-5.6.39-2.el7 mysql-community-devel-5.6.39-2.el7 returned 1:
==> develop:       STDOUT:
==> develop:       STDERR: warning: /var/cache/yum/x86_64/7/mysql56-community/packages/mysql-community-common-5.6.39-2.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
==> develop:
==> develop:
==> develop:       GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
==> develop:
==> develop:       Resource Declaration:
==> develop:       ---------------------
==> develop:       # In /var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb
==> develop:
==> develop:        18:       package new_resource.package_name do
==> develop:        19:         version new_resource.package_version if new_resource.package_version
==> develop:        20:         options new_resource.package_options if new_resource.package_options
==> develop:        21:         action :install
==> develop:        22:       end
==> develop:        23:     end
==> develop:
==> develop:       Compiled Resource:
==> develop:       ------------------
==> develop:       # Declared in /var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb:18:in `block in '
==> develop:
==> develop:       yum_package("mysql-community-client, mysql-community-devel") do
==> develop:         package_name ["mysql-community-client", "mysql-community-devel"]
==> develop:         action [:install]
==> develop:         retries 0
==> develop:         retry_delay 2
==> develop:         default_guard_interpreter :default
==> develop:         declared_type :package
==> develop:         cookbook_name "trl-lamp"
==> develop:         flush_cache {:before=>false, :after=>false}
==> develop:         arch [nil, nil]
==> develop:       end
==> develop:
==> develop:       System Info:
==> develop:       ------------
==> develop:       chef_version=12.21.26
==> develop:       platform=centos
==> develop:       platform_version=7.4.1708
==> develop:       ruby=ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]
==> develop:       program_name=chef-client worker: ppid=4766;start=01:51:29;
==> develop:       executable=/opt/chefdk/bin/chef-client
==> develop:
==> develop:
==> develop:     ================================================================================
==> develop:     Error executing action `create` on resource 'mysql_client_installation_package[server]'
==> develop:     ================================================================================
==> develop:
==> develop:     Chef::Exceptions::Exec
==> develop:     ----------------------
==> develop:     yum_package[mysql-community-client, mysql-community-devel] (/var/chef/cache/cookbooks/mysql/libraries/mysql_client_installation_package.rb line 18) had an error: Chef::Exceptions::Exec: yum -d0 -e0 -y install mysql-community-client-5.6.39-2.el7 mysql-community-devel-5.6.39-2.el7 returned 1:
==> develop:     STDOUT:
==> develop:     STDERR: warning: /var/cache/yum/x86_64/7/mysql56-community/packages/mysql-community-common-5.6.39-2.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
==> develop:
==> develop:
==> develop:
==> develop: GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
==> develop:
==> develop:     Resource Declaration:
==> develop:     ---------------------
==> develop:     # In /var/chef/cache/cookbooks/trl-lamp/recipes/mysql-server.rb
==> develop:
==> develop:      20: mysql_client "#{instance_name}" do
==> develop:      21:   version "#{node['trl-lamp']['mysqld']['version']}"
==> develop:      22:   action [:create]
==> develop:      23: end
==> develop:      24: # cli縺ァ蜈・繧九→縺阪�ッmysql -S /var/run/mysql-server/mysqld.sock -u root -pMyPa¥$¥$wordHasSpecialChars!
==> develop:
==> develop:     Compiled Resource:
==> develop:     ------------------
==> develop:     # Declared in /var/chef/cache/cookbooks/trl-lamp/recipes/mysql-server.rb:20:in `from_file'
==> develop:
==> develop:     mysql_client_installation_package("server") do
==> develop:       action [:create]
==> develop:       retries 0
==> develop:       retry_delay 2
==> develop:       default_guard_interpreter :default
==> develop:       declared_type :mysql_client
==> develop:       cookbook_name "trl-lamp"
==> develop:       recipe_name "mysql-server"
==> develop:       version "5.6"
==> develop:       major_version "5.6"
==> develop:       package_name ["mysql-community-client", "mysql-community-devel"]
==> develop:     end
==> develop:
==> develop:     System Info:
==> develop:     ------------
==> develop:     chef_version=12.21.26
==> develop:     platform=centos
==> develop:     platform_version=7.4.1708
==> develop:     ruby=ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]
==> develop:     program_name=chef-client worker: ppid=4766;start=01:51:29;
==> develop:     executable=/opt/chefdk/bin/chef-client
==> develop:
==> develop:
==> develop: Running handlers:
==> develop: [2018-03-11T01:52:17+00:00] ERROR: Running exception handlers
==> develop: Running handlers complete
==> develop: [2018-03-11T01:52:17+00:00] ERROR: Exception handlers complete
==> develop: Chef Client failed. 1 resources updated in 48 seconds
 


After the research in internet, I found out that problem is in chef's .

The error occurred because of wrong GPG-Key URL in below file.
/etc/yum.repos.d/mysql56-community.repo

結局、/etc/yum.repos.d/mysql56-community.repoのgpgkeyのURLが間違っているとわかりましたが、このファイルはもとはchefのcookbookから作成されていますので元のファイルを修正する必要があります。

       
# This file was generated by Chef
# Do NOT modify this file by hand.

[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/$releasever/$basearch/
enabled=1
failovermethod=priority
fastestmirror_enabled=0
gpgcheck=1
gpgkey=https://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/default/mysql_pubkey.asc
‾

And above repo file is generated from below file
cookbooks/yum-mysql-community/attributes/mysql56-community.rb

こちらがcookbookのrbファイル。
       
efault['yum']['mysql56-community']['repositoryid'] = 'mysql56-community'
default['yum']['mysql56-community']['gpgkey'] = 'http://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/default/mysql_pubkey.asc'
default['yum']['mysql56-community']['description'] = 'MySQL 5.6 Community Server'
default['yum']['mysql56-community']['failovermethod'] = 'priority'
default['yum']['mysql56-community']['gpgcheck'] = true
default['yum']['mysql56-community']['enabled'] = true
 

First I thought it is as simple as just overwrite URL.
But every time I run the vagrant provisioning, this .rb file is downloaded and overwritten with wrong URL.

単純に上書きすればそれで解決というわけではなく、chefがmysqlをインストールする前にファイルをサーバからダウンロードしてこちらの修正を上書きしてしまいます。

So I decided to cheat little bit.
This nasty chef downloads cookbook files when console shows below message.


      
==> develop: Starting Chef Client, version 12.21.26
==> develop: resolving cookbooks for run list: ["trl-lamp::selinux-disable", "trl-lamp::build-essential", "trl-lamp::sqlite", "trl-lamp::nodejs", "trl-lamp::mysql-server", "trl-lamp::mysql-database", "trl-lamp::redisio", "trl-lamp::memcached", "trl-lamp::php", "trl-lamp::httpd-web", "trl-lamp::httpd-php", "trl-lamp::minio", "trl-lamp::httpd-vagrant", "trl-lamp::sftp-user"]
==> develop: Synchronizing Cookbooks:
==> develop:   - trl-lamp (0.1.12)
==> develop:   - selinux (2.1.0)
==> develop:   - imagemagick (0.2.3)
==> develop:   - build-essential (8.0.4)
==> develop:   - nodejs (5.0.0)
==> develop:   - httpd (0.6.1)
==> develop:   - php (4.5.0)
==> develop:   - composer (2.6.1)
==> develop:   - mysql (8.5.1)
==> develop:   - mysql2_chef_gem (2.1.0)
==> develop:   - database (6.1.1)
==> develop:   - yum-epel (2.1.2)
==> develop:   - redisio (2.6.1)
==> develop:   - seven_zip (2.0.2)
==> develop:   - memcached (5.0.0)
==> develop:   - mingw (2.0.1)
==> develop:   - yum-remi-chef (2.2.2)
==> develop:   - yum-mysql-community (2.1.0)
==> develop:   - ark (3.1.0)
==> develop:   - windows (3.4.3)
==> develop:   - apt (6.1.4)
==> develop:   - ulimit (0.4.0)
==> develop:   - selinux_policy (2.0.1)
==> develop:   - postgresql (6.1.1)
==> develop:   - compat_resource (12.19.0)
==> develop:   - runit (4.0.4)
==> develop:   - yum (5.1.0)
==> develop:   - ohai (5.2.0)
==> develop:   - openssl (8.1.0)
==> develop:   - mariadb (1.5.3)
==> develop:   - yum-scl (0.2.0)
==> develop:   - inifile_chef_gem (0.1.0)
==> develop:   - packagecloud (0.3.0)
==> develop: Installing Cookbook Gems:
==> develop: Compiling Cookbooks...
==> develop: Converging 138 resources
 

While console output this message, I over wrote the cookbook mysql file as below.

       
default['yum']['mysql56-community']['repositoryid'] = 'mysql56-community'
default['yum']['mysql56-community']['gpgkey'] = 'http://raw.githubusercontent.com/chef-cookbooks/yum-mysql-community/master/files/mysql_pubkey.asc'
default['yum']['mysql56-community']['description'] = 'MySQL 5.6 Community Server'
default['yum']['mysql56-community']['failovermethod'] = 'priority'
default['yum']['mysql56-community']['gpgcheck'] = true
default['yum']['mysql56-community']['enabled'] = true
 

Everything went OK.
Now I could start virtual machine on my local.

Thursday, October 26, 2017

MySQL SSH Tunnel Command Line Login

今回のプロジェクトはAWSにサーバを立てて
DBはMySQLを使っています。

AWSでDBにアクセスするときは常に踏み台のサーバを経由してSSHでアクセスしなければならない形に構築されています。

MySQL Workbenchにしろ、A5M2にしても普通にSSHトンネルでログイン出来るようになっていますが、mysqldumpを使いたいと思ったので、SSHトンネルを自分でコマンドラインから入力して実行してみました。

まず、SSHですが、Windowsのコマンドからは初期状態では使えません。
OpenSSHをインストールするか、開発でGitを使っているならGitBashを使ってSSHコマンドを使える状態にします。

ssh -i -f -N -C -L [バインドするローカルのポート]:<MySQLサーバのIPアドレス>:3306  @<踏み台のIPアドレス> -p 22

ここでport1は自分のローカルのポートですので、ローカルで空いているポートを指定しましょう。するとローカルのに対する接続が踏み台サーバを経由して、MySQLの動いているサーバの3306ポートに転送されます。
ぶっちゃけ-f とか -N とか -C とかは無くてもOKです。

ここからMySQLへの接続を下記のコマンドで実行できます。
mysql -u -P [バインドしたローカルのポート] -h localhost -p

MySQL Dumpを実行する場合は下記のコマンドです。
mysqldump -u -p -P [バインドしたローカルのポート] [db_name] > [file_name]

クライアントツールも便利ですがコマンドラインから繋いでおけると
バッチでデータを調査したり等いろいろと使い易いので出来ると便利です。