Study-Daily
think about redux
Reduxについて感化されたこと
Reduxについて不満に思っている部分について考察している記事を見かけた。
自分もReduxを少し触ってみて「?」と思っていたことなどが言語されていた。
理解して納得していること
Reactの場合は上からもらうプロパティはPropsで読み取り専用。
要素ごとにstateという読み書き可能なプロパティを持つ。
ReduxはFluxアーキテクチャの実装。
1つの状態を管理するStoreのみ。
Actionを呼びReducerが状態を更新する。それぞれはプレーンなjavacsriptで書く。
ここまではいい。とても素敵に感じた。
受け入れがたいところ
javascriptといえば、画面上の何かを触ったらイベントを拾って画面を変えたりとか、非同期で外からデータを持ってくるとかですよね。
その非同期処理をReduxではどう書くのか、実はActionは処理のオブジェクトを生成するだけだし、Reducerは更新結果の状態を同期処理で作るだけ。
ビジネスロジック的なものや非同期処理はどこに書くのか?
基本的には無い。なので後付け?でてきたMiddlewareてのを作る。
Reduxの思想では、非同期の処理前、処理中、処理結果(成功・失敗)をそれぞれ状態として更新する。
その処理をMiddlewareに書くのだけれど…書くのだけれど、これがすごく気持ち悪いと感じていた。
いろいろ他の書き方が無いのかとか本来自分はどう書きたいのかということを考えると、乖離が大きく、辛い。
その辺りをReducerの状態を更新する処理のところで非同期処理を呼び出して結果を入れる書き方を考えた方がいらっしゃって、外国のReduxのコミュニティに投稿したら、disられてた。
Reduxの基本設計に不備があって、それをごまかすためのMiddlewareは許されて、Reducerに非同期処理結果を突っ込むのは違うとかって言うの、どうなの?
まとめ
ReduxのMiddlewareがいまいち気に入らないので、非同期処理も考慮されたFluxアーキテクチャのオレオレ実装を作るしか無いのか。。。
jaws-ug container
JAWS-UG コンテナ支部 の勉強会に行ってきた
行ってきた。。
前佛さんのお話
Dockerは仕様でコンテナが技術っていう話。
開発環境と本番とかステージングの環境が違うっていう問題はコンテナで解決できますね。
Dockerのイメージ・レイヤの概念のおかげで?ベースイメージを共有したり、イメージをコピーするのにも差分レイヤだけコピーするので早いとか。
他のコンテナ技術との大きな違い
今までに同様の技術はあったが、Dockerが大きく違うのは、DockerHubの存在。
自分が作ったイメージはもちろん、他人が作ったものも共有(流用)できる。
docker イメージの Github版。
注意点
ストレージドライバについては要件を考慮して決めましょう的な話。
このあたりを読むと理解が深まるのでしょう。
ECS関連のアップデート
Windows コンテナ も試せる Windows Server 2016 の AMIもでてるよ。とか。
ECRについて
- フルマネージドDockerレジストリサービス
- イメージの容量に対して課金
- コンテナイメージは自動的に暗号化できる設定がある
- もちろんIAM使える
- ECRをCloudTrailで追跡可能
- CredentialHelper使ってね
業務上プライベートなDockerイメージを置く場所を作りたい場合なんかいいですね。
社内ビッグデータ基盤にバッチ用コンテナ環境を構築してみた
既存の触りたくないバッチ環境をそのままに、API Gateway、ECS、SQSなんかを活用してバッチ処理環境を改善した話。
既存のサーバーには何も追加したくない、が、curlは基本的に入っているので処理スタートをcurlから始める。
API Gateway を通じてリクエストを受け取り、ECS環境でバッチ処理、処理結果をSQSで通知みたいな。
ボリュームはできるだけ使わない。ログは全てCloudWatchLogsに流す。
すごい。
NTTとDocker
ECSで複数コンテナ構成な場合、SpotFleetを活用するとコストを抑えられますって話。
ECSを活用する上での勘所
データについて
- なるべくDocker Volumeを使わないで済む設計にする
- いつでもインスタンスを捨てられるようにする設計
- 永続DBデータはRDS,DynamoDBに、ファイルはS3に、ログはCloudWatchLogsを活用する
- awslogs ログドライバ便利です。積極的に使っていきましょう。
- URLパスの設計
- ALBを活用しましょう
- 関連サービスのエントリポイントとかは環境変数で渡しましょう。
- セッションの管理
- インスタンスにセッションを任せてしまうのは複数コンテナでサービスというのと相性悪い
- ElastiCache,Redis,Memcachedを活用しましょう。
環境構築について
書き洩らした。ECS-optimized AMIを使いましょうというのとSpotFleet活用しようみたいな
Powershell
Powershellでやったことメモn
Powershellの実行権限について
Get-ExecutionPolicy
Set-ExecutionPolicy <PolicyName> # RemoteSignedとか
よく使いそうなやつ
ファイル操作、実行、インストールなど
Copy-Item <<source>> -Destination <<dest>> -Recurse
Move-Item <<sourse>> -Destination <<dest>>
Remove-Item <<source>> -Recurse
Rename-Item <<sourse>>
Get-Content <<path/to/file>>
Get-WmiObject Win32_Product
Enter-PSSession <<container_id>> -RunAsAdministrator
docker inspect <<container>> --format="{{.Id}}" | sv container_id
Install-WindowsFeature -Name <<FeatureName | SubFeatureName>>
Install-WindowsFeature Web-Server -IncludeAllSubFeature
Get-NetTCPConnection
Get-WebSiteState -Name <<WebSiteName>>
Start-WebSite -Name <<WebSiteName>>
Stop-WebSite -Name <<WebSiteName>>
Get-WindowsFeature -Name Web-Server
Get-WindowsFeature -Name Web-*
IIS関連
Import-Module IISAdministration
Reset-IISServerManager -confirm:$false
$sm = Get-IISServerManager
$appHostconfig = $sm.GetApplicationHostConfiguration()
$section = $appHostconfig.GetSection("system.webServer/handlers")
$section.OverrideMode="Allow"
$sm.CommitChanges()
Reset-IISServerManager -confirm:$false
$sm = Get-IISServerManager
$appHostconfig = $sm.GetApplicationHostConfiguration()
$sectionHttpPlatform = $appHostConfig.RootSectionGroup.SectionGroups["system.webServer"].Sections.Add("httpPlatform")
$sectionHttpPlatform.OverrideModeDefault = "Allow"
$sm.CommitChanges()
Reset-IISServerManager -confirm:$false
$globalModules = Get-IISConfigSection "system.webServer/globalModules" | Get-IISConfigCollection
New-IISConfigCollectionElement $globalModules -ConfigAttribute @{"name"="httpPlatformHandler";"image"="%windir%\system32\inetsrv\httpPlatformHandler.dll"}
Reset-IISServerManager -confirm:$false
$modules = Get-IISConfigSection "system.webServer/modules" | Get-IISConfigCollection
New-IISConfigCollectionElement $modules -ConfigAttribute @{"name"="httpPlatformHandler"}
運用場面でよく使いそうなもの
Get-Process
Get-ChildItem env:
Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory
Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\Software\JavaSoft...
New-Item -Path Registry::HKLM\...
Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
New-ItemProperty -Path "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment" -Name CurrentVersion -PropertyType String -Value 1.8
コマンドラインでインストール
msiexec /i <</path/to/msi>> /qn
Setup.exe /s /qn
Hexo etc
勉強の進捗とHexoの改修
いろいろいっぱいいっぱいで諦めたことと、作業したこと。
スプリントの進捗
- Mackerelのプラグイン試すとか諦めて、3月までの課題終了。
- Docker学習、3月までの課題終了。Swarmとか諦めた。
時間に余裕ができたらまた集中して取り組む。
Hexoのレイアウト改修
TOPの画像がサイトタイトルを隠しちゃう感じだったのでCSSを変えるとかしようと考えてた。
行ったこと
- 画像を変更。ブログテーマに幾分合ってそうなものに変えたつもり。
- 画像をちょっと暗めにしたかったので少しCSS変更。
いい感じになった。
やらなかったこと
全体的な直しをしようか迷ったけど、要件を十分果たしていると判断して何もしないことにした。
ファイル名、URLパス、記事タイトルが同じじゃないといけないのがちょっとキモい。
そんな感じ。
challenge mackerel plugin
Mackerelのカスタムメトリクスに挑戦
して撃沈。
何が起きたか
公式のヘルプ を見ながら写経してUbuntu 16.04のサーバー上でカスタムメトリクスを作成して設定したが、うまくいかない。エラーが出る。
YYYY/MM/DD 時分秒 INFO <metrics.plugin> command /path/to/sample-metrics.rb outputted to STDERR: "/path/to/sample-metrics.rb: 10: /home/osawa/sample-metrics.rb: Syntax error: \"}\" unexpected (expecting \"then\")\n"
改行が足りない?
rubyファイルを単独で実行すると動くので謎。
これだからRubyは。
とりあえず、Mackerelは初期設定のままのメトリクスだけでいいや。
Challenged Jekyll template and hate
Jekyllの画面(テンプレート)作った
結論から言うと、二度と使いたくない。
Pelicanの方がいいや。
やりたかったこと
- TOPページ:直近5件程の記事タイトルを表示する
- タグごとの記事一覧ページを作る
- タグの一覧ページ作る
- カテゴリごとの記事一覧ページを作る
- カテゴリの一覧ページ作る
- アーカイブ(年月)ごとの記事一覧ページを作る
- アーカイブ(年月)の一覧ページ作る
- Aboutの固定ページを作る
- サイドバーにカテゴリ、タグ、アーカイブ、Aboutのリンクを作る
できたこと
- TOPページ:直近5件程の記事タイトルを表示する
- タグごとの記事一覧ページを作る
- タグの一覧ページ作る
- カテゴリごとの記事一覧ページを作る
- カテゴリの一覧ページ作る
- Aboutの固定ページを作る
- サイドバーにカテゴリ、タグ、Aboutのリンクを作る
乗り越えた事
HexoやHugoは既存のテーマをそのまま使ったからなんとも言えないけど、Pelicanは一から作った際にも苦労しなかったカテゴリやタグの一覧ページを作るのにJekyllは苦労した。
標準で機能がついてなくて、pluginディレクトリにページを生成するモジュール?を書いて対応した。
公式に載っているコードをほぼそのまま使いまわしたんだけど、Rubyの世界というかJekyllではカテゴリやタグごとのページ生成は静的サイトジェネレーターの標準機能のうちには入らないらしい。
あきらめた事
アーカイブページ
上記のカテゴリやタグのページ生成のノリでいけるかと思ったけど無理だった。
正確には気持ちが切れた。
Pelicanの場合、記事リストをgroup by した結果をそのままfor分で使えるのだけれど、Jekyllが使っているテンプレートエンジンではできないらしく、いちいち変数にアサインしないといけない。そのくせ、変数にアサインする時はgroup by も sort もできるらしい。
あと、気づかなかったんだけど、記事のデータに投稿年月日の年や月のデータがないので結局こねくり回さないと、年や月でgroup byした記事リストの抽出がうまくできない。
この、年月ごとに記事リストを抽出したオブジェクトが簡単には生成できないので、サイドバーの表示もアーカイブリストの生成もうまくできそうにないので諦めた。
あと、ググって出てきた書き方が汚いというか美しくないというか、「え?こんな手続き型なめんどくさい記述をテンプレートで書くの?」みたいなのが散見されて嫌になった。
まったくもう。
参考
まとめ
Rubyを理解したら見直せるかもしれないけど、それまではもう触りたくない。
記事の投稿だけはして使い続けてみる。
replace hugo post rule
Hugoの記事の命名規則を見直して直した
辛かった。
カテゴリ名、タグ名、ファイル名、記事のタイトル。これらが日本語だとジェネレート後のディレクトリ名、ファイル名、URLパス等で日本語が混ざってしまうので、片っ端から探して変更した。
今後は記事内容以外では絶対に日本語を使わないようにしないと。
これはおそらくHugoに限らず静的サイトジェネレーターならだいたいそうだと思う。
しかしカテゴリ名やタグ名で日本語使えないのは辛いな。。
I tried Mackerel
勇気を出してMackerelを試してみた
前々から気にはなっていたMackerelをお試しで入れてみた。
- VPS契約しているUbuntu16.04
- 使い捨てのAWS上WIndows2012
インストール
ヘルプに書いてある通りに作業してつまずく事もなくすんなりできた。
監視項目
デフォルト監視項目
通常の監視項目で既に普段Zabbixで見て使っている項目を監視できているので、Zabbix使いこなす気がないならMackerelでいいかなって思った。
カスタムメトリック
今回はまだ試していない。
けど、簡単そうだ。
プラグインの作成
今回はまだ試していない。
golangじゃないといけないのかと思っていたけれど、他の言語でもいいらしい。
外形監視
ホストが止まっても監視を続けるので、仕様上間違ってはいないんだけどずっとエラーがで続ける。
ホストをメンテナンスにしたり停止したりした時は外形監視も停止する仕組みがあるといいいかなって思った。
外形監視の定義削除しかなかったように思える。
通知設定
通知設定も簡単だし、いろんなサービス(Slackとか)と簡単に連携できるのも魅力だなと感じた。
まとめ
まだプラグインを試していないのだけれど、とにかくヘルプドキュメントが素晴らしいと感じた。
自分ならそこまではやらないよってくらいに丁寧に書いてあった。
特に感心したのは他サービスと連携するために、他サービス上での設定の説明が画面キャプチャ入りで説明されていたこと。
小規模な場合にフリーでどこまで使えるのかフリープランを調べていきたい。
Zabbixサーバーを一台用意する場合との費用比較とか調べていきたい。
i got caught in utf8
UTF-8-MAC にまたしてもやられた
全角のチルダだか波ダッシュだかがmacOSの時とそれ以外で違う文字コードなのか別の文字なのか、とにかく想定外の文字コードのものがバリデーションをすり抜けてきた。
一つのOS上で禁止文字を羅列して出来たつもりになってたけどUTF−8−MACにはこれからも悩まされるんだろうなー。
Bitbucket is cool
Bitbucketけっこういいかも
プライベートリポジトリ欲しくてBitbucket試してみた。
乾燥
Gitが使えるのでhg clone フォー!(古い)とかやらなくていいし抵抗なくて使えていいですね。
なんかWikiとか課題(issue)とかも使えるし、どうやらGithubPagesみたいのもできるみたい。 なんかTrelloともなんか連携できるみたいでいいですね。
使いこなせる自信ないけどPipelineてのもあるらしい。
Githubとの使い分けがなやましいけど、とりあえずはプライベートにしたいものは基本Bitbucketにしよう。