KubeCon + CloudNativeCon Europe 2019の「Deep Dive: Open Policy Agent」を視聴して

しばらくOPA(Open Policy Agent)の講演を観ることができていなかったので、KubeCon CloudNativeCon Europe 2019の講演をYoutubeで視聴しました。

www.youtube.com

構成

時間 内容
1:27 Example: Application
5:38 Example: Kubernetes Platform
7:14 OPA: Unified Policy Enforcement Across the Stack
8:40 OPA: General-purpose Policy Engine
11:25 Community Growth
12:53 Community Highlights: Configuration Guardrails
15:30 Community Highlights: Chef Automate IAM
16:42 Community Highlights: RPG Engine
17:24 Recent Developments
17:27 play.openpolicyagent.org
20:45 v0.11: Improved Debugging: notes trace filter
22:04 v0.11: Language Improvements: some keyword
23:20 v0.11: Native Integrations: WebAssembly progress
25:25 Looking forward
25:33 Google Summer of Code: IPTables integration
26:43 Use Case: Application & End-user Authorization
30:09 Help Us Improve Discoverability
31:31 Q&A

OPA: Unified Policy Enforcement Across the Stack

OPAは様々な場面においてPolicyを適用できると述べています。以下はそれぞれ紹介されている場面と、関連するサービスや技術スタックです。

  • Admission Control
  • Container Execution, SSH, sudo
  • Microservice APIs
    • e.g. Istio, Linkerd, spring, Kong, envoy
  • Risk Management
    • e.g. Terraform, Forceti Security
  • Data Protection & Data Filtering
    • e.g. ceph, kafka, MinIO, SQLite, elastic

OPA: General-purpose Policy Engine

OPAの概要について述べています。OPAの概要については僕も記事を書いてますのでざっくりどういうものか知りたい方はぜひ!

kenfdev.hateblo.jp

講演の中では以下の話が特に重要だと感じます。

Decouple "Policy Decision Making" from "Policy Enforcement"

APIを実装する場合、何も考えずに実装していくとPolicyに関わる部分も自然とビジネスロジックの中に書いてしまったり、データベースに情報を取得しにいく部分で書いてしまいがちです。Policyによる判断(Decision)をする場所と、判断に基づいた処理(Enforcement)を行う場所を分ける(Decouple)ということです。

Enforcement is the Service's job. Making the decision is OPA's job.

判断(Decision)はOPAがして、判断に基づいた処理(Enforcement)はサービス側で、というマインドが大事になりそうですね!

Community Highlights: Chef Automate IAM

Chef Automate IAMのユースケースを紹介しています。Chef Automateは内部的にOPAをPolicy Engineとして使っていて、OPAをライブラリとして使う例としてもとても勉強になるOSSです。また「Well-documented architecture」と述べられているように、以下のドキュメントがとてもわかりやすくOPAを使った認可の仕組みを説明してくれています。

github.com

中でも、「Introspection (Who Can Do What?)」については、フロントエンドにどのように「誰」「何をできる」かを伝えられるか、というフローについても詳しく説明されていて非常に勉強になります。

play.openpolicyagent.org

f:id:kenev:20190808203446p:plain

Rego Playgroundの紹介がされました。

play.openpolicyagent.org

サクッとPolicyを試すのに便利ですし、書いたPolicyをシェアできるのも便利です!OPAのSlack上でもコミュニケーション手段としてよく使われています。

Use Case: Application & End-user Authorization

認可に対するよくある疑問点とOPA側からの回答が述べられていました。その回答には今OPAが何をできるか、と今後どうしていこうとしているかについて述べられています。

以下については僕も今後かなり期待したいところです。

How do you delegate control to your end-users?

「OPAでIAMのようなことをしたい」という質問はよくSlackでも見かけます。これはエンドユーザーがPolicyの作成や管理ができるユースケースになります。Chef Automate IAMがリファレンスとしてよく紹介されるのですが、今後このようなモデルをOPAから公式に提供できるようにしてくれるそうです。

どのような仕組みで提供されるのか楽しみですね!

How do you leverage context, e.g. HR DB?

