GC(ガーベッジコレクション)

循環参照を持つゴミの回収
gc_disable()

Garbage Collectionとは
⇒動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能

あ、C言語でやりましたね。

メモリ不足の例

$a1 = range(1, 200000); echo '1';
$a2 = range(1, 200000); echo '2';
$a3 = range(1, 200000); echo '3';
$a4 = range(1, 200000); echo '4';
$a5 = range(1, 200000); echo '5';

[vagrant@localhost test]$ php index.php
1234PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /home/vagrant/test/index.php on line 7

なるほど。。
memory_limit = 128M

$a1 = range(1, 200000); echo '1';
$a1 = range(1, 200000); echo '2';
$a1 = range(1, 200000); echo '3';
$a1 = range(1, 200000); echo '4';
$a1 = range(1, 200000); echo '5';

[vagrant@localhost test]$ php index.php
12345[vagrant@localhost test]$

これならいける。
⇒phpにgarbage collectionがあるから。

循環参照
 参照関係に循環があると、たまっていきメモリ不足になる
 php5.2まで辿れなくなるよう自分でunsetしなければいけなかった
到達できるオブジェクトのみ残す

WebDAV

よくみたら、cyberduckの接続にwebDAVありますね。。

WebDAV,FTP,FTP-SSL,SFTP,Windows Azure Storage, Backblaze B2 Cloud Storage, DRACOON, Google Cloud Stroage, Amazon S3, Rackspace Cloud Files, Swift, Dropbox, Google Drive, Microsoft One Drive

なるほど、オンラインストレージはそれぞれ独自の通信技術を使っているのですな。なんだかなー

PROPFINDメソッド

XXX.XXX.XXX.XXX – – [05/Apr/2018:13:07:49 +0900] “PROPFIND / HTTP/1.1” 405 166 “-” “-”

https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2003/aa142960(v=exchg.65)
WebDAVのよう。
WebDAVって何?

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release. The WebDAVPROPFIND Method retrieves properties for a resource identified by the request Uniform Resource Identifier (URI). The PROPFIND Method can be used on collection and property resources.

ProfpindはWebDAVメソッドの一つ
WebDAVとはサーバー上のファイルを読み取りや編集を、Webブラウザ上で行えるようにする仕組み

WebDAVクライアント: Webフォルダ、CyberDuck, cadaver, SkunkDAV
WebDAVサーバー:Apache+mod_dav, nginx+ngx-dav-ext-module, IIS5, jigsaw, Zope

WebDAVとはサーバー上のファイルを読み取りや編集を、Webブラウザ上で行えるようにする仕組みのことを言います。
オンラインストレージはWebDAVに似ている。
Microsoftが1999年に発表

自組織への不正侵入を防ぐためにプロトコルに応じて出入りを許可したり禁止したりすることでセキュリティレベルを維持している。
HTTPを拡張し、WebDAVでファイル共有という別の機能を実現

HTTPだけで全てのコンテンツ管理を完結できる。また、HTTPの拡張のみによって実装されているため、ファイアウォールによって既存のファイル転送サービスが利用できない環境や、HTTPプロキシを経由した環境でも利用できる。

PROPFIND
指定したURIが示す資源の属性を取得する。具体的には、要求する属性をクライアントがWebサーバに送信すると、サーバはそれに対応した属性値を返す。また、その資源の属性全てを取得することも出来る。

さくらでもあるが、マネージドサーバー

### WebDAVに関する本
2003年の本なので、古すぎて読む気がしませんが、一応、WebDAVの解説本があるようです。

planioを使ってRedmineを理解しよう

planioを使ってみよう。
おいおいおい、いきなり「素晴らしい決断です」かよw 絶対怪しいサービスやんか。

あ、UI(デザイナー)は嫌いじゃないよ。ふざけた会社だな。

ああ、backlogみたいなもんだね。しかし、サブドメインでこんな数秒で開通できたっけ?

モジュールがいわゆる機能ですね。
ニュース、agileってなんでしょう。リポジトリはgitかな。Redmineそのものの開発は楽しそうですね。

チケットを作成する。
open, 進行中、 feedbackね。なるほど、勉強になります。

Redmineを理解しよう

Redmineはプロジェクト管理ができるオープンソースソフトウェア。
やるべき作業を記録・管理したり社内で情報共有ができる。
例えば、チームでシステム開発を進める場合に誰がいつまでに何をやるのか、現在どのくらい進んでいるのかをRedmineに記録することで進捗状況を明らかにし計画通りに進むよう支援する。

理由:Redmineには今までの作業がよりスムーズになるメリットがたくさんある。Webアプリケーションなので複数人が同時にアクセスでき、本社と支社が離れた場所にあっても一緒に作業を進めていくことができる。

vagrant centosに入れたい。
redmineのHPに行きます。
http://www.redmine.org/projects/redmine/wiki/Download

あったあった、3.4.6
[vagrant@localhost test]$ wget http://www.redmine.org/releases/redmine-3.4.6.tar.gz
–2018-09-08 12:59:54– http://www.redmine.org/releases/redmine-3.4.6.tar.gz
www.redmine.org をDNSに問いあわせています… 46.4.36.71
www.redmine.org|46.4.36.71|:80 に接続しています… 接続しました。
HTTP による接続要求を送信しました、応答を待っています… 200 OK
長さ: 2448628 (2.3M) [application/x-gzip]
`redmine-3.4.6.tar.gz’ に保存中

100%[======================================>] 2,448,628 623K/s 時間 6.5s

2018-09-08 13:00:01 (368 KB/s) – `redmine-3.4.6.tar.gz’ へ保存完了 [2448628/2448628]