大規模なアプリケーションであればOPAに、判断に必要なデータ(context)を全部(インメモリで)あらかじめ読み込ませておくのは現実的じゃないです。今後「Data-fetching」が判断(Decision)のタイミングで行えるような機能が増える予定のようです。(XACMLで言うPIPの機能が強化されるイメージだと僕は捉えています)

現状では僕の知っている限りはOPAをライブラリとして使って、自前のサービスを作るか、OPAのビルトインであるhttp.sendを使って外部にAPIリクエストを行う方法しか無いはずです。この機能が実現するとOPAを使うハードルがぐっと下がりそうな気がします。

How do you render UIs based on policy?

フロントエンドでPolicyに基づいてボタンを表示するかしないかを判断できるようにするためにWASM(WebAssembly)が使えるようになるようです。

これが実現すると、上で述べたChef Automate IAMで提供されているようなIntrospection APIを作る必要が無くなるのではと思います。

まとめ

  • 「Deep Dive: Open Policy Agent」を視聴した
  • OPAをがっつり使っている例としてChef Automate IAMがかなり勉強になる
  • Policyの判断のタイミングで必要なデータをさらに取得する機能は今後に期待
  • WASMが実現すれば、フロントエンドのJSと連携してSPAでもPolicyを適用できそう
Slack

OPAの最新情報や質問は今の所Slackが一番収集しやすいと思います!特に「general」と「openpolicyagent」のチャンネルがおすすめです。

slack.openpolicyagent.org

stackoverflow

これから徐々にQAはstackoverflowに増えていくはずなので、以下のタグをチェックしておくとナレッジがたまりそうです。

stackoverflow.com

おまけ

公式ドキュメントの検索がしやすくなるようにAlgoliaのdocsearchが採用されそうです。ドキュメントの検索が無いというのがOPAのハードルを上げている一つの要因になっている気もするので、これはぜひとも早めにマージにもっていきたいです!

github.com

僕とDDDとClean ArchitectureとやっぱりDDD

DDD(Domain Driven Design)って難しいですよね。難しい難しいとばかり考えていた僕もようやく最近になって少しずつわかってきた気がします。そのきっかけとなった書籍と僕のストーリーを本記事で紹介できたらと思います。

TL;DR

  • Clean Architectureはなんとなくわかる
  • DDDは難しい

と感じている人は「Domain-Driven Design in PHP」を読むと道が拓けるかもしれない。

leanpub.com

僕とDDD

DDDといえばEvansのドメイン駆動設計:

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

そしてVernonの実践ドメイン駆動設計:

実践ドメイン駆動設計 (Object Oriented SELECTION)

実践ドメイン駆動設計 (Object Oriented SELECTION)

が有名です。「ドメイン駆動設計」の内容をより実際の設計に当てはめている「実践ドメイン駆動設計」の方がわかりやすいという意見を聞いたりしますが、僕にとっては両方ともなかなかに難易度の高い書籍です。少しずつ読んでは「なんとなく言ってることはわかる」と思いながらも今ひとつ身についた気がしない類のものでした。このように感じている人はそれなりにいるんじゃないかなと思ってます。

僕とClean Architecture

DDD難しいし、実際のプロジェクトに適用しようと思っても手が止まる。。。

ということでしばらく本棚に戻していたのですが、次に見つけたのがClean Architectureなるものでした。Qiitaの記事で見つけたのがきっかけだったのですが、実際に自分の馴染みのあるコード(Rest APIだったりAndroidのアプリだったり)で書かれていたこともあって「これは実際のプロジェクトでも書けそう」と思えたのが「僕とDDD」の出会いとの大きな違いかなと思います。

実際にはQiitaの記事だけでは心もとないので、以下のような記事や講演で学びながら実案件でも適用していきました。

Uncle BobのClean Architectureの記事

blog.cleancoder.com

Uncle BobによるClean Architectureの講演

www.youtube.com

(いくつかありますが、最初にみて面白かったのがこれです)

Uncle Bobと息子のMicah MartinがペアプロしながらWebシステムを作る講義

learning.oreilly.com

GitHub上のソースコード

github.com

Clean Architecture(書籍)

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Clean Architecture 達人に学ぶソフトウェアの構造と設計

僕がClean Architecture学び始めたころはまだ無かったのですが、正式に書籍も発売されています。

Clean Architectureでモヤッとしたこと

Clean Architectureを採用したプロジェクトでは、オレオレClean Architectureでありながらもそれなりにルールを守った自信はあります(特に依存関係やScreaming Architecture部分)。が、いざ実装するとなったときに「ロジックをどこに置くのか」というところで結構悩むことがありました。

  • ○○ロジックはUseCase(Interactor)に入れる?
  • △△ロジックはEntityに入れる?
  • 同じようなロジック(例えばValidation)が複数箇所にあるけどこれは誰の役割?
  • などなど

Clean Architectureの書籍に「第20章 ビジネスルール」という章があるのですが、

  • エンティティは最重要ビジネスルールを含む
  • ユースケースアプリケーション固有のビジネスルールを含む

と言われてもなかなかエモくて直感的にわかりにくいと感じました。そして結構こういうところがコードレビューでチーム内で意見が分かれたりして変に時間がかかっちゃったりしたのを覚えています。「Clean Architecture良い!」という思いとともに「まだすっきりしない点が残る」という状態が続きました。「やっぱりDDDなマインドが足りていないからなのか?」ということでDDD学習に戻ることにしたのがここ1年くらいの話です。

DDDとClean Architecture

「実践ドメイン駆動設計」を再び読み直してみたのですが、不思議なことにClean Architectureを経てから読み直してみると見えてくるものが変わりました。たぶんですけど、

馴染みのあるコードからClean Architectureを学んだ
↓ 
Clean Architecture(書籍)を読んだら答え合わせのように腑に落ちる点が多かった
↓
この書籍内にドメイン駆動的な話も入っていた(んじゃないかと思う)
↓
無意識のうちにDDDの概念が少し増えた状態で改めて「実践ドメイン駆動設計」を読み始めた
↓
書籍内に出てくる単語や概念に馴染みが増していたので以前より想像しやすくなった

ということだと思います。

ただ、以前より理解がしやすくなったとは言え、モヤッとは残ったままで、以下のトピックを理解したいと思いつつもいまいちピンとこない感じでした。

  • Application Service
  • Domain Service
  • Aggregate
  • Entity
  • Value Object
  • Domain Event

結局繰り返しになるんですけど、「なんとなく言ってることはわかる」で止まってしまって、いざ自分のコードに入れようとすると「どうしたら良いんだろ?」になっちゃうんですね。(つまりわかっていない)

今にして思うと「わかろうとするモチベーションが足りなかった」だけな気もします。

そんな中最近「Domain-Driven-Design in PHP」という本に出会いました。

Domain-Driven-Design in PHP

leanpub.com

O'Reillyのサブスクリプションがある方はこちらのリンクからも読むことができます!

この書籍は結構前から知っていたんですけど、PHPというだけで避けてました。(ごめんなさい。でもそう思った人は僕だけじゃないはず!)

最近は毎日のようにPHP触ってますし、PHPへの抵抗も昔よりだいぶ無くなったので読んで見ることにしました。

久しぶりにこんなにワクワクする技術書を読んだ。

というのが素直な感想です。僕がちょうどモヤッとしているところとジャストミートな内容だった、というのもあるんだと思いますが:

  • ちょうど良いボリューム感
  • ドメイン駆動設計」, 「実践ドメイン駆動設計」, そして「Clean Architecture」にも言及している
  • DDDの概念とリンクする豊富なサンプルコード
  • 書籍用に作ったシステムがGitHub上に公開してある

という4つのポイントが僕の中で高評価です。

ちょうど良いボリューム感

ページ数は394ページとそれなりにあるのですが、コードが占めている比率が高いので思ったよりすぐ読めます(僕は3,4日で読めました)。

目次は以下の通り。