[vagrant@localhost test]$ ls
Download index.php redmine-3.4.6.tar.gz

tar zxvf redmine-3.4.6.tar.gz

usr/local配下にappを作ります。
[vagrant@localhost ~]$ cd /usr/local
[vagrant@localhost local]$ ls
bin games heroku info lib64 sbin src
etc hadoop-3.0.0 include lib libexec share
[vagrant@localhost local]$ sudo mkdir app
[vagrant@localhost local]$ ls
app etc hadoop-3.0.0 include lib libexec share
bin games heroku info lib64 sbin src

redmineを移動
[vagrant@localhost test]$ sudo mv redmine-3.4.6 /usr/local/app/redmine-3.4.6

[vagrant@localhost redmine-3.4.6]$ ls
CONTRIBUTING.md Rakefile bin db files plugins test
Gemfile app config doc lib public tmp
README.rdoc appveyor.yml config.ru extra log script vendor

mysqlでdatabaseの作成
mysql> create database db_redmine default character set utf8;
Query OK, 1 row affected (0.00 sec)

database.ymlの作成

production:
adapter: mysql2
database: db_redmine
host: localhost
username: root
password: ""
encoding: utf8

あれ、できねーぞ
[vagrant@localhost redmine-3.4.6]$ bundle install –without development test rmagick –path vendor/bundle

[!] There was an error parsing `Gemfile`: undefined method `[]’ for nil:NilClass. Bundler cannot continue.

# from /usr/local/app/redmine-3.4.6/Gemfile:64
# ——————————————-
# database_config = YAML::load(ERB.new(IO.read(database_file)).result)
> adapters = database_config.values.map {|c| c[‘adapter’]}.compact.uniq
# if adapters.any?
# ——————————————-

とりあえずplanioから使って理解していくか。

InnoDBの行ロック

トランザクションのロック待ちでタイムアウトしてしまうことがある。

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

mysql> use app
Database changed
mysql> create table lock_test (
-> id int primary key auto_increment,
-> name varchar(32) not null,
-> value int not null
-> ) engine = innoDB default charset=utf8;
Query OK, 0 rows affected (0.55 sec)

mysql> insert into lock_test (name, value) values (‘tanaka’, 80),(‘suzuki’, 30),(‘sato’, 50),(‘takahashi’, 40);
Query OK, 4 rows affected (0.07 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from lock_test;
+—-+———–+——-+
| id | name | value |
+—-+———–+——-+
| 1 | tanaka | 80 |
| 2 | suzuki | 30 |
| 3 | sato | 50 |
| 4 | takahashi | 40 |
+—-+———–+——-+
4 rows in set (0.00 sec)

コマンドラインを二つ立ち上げて、同時にupdateしようとすると、片方が止まります。これがlock wait

片方をcommitすると、以下のメッセージが出ます。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

カラムが異なればロックされない。
インデックスだと、ロックされる。
update lock_test set value = value + 10 where name = ‘tanaka’;

RDSメンテナンスウィンドウ

Amazon RDS では、Amazon RDS リソースのメンテナンスを定期的に実行する。通常、メンテナンスには DB インスタンスや DB クラスターの基盤となるオペレーティングシステム (OS) あるいはデータベースエンジンの更新が伴う。通常、オペレーティングシステムの更新はセキュリティの問題に関連しているため、できるだけ早急に適用する必要がある。

すぐに適用とすると、開始される。
CLIで調整することもできる。 AWS CLI の modify-db-instance コマンドを使用する。

aws rds modify-db-instance \
--db-instance-identifier mydbinstance \
--preferred-maintenance-window Tue:04:00-Tue:04:30
https://rds.us-west-2.amazonaws.com/
?Action=ModifyDBInstance
&DBInstanceIdentifier=mydbinstance
&PreferredMaintenanceWindow=Tue:04:00-Tue:04:30
&SignatureMethod=HmacSHA256
&SignatureVersion=4
&Version=2014-09-01
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIADQKE4SARGYLE/20140425/us-east-1/rds/aws4_request
&X-Amz-Date=20140425T192732Z
&X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
&X-Amz-Signature=1dc9dd716f4855e9bdf188c70f1cf9f6251b070b68b81103b59ec70c3e7854b3

マネジメントコンソールからの設定も可能。

RDS リードレプリカ

リードレプリカというのは、読み込み専用として利用することができるマスターの複製データベース
非同期のため常にマスターと完全に内容が一致しているわけではなく常に最新のデータが取得できるということではありませんので、マスターの負荷分散用として利用するのがよい

Amazon RDS リードレプリカによって、データベース (DB) インスタンスのパフォーマンスと耐久性が向上する

1 つの DB インスタンスのキャパシティーを伸縮自在にスケールし、読み取り頻度の高いデータベースのワークロードを緩和

Amazon RDS for MySQL、MariaDB、PostgreSQL、および Amazon Aurora
読み込みクエリをアプリケーションからリードレプリカにルーティングすることにより、ソース DB インスタンスへの負荷を減らすことができる

AWS Athena

Amazon Athena は、標準的な SQL を使用して Amazon S3 のデータを簡単に分析できるインタラクティブなクエリサービス
S3 のデータを指定し、スキーマを定義して、標準的な SQL を使用してデータのクエリを開始するだけ

Examples include CSV, JSON, or columnar data formats such as Apache Parquet and Apache ORC. You can use Athena to run ad-hoc queries using ANSI SQL, without the need to aggregate or load the data into Athena.

([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([.0-9]*) ([.0-9]*) ([.0-9]*) (-|[0-9]*) (-|[0-9]*) ([-0-9]*) ([-0-9]*) “([^ ]*) ([^ ]*) (- |[^ ]*)” (“[^”]*”) ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$