* Getting Started with Domain-Driven Design
* Architectural Styles
* Value Objects
* Entities
* Services
* Domain Events
* Modules
* Aggregates
* Factories
* Repositories
* Application
* Integrating Bounded Contexts
* Appendix: Hexagonal Architecture with PHP

「実践ドメイン駆動設計」と比べてみても、概ねトピックはカバーできていると言えます。

* Getting Started with DDD
* Domains, Subdomains, and Bounded Contexts
* Context Maps
* Architecture
* Entities
* Value Objects
* Services
* Domain Events
* Modules
* Aggregates
* Factories
* Repositories
* Integrating Bounded Contexts
* Application
* Aggregates and Event Sourcing: A+ES

ドメイン駆動設計」, 「実践ドメイン駆動設計」, そして「Clean Architecture」にも言及している

要所要所でEvansの「ドメイン駆動設計」とVernonの「実践ドメイン駆動設計」の引用を使って説明をしてくれます。

例えばDomain Eventについて「実践ドメイン駆動設計」からは:

Vaughn Vernon defines a Domain Event as:

An occurrence of something that happened in the domain.

そして「ドメイン駆動設計」からは:

Eric Evans defines a Domain Event as:

A full-fledged part of the Domain Model, a representation of something that happened in the Domain. Ignore irrelevant Domain activity while making explicit the events that the Domain Experts want to track or be notified of, or which are associated with state change in the other Model objects.

というように両者を引用で出してくれます。書籍内でのわかりやすさも増すのですが、この引用をもとに「ドメイン駆動設計」と「実践ドメイン駆動設計」をリファランスとして要所要所で読み直していける点もすごく良いです。

また、さらにうれしいのはUncle BobのClean Architectureにも言及している点です。(この書籍が発売したときには「Clean Architecture」はまだ出版されていないので、あくまでUncle Bob(Robert C. Martin)について言及しています)

As Robert C. Martin says: The Web is a delivery mechanism [...] Your system architecture should be as ignorant as possible about how it is to be delivered. You should be able to deliver it as a console app, a web app, or even a web service app, without undue complication or any change to the fundamental architecture.

DDDの概念とリンクする豊富なサンプルコード

(ちょっと大げさですけど)文章よりコードが多いんじゃないかってくらいサンプルコードが都度紹介されています。そして、コードの要所要所に関して丁寧にわかりやすく説明がされているので、DDDの概念とコードがどう結びついていくのかが想像しやすいです。

書籍用に作ったシステムがGitHub上に公開してある

書籍用に作られた「Last Wishes」というシステムのコードがGitHub上に公開されています。

f:id:kenev:20190731225924p:plain
Last Wishesトップ画面

コンセプトは「ユーザーが亡くなった場合に、あらかじめ登録されていたお願い(Wish)を、指定したメールアドレス宛に送る」というものです。お願い(Wish)を登録した場合にはゲーム要素もあって、一定ポイントたまるとバッジが付与されるようになっています。

このシステムは大きく2つのアプリケーションに分かれています。

  • ユーザーのWishを管理し、メールを送信するコア部分のアプリ
  • ゲーム要素を提供する、Wishに応じたポイントを換算し、ユーザー毎に管理するアプリ

それが各々以下で公開されています。

github.com

github.com

システム構成は下の図のようになっていて、それなりにまともなメンツが揃ったシステムになっています。

f:id:kenev:20190727222800p:plain
Last Wishesの概要図

サンプルアプリではあまり見られない:

  • CQRSとEvent Sourcing
  • Bounded Context(Last WishesとLast Wishes Gamify)

というのも学ぶことができるのでかなり貴重な素材だと思います。このシステムと書籍を照らし合わせていくことで答え合わせもしていけるので、理解が進みやすいという印象もあります。

まとめ

  • 「Domain-Driven-Design in PHP」を読んだ
  • 馴染みやすいコードでDDDを体系的に学べる良書だった
  • ドメイン駆動設計」「実践ドメイン駆動設計」「Clean Architecture」をリンクさせてくれる1冊だと思った

と、思いをつらつらと書きましたが、同じように迷い、悩んでいる方がもしいるのであれば「Domain-Driven-Design in PHP」はかなりおすすめできる1冊なのでぜひ読んでみてください!ということを伝えたかったです。

この記事が何かしら一歩先に進めるきっかけになれば幸いです。

今後の予定

  • Vernonの「実践ドメイン駆動設計」を読み直す
  • Evansの「ドメイン駆動設計」を読み直す
  • Uncle Bobの「Clean Architecture」を読み直す
  • Last WishesをLumenに移行してみる
  • ↑ができたらgoにも移行してみる
  • 自分でScratchからアプリを作ってみる

という流れで精進していけたらいいなと思います!

Zoomで読書会「アーキ部#2」に参加しました!

会社のSlackで流れていたのを見たのがきっかけで「アーキ部」なるものに初参加しました!

connpassでのイベントはこちら↓

architect-club.connpass.com

概要

connpassにも記載されてますが、Release It!: Design and Deploy Production-Ready Software (Second Edition) のオンライン読書会です!

Release It!: Design and Deploy Production-Ready Software

Release It!: Design and Deploy Production-Ready Software

目次

  • Ch.4 Stability Antipatterns(安定性のアンチパターン)
    • Integration Points(統合点)
    • Chain Reactions(連鎖反応)
    • Cascading Failures(カスケード障害)
    • Users(ユーザ) ←ここの途中まで

参加するにあたって準備するもの

Zoomのクライアント

zoom.us

勉強会はオンラインで開かれていて、Zoomを使います。今回は20時ごろにconnpass経由でZoomのURLが送られてきました。Zoomのクライアントはあらかじめ用意しておくとスムーズに参加できそうです。

参加人数は今回40人を超えていましたが、主催者の共有画面を参照するだけですし、参加者もみなビデオはOFFにしてるので回線速度が気になることは無かったです!

f:id:kenev:20190726231814p:plain
参加中のZoomの画面

Release It!: Design and Deploy Production-Ready Software (Second Edition)

本は無くてもOKですが、あればより理解を深めることができるんじゃないかなと思います。Second Editionは現時点(2019-07-26)では英語版しかありません。(間違えて初版の日本語版を買わないように注意!)

ちなみにSafari Books Onlineを購読している人であれば下記にあります。

learning.oreilly.com

ドリンク、軽食

オンライン勉強会なのでご自由に、というところですね!マイクONにしてボリボリ何か食べちゃわないようには気をつけたほうがいいですね(笑)

参加してみた感想まとめ

  • 司会(@kawasimaさん) が本の内容とともに実体験を話してくれるのですごく良い
  • 本の内容とともにたまに関連記事を紹介してくれるのうれしい
  • ハッシュタグ#アーキ部)で一緒に参加している人のツイートも見れるの良い
  • オンラインなので、勉強会が普段遠隔にしかない人(例えば山に住んでるような僕)にとっては本当にうれしい
  • オンライン勉強会に懇親会が最後に無いのが寂しいですが、この課題は難しい

本の内容に関してピックアップ

  • 統合点はシステムにとって殺し屋No.1
  • (ダイアグラムを見て)新米アーキテクトは箱にフォーカスするが、ベテランアーキテクトは、矢印により着目する
  • ぐっすり寝れるかどうかが安定性のKPI
  • 明らかに遅いレスポンスはレスポンスが無いことよりも悪い
  • ディフェンシブなコードになってないと、道連れに自システムも障害してしまうことになる
  • バグのあるアプリケーションをオートスケールすると、札束がとんでいく

次回!

たぶん日程はまだ決まっていないのですが、connpassのメンバーになっておけば通知がとんできますので、興味がある方はぜひ!

architect-club.connpass.com

このイベントをきっかけに「Release It!」読み始めましたが、かなり面白いです。が、リアルなので胃も痛くなってきます。書評にも挑戦したいですね。

関連記事

t.co

t.co

「CircleCIのconfig.ymlを守ろうとした話」を発表しました

「【大阪】CircleCI ユーザーコミュニティミートアップ #1」に参加し、「CircleCIのconfig.ymlを守ろうとした話」という題名でLTをしてきました。

circleci.connpass.com

発表資料

ストーリー

組織の中でCircleCIを多数のリポジトリで使い始めたとき、config.ymlに一定のルールを課したくなりませんか?セキュリティ的な意味と、Lint的な意味の両方で僕は欲しくなってきます。

ということでconfig.ymlにどのようにガバナンスを効かせることができるのか、という試みについて話しました。主にconftestでCIにルールを課す方法について述べています。

興味がある方はぜひ下の記事も読んでみてください!

kenfdev.hateblo.jp

また、ルールを書くときに用いているRegoについては、Open Policy Agentとともに以下の記事で紹介しています!

kenfdev.hateblo.jp

僕の発表内容には答えがなく、「みなさんはどのようにガバナンス効かせていますか?」と問うて終わりました! いろんな人のconfig.yml話聞きたいですねー!

おまけ

質疑応答コーナーがあったのですが、「config.ymlへのガバナンスの効かせ方で悩んでいる方いますか?」という質問に誰も反応しなかったので、僕が勝手に悩んでいるだけなのかもしれない、ということはそれとなくわかりました(笑)

そして、イベントでは「ワタシハサークルシーアイチョットデキル」Tシャツいただきましたー!感謝感謝です! f:id:kenev:20190717002821j:plain

Netlifyへのデプロイがタイムアウト

最近は仕事から趣味まで作ったもの(主にフロントエンド関連)のデプロイが簡単にNetlifyにできてしまうので多用しています。

www.netlify.com

直近ではVue.jsのコンポーネントをStorybookで公開しようとしたのですが、単純なタスクなはずが思いの外ハマってしまったので対処法をシェアしようと思います。

TL;DR

問題

npm run build のようなビルドタスクが30分以上かかってしまってNetlify側でタイムアウトしてしまう

解決方法

ビルド時のログの出力量に注意!特にwebpackのようにビルド時に大量にログを出力するツールを使う場合は、出力しないオプションを付加しましょう

Netlifyがタイムアウトする

発生していた問題とは、Netlifyがタイムアウトするというものです。

f:id:kenev:20190708214549p:plain

上の画面はVue.jsのStorybookをビルドしている最中のものです。静止画だけで伝えられないのですが、ビルドの進捗がものすごく遅いんです。このときは開始したのが12:45ごろだったので、およそ30分くらいこの調子でちょっとずつ%が上がるだけで、そのあと静かにデプロイが失敗します

サポートに問い合わせ

Netlifyはエラー文言も無しに静かに失敗し、ローカルではなんの問題もなくサクッとStorybookを開始できるのでお手上げでした。ということでサポートに問い合わせしてみることにしました。デプロイに失敗すると簡単にサポートに連絡できるようにリンクが用意されています。

f:id:kenev:20190708215150p:plain
問い合わせ

ここから問い合わせフォームが下のように入力できるようになっていて、Netlify側もデバッグしやすいようにリンクも自動で貼り付けてあるので、送信するだけです。

f:id:kenev:20190708215808p:plain

僕の場合、送信してから半日くらいでサポートから返事がきました。

内容を要約すると

「ビルドのログが多すぎて、Netlifyの Log Serviceが問題を起こしていた。Storybookのビルドするなら —quiet オプション付加してみて」

ってことでした。

なるほど、確かにログの表示が変に空白が多かったりしてましたね。

ログ出力量に注意!

ということでbuild-storybook—quietオプションをつけることにしました。公式サイトでもドキュメントされています。

https://storybook.js.org/docs/configurations/cli-options/

更新して再度デプロイしてみると、サクッと終わってサクッとNetlify上でStorybookが公開されました!

変に長時間悩み続けることなく、サポートに問い合わせてみてよかったです!

まとめ

  • Netlifyのビルドタスクのログ出力量には要注意
  • 可能であればログ出力が抑えられるオプションを付加しておくこと
  • NetlifyのサポートのUX最高でした

調べても同じ問題に遭遇している人を見つけられなかったので、この記事が誰かの助けになればと思います。

PHPの`$`と`->`がつらくなったらマクロを使えば良いことに気づいた

最近PHPを書くことが多いのですが、変数の前につける$(ドル記号)とメソッド呼び出しやプロパティ呼び出しに使う->(矢印)の指の動きの効率悪さに耐えられなくなりました。。。

PHPStormを使っているといい感じに$を入力しなくても変換してくれたりするのですが、その動きもまた気持ち悪く感じてしまうのでどうしたものかと思っていました。

f:id:kenev:20190624210413g:plain
慣れないと気持ち悪い

そこで今更ながら発見したのがエディタの「マクロ」機能です!

pleiades.io

マクロ作成

f:id:kenev:20190624210909p:plain

PHPStormであれば上のキャプチャのように「Edit > Macros > Start Macro Recording」を実行することでマクロの記録を始めることができます。

記録中は下図のようなインジケーターが表示されます。

f:id:kenev:20190624210939p:plain
マクロ記録中

ここでマクロとして入力したいキーを押します。$用のマクロを作りたいので$を入力すると、記録されているのがわかります。

f:id:kenev:20190624211226p:plain

そして赤い■をクリックするとマクロの記録が終わるので、このマクロに名前をつけてあげます。わかりやすく$にしておきます。

f:id:kenev:20190624211317p:plain

これでマクロは完成です!

同じ要領で->も作っておきましょう。

マクロのショートカット作成

マクロが完成したら、今度は自分の好きなショートカットでこれが入力されるようにします。

「Preferences > Keymap」に進んで、虫眼鏡のところでmacroと入力しましょう。下のように絞り込まれるはずです。

f:id:kenev:20190624211651p:plain

ここに先程作成した$->があるのがわかります。あとはここに自分の好きなキーの組み合わせを設定することで、以後このキーを入力すれば$->が入力できるようになります!

ちなみに僕は

  • $ctrl+s
  • ->ctrl+.

という設定にしました。ちょっとですけど快適になった気がします!

他の皆様がどうしているのか気になったりします(むしろ気にしてないですかね。。。)

まとめ

  • PHPStormのマクロを設定した
  • マクロならコードスニペットとは違ったショートカットを作ることができる

VSCodeであれば下記拡張機能を使えばできそうな気がします!

github.com

explainshell.comはシェルの強力な助っ人

f:id:kenev:20190616075801p:plain
explainshell.com

最近explainshell.comなるものを今更ながら知ることができたので紹介します!

explainshell.com

概要

シェルコマンドを全部覚えるのって大変です。なんとなく覚えてても、オプションがどんな意味をもっていたかまではなかなか思い出せないです。おまけにシェルは強力なのでパイプ(|)でどんどん繋げていい感じにコマンドを書いていくことができます。そんな芸術ともいうコマンドを見ては、manを見たりググったりして、分解しながらコマンドを理解していっているのはきっと僕だけじゃないはず。

そこで便利なのがこのexplainshell.comというサイトです!

使い方

使い方はいたって簡単で、インプットに知りたいコマンドを入力するだけ。

試しに最近覗いてみた下のk3sのインストールスクリプトから抜粋してみます。

https://get.k3s.io

lsof | sed -e 's/^[^0-9]*//g; s/  */\t/g' | grep -w 'k3s/data/[^/]*/bin/containerd-shim' | cut -f1 | sort -n -u

f:id:kenev:20190616080716p:plain

すごい!全部のコマンドに丁寧な説明がいい感じにつくんです!

そして「←→」で順番にコマンドの解説を表示していくことも可能。

f:id:kenev:20190616081012g:plain

とってもシンプルですけど、ブックマークしておけば困ったときにサクッと使えて重宝しそうです!

おまけ

おまけですが、僕の場合はAlfredにショートカットを作ってすぐに調べられるようにしてます。

www.alfredapp.com

参考までにWeb Searchの設定は下のようにしています。

f:id:kenev:20190616085456p:plain

そうすると下のようにすぐに調べることができます!

f:id:kenev:20190616091822g:plain

まとめ

  • explainshell.comを試した
  • シェルコマンド調べるときに便利
  • Alfredなどツールと連携すればさらに強力!