Git Product home page Git Product logo

mashtun's Issues

[期待] Wi-Fiによる充電

iPhone,MACがコンセントにささなくても充電

電源ケーブルを捨てたい。

課題

  • 充電の安定性
  • 充電速度
  • 充電するために電波の力を強くするのであればそれによる影響

今あるワイヤレス充電は?

  • 置くだけで充電できる!
  • コネクタをさすところがダメにならない!
  • 最新技術でかっこいい!

ワイヤレス充電のデメリット

  • 充電が遅い
  • 置く位置が悪いと充電できない
  • 充電の位置が固定化されてしまう

Webアクセスログ分析

Webアクセスログの基本KPI分析

Webアクセスログで重要なポイントとして,クッキーIDやユーザIDなど一意にユーザを区別できるデータを利用することで,ユーザがどの程度自社に来てくれているのか,ユーザに見て欲しい情報をユーザに届けられているのかを確認することができます。

ユーザ動向に関する基本KPI
ページビュー(PV: Page View)
ページビューは,一日のアクセス回数を表す最も基本的な指標です。
ユニークユーザ数(UU: Unique User)
ユニークユーザ数は,同日(または同月,同年)の一人のユーザの複数回のアクセスを1回と見なした指標です。
平均アクセス回数
PV / UU で計算される,一人当たりの1日の平均アクセス回数です。
新規ユーザ数
新規ユーザ数は,初めてサイトにログインしたユーザを日別にカウントしたものです。
直近と最終訪問日までの期間
特定の日付を基準日として,各ユーザの最終訪問日が何日前(日単位)だったのかを求める指標です。
最終訪問日の分布
こちらは各ユーザの最終訪問日ごとに集計し,分布をみるものになります。
直帰率
直帰は訪問はしたものの,他のページに移動せずに去ってしまったものおよび,同日に再訪問を行わなかったユーザの数を数えます。
高頻度訪問ユーザの一覧(週n日以上)
基準日までに n日連続訪問したメンバーの数を数えます。
連続訪問ユーザ一覧(直近n日連続)
基準日までの直近1週間で,n回以上ログインしているメンバーの数を求めます。
上記のようにあるWebページ全体の情報を点で分析するのが基本KPIと言えます。こうした基本KPIを毎日収集し,定型レポートして観測できるようにすることで,長期間での変化がわかるようになり,何らかのイベントによる変化などを通して新たな知見を得ることができるようになります。

Webアクセスログの応用KPI分析

さて,さらに深い応用KPIとはどのようなことをするのでしょうか? それは点による分析を期間ではなく,ユーザがWebページ上を行動した点と点をつないだユーザの動線による分析,つまりパス分析が応用KPIの1つとなるでしょう。

パス分析とは,ユーザごとの流入からコンバージョン(ユーザにたどり着いて欲しいパスやアクションのこと,たとえば商品の購入やカタログダウンロードなど)に至るまでの「パス」そのものを分析の軸とする手法です。

ユーザのパス自身を見ることによって,点による基本KPIの分析のみを行ってきたユーザにとっては,下記のような新しい観点の分析ができるようになります。

パス平均長
コンバージョンまでにいくつのページを踏んでリーチしたのか,コンバージョンの「効率」に関して理解することができます。
コンバージョン時間
流入からコンバージョンに至るまでの時間(数分であるものもあれば数週間であるものもある)⁠。同様に「効率」に関して理解することができます。
パス類型
長さや組み合わせが無限大のパスに対して,特定のルールに従ってパスを分類し,その分類の中でどのパス類型がコンバージョンに寄与しているかを知ることができます。
スコアリング
パスの概念をもって改めてページを評価するには,パスの中でどの位置に出現するかによって重みを変えることによってパスの中でも重要度を発見できます。
これらの基本KPIで長期的な変化をみながら,応用KPIを出すことによりパスの変化で基本KPIがどのように変わるかの変化も捉えることができるようになります。

ドレイファスモデル

http://www.02.246.ne.jp/~torutk/seway/dreyfus.html

段階 一言 内容
第1段階 初心者 レシピが必要 経験をほとんど持たないコンテクストに左右されないルールが与えられれば仕事を遂行できる学びたい意欲はそれほどない
第2段階 中級者 全体像を見たがらない 独力で仕事に当たれるが問題処理に手こずるほんの少しだけ決まったルールから離れられる情報を手早く入手したがるが、理論・原則は望まない(私には関係ない)
第3段階 上級者 問題解決ができる 問題を探し出し解決する、但し細部のどの部分に焦点を合わせるべきかの決定にはさらなる経験が必要、チームの指導者的役割、初心者への助言、達人のサポート
第4段階 熟練者 自己補正が可能 十分な経験と判断力を備える自己改善、他人の経験から学ぶ、格言を理解しうまく適用する能力を備える(例:パターンを効果的に適用)何が失敗につながるか分かる
第5段階 達人 直感で動く 膨大な経験があり、上手に引き出しぴったりの状況で応用できる理由があってそうするのではなく、直感に従って行う(「正しいと感じた」)本質に関係のない部分と重要な部分の区別が無意識下でできる

Set up local development environment with Docker

  • Implement a single startup script for launching the environment.

  • Document how developers should launch the environment and run some specific commands (e.g. start/stop application).
    There should not be any dependency that developers have to install into their local machines (except for Docker and editors).

  • Developers can mount source code from their local machine to the environment so that they can write code using their favorite editors and have their code automatically sync into the environment.

  • Document how developers can mount source code from their local machine to the environment.
    There’s at least one tool to debug the application. The tool should be robust and easy to use.

  • Document how developers should debug the application during development.

document template

Here’s a template for a brag document! Usually, I make one brag document per year. (“Julia’s 2017 brag document”). I think it’s okay to make it quite long/comprehensive – 5-10 pages or more for a year of work doesn’t seem like too much to me, especially if you’re including some graphs/charts/screenshots to show the effects of what you did.

One thing I want to emphasize, for people who don’t like to brag, is – you don’t have to try to make your work sound better than it is. Just make it sound exactly as good as it is! For example “was the primary contributor to X new feature that’s now used by 60% of our customers and has gotten Y positive feedback”.

Goals for this year:

List your major goals here! Sharing your goals with your manager & coworkers is really nice because it helps them see how they can support you in accomplishing those goals!

Goals for next year

If it’s getting towards the end of the year, maybe start writing down what you think your goals for next year might be.

Projects

For each one, go through:

What your contributions were (did you come up with the design? Which components did you build? Was there some useful insight like “wait, we can cut scope and do what we want by doing way less work” that you came up with?)
The impact of the project – who was it for? Are there numbers you can attach to it? (saved X dollars? shipped new feature that has helped sell Y big deals? Improved performance by X%? Used by X internal users every day?). Did it support some important non-numeric company goal (required to pass an audit? helped retain an important user?)
Remember: don’t forget to explain what the results of your work actually were! It’s often important to go back a few months later and fill in what actually happened after you launched the project.

Collaboration & mentorship

Examples of things in this category:

Helping others in an area you’re an expert in (like “other engineers regularly ask me for one-off help solving weird bugs in their CSS” or “quoting from the C standard at just the right moment”)
Mentoring interns / helping new team members get started
Writing really clear emails/meeting notes
Foundational code that other people built on top of
Improving monitoring/dashboards/ on call
Any code review that you spent a particularly long time on / that you think was especially important
Important questions you answered (“helped Risha from OTHER_TEAM with a lot of questions related to Y”)
Mentoring someone on a project (“gave Ben advice from time to time on leading his first big project”)
Giving an internal talk or workshop

Design & documentation

List design docs & documentation that you worked on

Design docs: I usually just say “wrote design for X” or “reviewed the design for X”
Documentation: maybe briefly explain the goal behind this documentation (for example “we were getting a lot of questions about X, so I documented it and now we can answer the questions more quickly”)

Company building

This is a category we have at work – it basically means “things you did to help the company overall, not just your project/team”. Some things that go in here:

Going above & beyond with interviewing or recruiting (doing campus recruiting, etc)
Improving important processes, like the interview process or writing better onboarding materials

What you learned

My friend Julian suggested this section and I think it’s a great idea – try listing important things you learned or skills you’ve acquired recently! Some examples of skills you might be learning or improving:

how to do performance analysis & make code run faster
the internals of an important piece of software (like the JVM or Postgres or Linux)
how to use a library (like React)
how to use an important tool (like the command line or Firefox dev tools)
about a specific area of programming (like localization or timezones)
an area like product management / UX design
how to write a clear design doc
a new programming language
It’s really easy to lose track of what skills you’re learning, and usually, when I reflect on this I realize I learned a lot more than I thought and also notice things that I’m not learning that I wish I was.

Outside of work

It’s also often useful to track accomplishments outside of work, like:

blog posts
talks/panels
open source work
Industry recognition
I think this can be a nice way to highlight how you’re thinking about your career outside of strictly what you’re doing at work.

This can also include other non-career-related things you’re proud of if that feels good to you! Some people like to keep a combined personal + work brag document.

General prompts

If you’re feeling stuck for things to mention, try:

If you were trying to convince a friend to come to join your company/team, what would you tell them about your work?
Did anybody tell you you did something well recently?

etcdデーターを覗く

refs

https://stackoverflow.com/questions/45744534/etcd-v3-cant-read-encoded-values

steps

git clone https://github.com/jpbetz/auger
cd auger
make release
build/auger -h
controlplane $ kubectl run --namespace=default --image=nginx nginx2 -v8
I1206 08:07:49.583600   12349 loader.go:375] Config loaded from file:  /root/.kube/config
I1206 08:07:49.592580   12349 request.go:1068] Request Body: {"kind":"Pod","apiVersion":"v1","metadata":{"name":"nginx2","creationTimestamp":null,"labels":{"run":"nginx2"}},"spec":{"containers":[{"name":"nginx2","image":"nginx","resources":{}}],"restartPolicy":"Always","dnsPolicy":"ClusterFirst"},"status":{}}
I1206 08:07:49.592859   12349 round_trippers.go:420] POST https://172.17.0.34:6443/api/v1/namespaces/default/pods
I1206 08:07:49.593007   12349 round_trippers.go:427] Request Headers:
I1206 08:07:49.593142   12349 round_trippers.go:431]     Accept: application/json, */*
I1206 08:07:49.593281   12349 round_trippers.go:431]     Content-Type: application/json
I1206 08:07:49.593408   12349 round_trippers.go:431]     User-Agent: kubectl/v1.18.0 (linux/amd64) kubernetes/9e99141
I1206 08:07:49.615734   12349 round_trippers.go:446] Response Status: 201 Created in 22 milliseconds
I1206 08:07:49.615917   12349 round_trippers.go:449] Response Headers:
I1206 08:07:49.616041   12349 round_trippers.go:452]     Content-Type: application/json
I1206 08:07:49.616132   12349 round_trippers.go:452]     Content-Length: 1735
I1206 08:07:49.616248   12349 round_trippers.go:452]     Date: Mon, 06 Dec 2021 08:07:49 GMT
I1206 08:07:49.616461   12349 request.go:1068] Response Body: {"kind":"Pod","apiVersion":"v1","metadata":{"name":"nginx2","namespace":"default","selfLink":"/api/v1/namespaces/default/pods/nginx2","uid":"15d845e0-344e-48b9-b75b-896878781e97","resourceVersion":"3441","creationTimestamp":"2021-12-06T08:07:49Z","labels":{"run":"nginx2"},"managedFields":[{"manager":"kubectl","operation":"Update","apiVersion":"v1","time":"2021-12-06T08:07:49Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:run":{}}},"f:spec":{"f:containers":{"k:{\"name\":\"nginx2\"}":{".":{},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:resources":{},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{}}},"f:dnsPolicy":{},"f:enableServiceLinks":{},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{},"f:terminationGracePeriodSeconds":{}}}}]},"spec":{"volumes":[{"name":"default-token-cz5f4","secret":{"secretName":"default-token-cz5f4","defaultMode":420}}],"containers":[{"name":"nginx2","image":"nginx","resources":{},"volumeMounts":[{"name":"default-token-cz5f4", [truncated 711 chars]
pod/nginx2 created
controlplane $
controlplane $  sudo ETCDCTL_API=3 etcdctl --cacert /etc/kubernetes/pki/etcd/ca.c/pki/apiserver-etcd-client.key get /registry/pods/default/nginx | build/auger decode

イシューから

イシュードリブン
本当に答えを出すべき問題=「イシュー」を見極める

仮説ドリブン
・ブレークダウンイシューを解けるところまで小さく砕き、それに基づいてストーリーの流れを整理する

・ゴールの設定

ストーリーを検証するために必要なアウトプットのイメージを描き、分析を設計する。

アウトプットドリブン
ストーリーの骨格を踏まえつつ、段取りよく検証する。

メッセージドリブン
論拠と構造を磨きつつ、報告書や論文をまとめる。

Bebit p&r 2019

Change Should Be Gradual
Tooling and Culture Are Interrelated

portability

turn everything to code
image size up to 100M
pipeline up to 3 steps
image build time up to 3min

「Problem」と「Issue」を微妙に違った感覚

  1. Problem
    →「解決されるべき問題」

一般的に「Problem」は「解決」されるべき問題を指します。問題がネガティブな影響を及ぼしたり、弊害をもたらしたりするため、何かしらの解決策を見出す必要性がある場合に使われます。例えば「飲酒運転の問題」。飲酒運転で毎年多くの事故が発生し、死者も出ています。飲酒運転は弊害をもたらすので、この場合「Problem」が使われます。

「Problem」は一般的に「社会や組織全体」に関わる問題

・Drinking and driving is a problem.(飲酒運転は問題です)
・There is a problem with our Internet.(ネットの問題があります)
・We are facing serious financial problems.(我々は深刻な財政問題を抱えています)
  1. Issue
    →「議論されるべき問題」

一般的に「Issue」は「議論」されるべき問題を指します。議論することによって、賛成の声が出たり、反対の声がでたり、賛否両論であることから難しい決断が求められる時に使われることが多いです。例えば、アメリカでは法律上18歳で“大人”ですが、お酒は21歳から。お酒も18歳に変えましょうという提案は大きな議論をもたらすでしょう。このような「問題」は「Issue」が使われます。

「Issue」は一般的に「会社や組織の一部」に関わる問題

・We have an issue.(問題があります)
・I’m having issues with my co-worker.(同僚と問題になっています)
・We will appropriately deal with this issue.(この問題を適切に処理します)

https://hapaeikaiwa.com/2014/07/03/ネイティブは「problem」と「issue」を微妙に違った感覚/

prom rate

クエリの詳細説明

CPUのsystemモードの使用率をstep by stepで、下記のデモン環境を用いて検証しました。

https://bit.ly/3uXhUrB

sum(avg without(cpu) (rate(node_cpu_seconds_total{mode="system"}[30s])))by (instance)

node_cpu_seconds_totalメトリクス

node_cpu_seconds_total

PromSQL:

node_cpu_seconds_total{mode="system"}[30s]
  • node_cpu_seconds_total{mode="system"}

システム起動されてから、2022-04-06 22:22:03までに、systemモードでCPUが稼働していた秒数である。

  • node_cpu_seconds_total{mode="system"}[30s]

2022-04-06 22:22:03から30秒前まで(22:21:33 - 22:22:03)のデータポイントを取得する。

cpu="0"の場合:
1649251300.323 = 22:21:40.323
1649251315.323 = 22:21:55.323

node_cpu_seconds_totalは、Node Exporterによるスクレイプされるメトリクスで、スクレイプ間隔15秒でありる。

よって、上記クエリで2つのデータポイントが取得される。

rate関数

rate

PromSQL:

rate(node_cpu_seconds_total{mode="system"}[30s])

cpu="0"のrateの計算方法は、

(867403.62s - 867403.17s)/(1649251315.323s - 1649251300.323s)
= 0.45s / 15s
= 0.03

rateは、カウントの変化量を、指定される期間で割る。

rateのカウントの変化量は、一番最近のデータから、一番古いデータを引く。
irateのカウントの変化量は、一番最近のデータから、二番目最近のデータを引く。

このケースにおいて、データポイント2つしかないので、rateとirateは同じ結果になる。

avg without(cpu)

avg without(cpu) (rate(node_cpu_seconds_total{mode="system"}[1m]))

cpu="0"cpu="1"の平均値を求める。

(0.02999999999689559 + 0.028666666670081515)/2
= 0.02933333

sum

sum(avg without(cpu) (rate(node_cpu_seconds_total{mode="system"}[1m])))by (instance)

ターゲットは一つしかないので、効果が確認できない。

Kubernetes secret objects

what's the problem

https://github.com/bitnami-labs/sealed-secrets

Problem: "I can manage all my K8s config in git, except Secrets."

Solution: Encrypt your Secret into a SealedSecret, which is safe to store - even to a public repository. The SealedSecret can be decrypted only by the controller running in the target cluster and nobody else (not even the original author) is able to obtain the original Secret from the SealedSecret.

ストーリー作りための自分への問いかけ

施策の背景は何か?
何が課題なのか?
どのような技術で解決するのか?
どのメトリクスがどこまで改善することで成功と言えるのか?
どんなところに苦労したのか?(苦労しそうか?)

change k8s shortcuts

k8s resources with shortcuts:

pods, po
nodes, no
deployments, deploy
replicasets, rs
daemonsets, ds
statefulsets, sts
jobs
cronjobs, cj
services, svc
persistentvolumes, pv
persistentvolumeclaims, pvc
deployments, deploy             **dem**
replicasets, rs                         **res**
daemonsets, ds                      **das**
statefulsets, sts

The UNIX philosophy

UNIXという考え方 The UNIX philosophy

定理

1. Small is beautiful. 小さいものは美しい

小さいものは、大きい物にない利点がいくつもある。小さいもの同士なら簡単に独特の便利な方法で組み合わせることができる
小さなプログラムという発想
  • 小さなプログラムはわかりやすい
  • 小さなプログラムは保守しやすい
  • 小さなプログラムはシステムリソースに優しい
  • 小さなプログラムは他のツールと組み合わせやすい
一般にソフトウェアの開発者は、巨大なプログラムを書いてしまう。
これは「あらゆる不測の事態に対応できるように」という誤った考えに基づくものだ。
巨大で複雑なプログラムの開発者は、「将来が予測可能で、そして現在とそう大きくは変わらない」
という勝手な思い込みを前提としている。
一方、小さなプログラムの開発者は、未来の予測など最初からあきらめている。
彼らの予測することは、明日作られるものは今日作っているものとは違うということでしかない。
作った時には予測できなかったことに対しても、小さなプログラムなら直ちにそれに対処できる。
未来に目を向けよう。未来は、思っているより早く来る。

2. Make each program do one thing well. 1つのプログラムには1つのことをうまくやらせる

一つのことに集中することでプログラムに不要な部分をなくせる。
不要な部分があると、実行速度が遅くなり、不必要に複雑になり、融通が効かない。
  • creeping featurism(しのびよる多機能主義)
プログラマはシンプルなApplicationを書くかもしれない。
しかし、彼のCreativeさが新機能や新しいオプションを付けさせてしまうのだ。
そのコードが本当に必要なのかどうかを常に意識しておくべきだ。
・プログラムはユーザーとの対話を必要とするのか?パラメータはファイル読み込みや引数で出来ないのか?
・プログラムの入力データが特殊フォーマットである必要があるのか?他のプログラムに回せないのか?
・プログラムの出力データが特殊フォーマットである必要があるのか?他のプログラムに回せないのか?
・新しくプログラムを書く必要があるのか?他のプログラムを組み合わせれないのか?
  • 小さなプログラムは単一機能になる傾向があり、単一機能のプログラムは小さくなる傾向がある。

3. Build a prototype as soon as possible. できるだけ早く試作する

あらゆるプロジェクトにおいて、プロトタイプは重要である。
一般的にプロトタイプは設計全体のうちの一部として扱われているが、
UNIXにおいてのプロトタイプは、効率的な設計には欠かせない重要な一部である。
  • ソフトウェアに完成はない
ソフトウェアには常に改善の余地はあるのはもちろんだし、時間的な制約などでそのソースコードは必ずしも最高の状態が保たれているわけではない。
ほとんどのソフトウェアは妥協の産物だ。完成することはなく、ただリリースがあるだけだ。
ソフトウェアや計算機が常に進化していることを意識しなければならない。
UNIXの考え方はソフトウェアの進化にも強い。
ソフトウェアを小さくてシンプルな部品に分割すれば、
将来の変更に容易に対応できるし、ソフトウェアを容易に移植可能にしておけば、来年には利用できるようになる、
よりはやい計算機でも簡単に動かすことができる。
  • なぜソフトウェアは「ソフト」ウェアなのか
ユーザーが自分たちの望むもの正格に表す事ができ、ソフトウェア技術者たちが、ユーザーが現在必要としている機能と
将来必要になるであろう機能とをすべて把握していたとすれば、ソフトウェアはいらないだろう。
すべてのプログラムが最初からROMに書かれていればいい。残念ながら、そのような完璧な世界は存在しない。
リリース後に進行状況の報告を絶えず受け、対応した進路に修正していくことこそがゆういつの拠り所となる。
誰もが常に学び続けている。たとえ我々がすべてを知り尽くしたと勝手に思い込んでいても、誰かが我々への要求仕様を
変えてしまうのだ。
  • 第一のシステム、第二のシステム、第三のシステム
人間にはこの三種類のシステムしか作れない。
人間の作るSystemは人間に似るということなのかもしれない。
人間が、若さからはじまり、成熟し、やがて老いていくように、
システム設計にも若い設計、成熟した設計、枯れた設計がある。
  • 追い詰められた人間が第一のシステムを作る
第一のシステムは、一人もしくは少人数が、時間に追われる中で創造性を発揮し、勢い良く作ったシステムだ。
時間追われたために、足りない機能もあるが無駄はなく効率的に動く。
さまざまな批判を浴びせかけられるだろう。
しかし、当の本人は「ああ、そりゃちょっと汚いのは分かってる。でもちゃんと役に立ってるだろ!」と、こういうだろう。
「正しく」やっている時間など無い。
「正しく」やる時間がない人間は、重要な箇所だけに集中して枝葉を無視する。
その結果、いくつかの細かい点は次のバージョンに回そうと計画する
第一のシステムのコンセプトは、人間の想像力を刺激する。
この段階で大規模になることはない。
チームが大きくなることで意思疎通・個性の衝突がおきる。
このタイミングで人を投入してもあちこちに縄張りが出来るだけであり、第一システムの実現すら危ぶまれる。
人月の神話である。
  • 人間による第二のシステム
しかし、第一のシステムが成功しはじめると、多くの人が集まってくる。
そして、「専門家」が第一のシステムにより有用性が証明されたアイディアを用いて第二のシステムを作る。
第二のシステムは第一のシステムに目をつけた多くの参加者からなる委員会が機能を決定する。
その結果として、多くの人の意見(独自技術症候群を持った意見も含む)を取り込みすぎるため、機能は多いが、無駄のある遅いシステムができあがる。
多くの人に期待された第二のシステムは時には商業的にも成功するが、実はあまり役に立たない。
  • 人間による第三のシステム
第二のシステムで「火傷」した人々が、第三のシステムを構築する。
第三のシステムだけが、第一のシステムが発見したアイディアと第二のシステムの中で見つかった必要な機能をバランスよく取り入れて、やっと役に立つシステムを構築することができる。
Systemの目的はしっかり把握され、使用するギジュ湯もすでに証明済みであるため、リスクは小さい。意思決定の段階で、正格な予算を組み、正格なスケジュールを建てることができる。
第三のシステムの設計者には、ようやく「正しく」やることが出来る時間が与えられる。
  • 効率的に第三のシステムを構築するために
UNIXの考え方では、なるべくはやく第三のシステムを構築するために、すばやく試作することをおすすめしている。
直接、第三のシステムをつくることはできないのだ。
1 短い機能仕様書を書く(3〜4枚程度)
2 ソフトウェアを書く
3 テストして書き直す。満足できるまで、これを繰り返す。
4 詳細なドキュメントを(必要なら)書く

4. Choose portability over efficiency. 効率より移植性を優先する

現在のハードウェアに制限されないソフトウェアこそ、未来でも利用される
  • 最も効率のよい方法は、ほとんどの場合移植性に欠ける
ハードウェアと切り離すことができないソフトウェアは、そのハードウェアが競争力を持ち続ける間しか価値を維持できない
より高速なハードウェアによって既存のハードウェアが置き換えられる度に書き直さなければならない。

5. Store numerical data in flat ASCII files. 数値データはASCIIフラットファイルに保存する

移植性を保つ上で、各OSのバイナリーファイルに依存しないASCIIフラットファイルに保存し、参照可能にする。
データをわざわざバイナリーにする必要がない。

6. Use software leverage to your advantage. ソフトウェアを梃子(てこ)として使う

プログラムの再利用は、ソフトウェアの梃子を最大限に活用した強力な考えだ。
UNIXの開発者たちは、この考え方に従って、非常に多くのApplicationを比較的に短期間に開発してきた。
  • 独自技術症候群
一般に信じられているところとは反対に、独自技術症候群は創造性を伸ばさない。他人の仕事を見て、自分のほうがうまくできると主張してみても
それだけで創造性が増えるわけではない。
既存のApplicationをゼロから設計し直すことは模倣であっても創造とは言わない。
むしろこれを避ける事で、新しい、わくわくするような設計世界への扉が開かれる。
「自尊心」の誘惑に負けてはいけない。
  • すべてを自動化する
ソフトウェアの梃子をクカ的に利用する方法の一つは、マシンをより激しく働かせることだ。
コンピュータにできることを人間が手作業で行うのは時間の無駄だ。
おどろくべきことに現代的なエンジニアの研究所でさえ、中に入ってみると、驚くほど多くの熟練技術者が日常の業務を手作業で行っている。
よい方法を知ってはいても、昔からの習慣はなかなかなくせない。人間が必要以上に働き過ぎ、コンピューターが眠っているということは無いだろうか?

7. Use shell scripts to increase leverage and portability. シェルスクリプトによって梃子(てこ)の効果と移植性を高める

shell scripts はソフトウェアの梃子を活かすと同時に移植性も高めるという2つの効果がある。

8. Avoid captive user interfaces. 過渡の対話的インターフェースを避ける

いくつかのコマンドは、「ユーザーを拘束する」インターフェースを持つ。
そのコマンドを実行してしまうと、実行中に他のコマンドを実行することはできない。
そのコマンドの実行中は、ユーザーはそこをはなれられなくなってしまう。
この類のものを「拘束的」ユーザーインターフェースと呼ぶ。
先端技術の胸囲を使いこなすにあたっては、ユーザー側にもある程度の知識が必要となる。
モノが小さくなって高度になればなるほど、使うために必要な知識も増してくるように見える。
以下の様な特徴がある
・小さなものは人間にあまり良く馴染まないということ。
・小さなものは、人間とはよく馴染まなくても、互いにはよく馴染むということだ。
コンピューターソフトウェアの世界においても、
小さなプログラムやモジュールを数多く持つことで環境への適応能力は最大となる。
しかし、残念ながら、モジュールが小さくなればなるほど、ユーザーとのインターフェースという問題が大きくなってくる。
モジュールの数が増えれば増えるほど、取り扱いも煩雑になる。
そこにソフトウェア設計者にとってのジレンマがある。アプリケーションに最大の柔軟性を求めて、数多くの小モジュールから構築する。
しかし、一方では、ソフトウェアを使いやすいものにするという要件も無視できない。モジュールの数が多すぎると扱いが困難になる。
UNIXは、この矛盾を解決するためにユニークな方法を用いる。
ほとんどのシステムは、ユーザーとモジュールとの間に広がりつつ有る溝を、「拘束的」ユーザーインターフェースと呼ばれるソフトウェアで埋めようとする。
UNIX開発者も溝が広がる一方であることは認めている。
しかし、ユーザーとモジュールとを大量の「スパゲッティ」コードで結びつけるのではなく、その溝を少しずつ小さな塊または層にして減らしていこうとする。
UNIXユーザーの多くは、ユーザーが誤ったパラメータを入れると、必要なパラメータとその使い方を示す簡単なMessageを表示する。
UNIXユーザーが拘束的なユーザーインターフェースを避けるのには、もう少し深い理由がある。
UNIXユーザーにとっては、コメンど同士を対話させる方法が必要なのだ。
  • 拘束的プログラムはユーザーを人間と想定している
拘束的プログラムの開発者は、キーボードの前に人間がいるという前提で設計している。
コンピューターが人間の限界に制約され、システムがユーザー入力を待つ必要があると、
キーボードの前に座る人間と同じ早さでしか動作できない。つまり、全く早くないということだ。
姑息的プログラムは「大きい物は美しい」的アプローチをとる
拘束的プログラムは、他のプログラムと結合するのが難しい。
拘束的ユーザーインタフェースはスケーラビリティに欠ける
最も重要な事に、拘束的ユーザーインタフェースはソフトウェアの梃子を効果を利用できない。
「Yes/No」やユーザー入力、その他の応答をユーザーから引き出したりする。

9. Make every program a filter. すべてのプログラムをフィルタとして設計する

ソフトウェアの本質は、データを処理することで、生成することではない。
その能力を最大限に発揮するためには、プログラムをフィルタとして動作するように設計すべきだ。
すべてのプログラムは、何らかの形式のデータを入力として受け入れ、何らかの形式のデータを出力として生成する。
プログラムはデータを作らない。人間がつくる
一般にはアプリケーションがデータを作ると信じられているが、実際のところ、アプリケーションにはデータを作る能力など無い。
データを作るには、想像力が必要だ。そして、オリジナルの情報源が必要だ。コンッピュータは情報源を持たない。
コンピュータは、データを一つの係止から別の形式に変換する。

重要度の低い定理

1. Allow the user to tailor the environment. 好みに応じて自分で環境を調整できるようにする

UNIXのユーザーは、自分の思い通りに環境を手直しすることを好む。

2. Make operating system kernels small and lightweight. OSのカーネルを小さく軽くする。

新機能の追加要求が次から次へと出てくる中でも、UNIXの開発者たちはOSの中心部分を小さく軽く保つことを好んできた。
アプリケーションのパフォーマンスを高めたいと思う人がまず考えるのは、ランタイムルーチンをカーネルに組み込むことだ。
実行中のアプリケーション間のコンテキストスイッチが減るが、代わりにカーネルが大きくなり、他のUNIXカーネルとの整合性も
失われてしまう。
Xウィンドウシステムの開発の初期段階で、Xサーバーの一部をUNIXカーネルに埋め込むことが提案され、
それでパフォーマンスが高くなるかどうかをめぐって激しい意見の対立があった。
結論、Xサーバーにバグがあると、ウィンドウシステムがクラッシュするだけではなく、OS全体がクラッシュすることがわかり、Xサーバーはユーザー空間に置かれている。
カーネルが小さくて軽ければ、タスク開始時にコピーもしくは変更するデータ構造体の数が少なくすみ、ユーザー空間でタスクがすみやかに実行できる。
「一つのことだけをうまく」実行する小さなプログラムの集まりが効率よく動作するためには、カーネルが小さいことがぜひとも必要となる。小さな単一機能
プログラムが迅速に実行されることは、UNIXのパフォーマンスに取って極めて重要だ。

3. Use lower case and keep it short. 小文字を使い、短く

アルファベットの小文字を使うのがUNIXの伝統。もともとはそうする理由があったが、進化とともに理由が無くなった現在でも
UNIXユーザーの好みは変わっていない。

4. Save trees. 森林を守る

UNIXユーザーは紙のドキュメントを嫌う。
すべてのテキストファイルをコンピュータに保存して、強力なツールでそれらを操作するのだが、このことに十分な理由がある。
「データを紙に印刷してしまったら、もうそれ以上操作出来ないんだぞ」と、上司は言った。
紙に印刷されたデータは、並び替えも、移動も、フィルタ処理も、変形も、修正も出来ない。
少なくとも、コンピュータ上でやるように簡単には出来ない。
瞬時に取り出せるように、巨大なディスクファームにアーカイブ保存することも出来ない。キー一つで検索することも出来ない。
保護したい機密情報なのに暗号化もできない。
動かせないデータは死んだも同然だと前に言ったことを覚えているだろうか?紙に印刷されたデータも同じことだ。

5. Silence is golden. 沈黙は金

UNIXのコマンドは、詳細なエラーメッセージを出すべき時にも、悪名高いほど沈黙を守る。
UNIXに慣れたユーザーはそれが一番いいと考える。
UNIXは一般に「ドライ」で、ただ「事実」だけを伝える。それ以上でも以下でもない。
 ls -l | awk '{ print $4 }' | sort
 ここでlsが"DIRECTORY: NO FILES FOUND"という出力をパイプラインに送ったらどうなるのだろうか。
 このメッセージの4番目のフィールドが”FOUND”であるから、sortコメンからの最終出力として、
 意味不明の"FOUND"というメッセージが表示されることになる。

6. Think parallel. 同時に考える

たいていの仕事は、いくつかの小さい部分に分けられる。
これらの小さい部分を同時に実行すると、大きな一つの仕事にかかるのと同じ時間でより多くの仕事ができる。

7. The sum of the parts is greater than the whole. 部分の総和は全体よりも大きい

小さい部品を集めて大きなApplicationを作る方が、大規模プログラムを単体で構成するよりも柔軟性に富み、従ってより役に立つ。
どちらのアプローチでも同じ機能は達成できるかもしれない。しかし、先のことを考えると、小さい部品の集に夜アプローチの方が有利だ。

8. Look for the 90 percent solution. 90%の解を目指す

どんなことであれ、100%上手くやることは大変だ。90%のことだけを上手くやれるようにするほうが、はるかに能率的であり費用対効果も最も高い。
UNIX開発者は、対象ユーザーの90%が満足する解を目指す。

9. Worse is better. 劣るほうが優れている

生き残るのは最大公約数的なSystemだと、UNIXファンは信じている。
高級品ではないが効率的なモノのほうが、高品質で効果なものよりも断然受け入れられやすいだろう。
PC互換機の世界が、UNIX界のこのアイデアに従って大きな成功を収めつつある。

10. Think hierarchically. 階層的に考える

UNIXユーザーと開発者とは、物事を階層構造で整理するのが好きだ。
例えば、UNIXでのディレクトリ構造は、ファイルシステムに適用された最初の階層構造アーキテクチャだ。
UNIXはこの階層的な考え方をさらに発展させ、ネットワークサービスでの命名法やウィンドウ管理、オブジェクト指向開発など、他の分野にも影響を及ぼした。

一つのことをうまくやろう

CSP(小プログラム集合”Collection of Small Programs”)層は、一組のUNIXコマンド、またはシェルスクリプトからなっており、その一つ一つがアプリケーションの一機能を実行する。
新しい機能が必要になった時は、その機能を実行する小さなプログラムを作成するだけなので簡単だ。
一方、もっと限定的なアプリケーションが欲しいという時は、あなにもしては行けない。
この場合は、アプリケーション層が不要なプログラムを実行しないだけのことだ。
  • アプリケーション層と小プログラム集合層(CSP)
ユーザーにとって、どの機能が必要あの判断はアプリケーション層で行われ、機能自体は小プログラム集合層で実行される。
アプリケーション層は、主として小プログラム集合層とユーザーインタフェース層の「つなぎ役」として働くほか、アプリケーションの機能を決定する。
小プログラム集合層のさまざまな要素を一つの環境にまとめ挙げることで、小さなプログラム同士の相互関係を規定し、そsの動作の枠組みを規定する。
  • ユーザーインタフェース層
ユーザーインタフェース層とは、ユーザーがアプリケーションを実行したとき、画面上で目にする部分を言う。
外見の好みに応じて、様々なユーザーインタフェースから好きなものが選べ、非常に柔軟性に富んでいる。
UNIX環境では、一般に3通りのゆーざーインターフェーススタイルがある。
まず、一つ目はシェルスクリプト型またはスクロールメニュー型で、すべての端末またはテレタイプで使用できる。
次は、cursesベースのインタフェースだ。これは、文字度端末で使用される全画面ユーザーインタフェースだ。
最後にXウィンドウシステムの端末やワークせテーションで見られるグラフィカルユーザーインタフェースだ。
巧みに構成されたアプリケーション層であれば、様々なユーザーインタフェースのスタイルからユーザーが好きなものを選択することが出来る。
このことは、ユーザーインタフェース層が「ハードワイア」されていてはならないということを意味している。
状況に応じて、どのようなユーザーインタフェースでも選ぶことが出来なければならない。
小さなプログラムには、明らかな利点がある。
まず、わかりやすいことだ。
大きな「何か」より小さな「何か」のほうが、人間にはわかりやすい。理解しやすければ、当然、保守も用意となるので、最終的には費用体効果が大きくなる。
また、システムリソースを余り使わないので、読み込み、実行、開放のいずれもすばやく行うことができ、効率が高まる。
移植性を高くしようとすると効率は犠牲になってしまうものだが、プログラムを小さくすることで、多少なりとも取り戻せるだろう。
最後に、小さなプログラムは、他のツールと簡単に結合できる。
単独ではたいしたことができなくても、他の小さなプログラムと組み合わせて使うことで、
プログラマは--最も銃なことに--ユーザーが自分で短時間のうちに、新しいアプリケーションを作ることが出来る。
小さなプログラムは、目的を絞らなければならない。言い換えると、一つのことを上手くこなすことに専念すべきだ。
一つのプログラムでひとつの問題を解決することをモットーにしてほしい。
大きく複雑な問題でも、小さく分割すれば、一度に少しずつ克服していくことが出来る。
一つのことを上手くやるプログラムは、他のアプリケーションの中でも比較的簡単に再利用できる。できることと出来ないことをが明確で、
大きなプログラムにありがちな曖昧さがない。
一つのことだけに専念すれば、小さなプログラムのまま、大きくて複雑な単体型プログラムになる危険を避けれられる。
単体型プログラムは「スパゲッティコード」を含んでいることが多く、他のアプリケーションとの共同作業が苦手だ。
小さなプログラムは、今日とは違う明日があることを認識している。
今日完璧に見える機能でも、明日は不完全になり、場合によっては時代遅れになるかもしれない。
単体型プログラムは目前のすべての状況に対処しようとするが、小さなプログラムはソフトウェアが進化することを率直に受け入れている。
ソフトウェアに完成はない。ただリリースが有るだけだ。
世界のソフトウェアは絶えず進化し続けており、誰も学習曲線からは逃れられない。
ソフトウェアの世界がどの方向に向かおうとしていのか、絶対の確信を持って予言できる人は誰もいない。
人間にできることは、せいぜい明日のニーズは変化しうるという前提に立って、今日のニーズを満たすソフトウェアを作ることくらいだろう。
開発者は設計仕様書の作成に何週間も何ヶ月も費やす無駄をやめ、計画の目指すおおよその方向を文書にまとめたら、さっさと開発に取り掛かったほうが良い
試作をできるだけ早いうちに作ることが重要だ。
設計者の頭の中にあったアプリケーションが、早期に形となって他人の手に渡り、それだけ第三のシステムへの歩みも早まる。
試作は、将来へ向かっての歩みを加速させる。
変更が必要なものなら、すべてが意思に固まるまで待ってから変更するより、まだ万事が流動的な初期段階で変更するほうがいいに決まっている。
試作を作ってみれば、何がうまくいくか、そしてより重要なことに、何がうまくいかないかがわかる。
試作は、一つのことだけを行う小さなプログラムを使い、徐々に進めて行くといい。
何かの機能が必要になるたびにそれを小さなプログラムとして追加していけば、費やす労力は最小限ですむ。
覚えておいてほしい。ソフトウェアは、実は作るものではなく、成長して行くものなのだ。
成長したソフトウェアを新しいハードウェアにも移植できれば、そのソフトウェアの価値は上がる。
新しいアーキテクチャは頻繁に現れる。
移植性の高いソフトウェアは、すぐにその新しいアーキテクチャの長所を利用できる。
そこで、試作では効率より移植性を優先させる。
この結果、移植できるものは生き残る。それ以外のものは、やがて時代に取り残されてしまうだろう。
UNIXの考え方とは、常に将来を見据えながらオペレーティングシステムとソフトウェアの開発にアプローチすることだ。
そこでは、常に変化し続ける正解が想定されている。
将来は予測できない。現在についてあらゆることを知っていても、その知識はまだまだ不完全なことは認めざるをえない。
ソフトウェアを開発するにせよ、子どもたちのためにより良い世界を築くにせよ、将来はガラス越しにしか見えない。
いつか、すべての答えがわかる日がくるかもしれないが、それまでは前進し続けれなければならない。いつか、すべての答えを知る時がやってくるのかもしれないが、それまでは、一日ごとに「今日」が「昨日」担っていく日々を過ごしながら、将来に適応し、前進し続けなければならない。
UNIXの理念は、そういう将来に向かうアプローチの一つだ。
その本質は柔軟でありつづけることだ。
嵐が何度やってみても、風に揺れる気は折れることがない。

ユーザーに対するユーザー定義のプロジェクトをモニターするパーミッションの付与

motivation

monitoring-rules-view ロールは、プロジェクトの PrometheusRule カスタムリソースへの読み取りアクセスを提供します。
monitoring-rules-edit ロールは、プロジェクトの PrometheusRule カスタムリソースを作成し、変更し、削除するパーミッションをユーザーに付与します。
monitoring-edit ロールは、monitoring-rules-edit ロールと同じ特権を付与します。さらに、ユーザーはサービスまたは Pod の新規の収集 ターゲットを作成できます。このロールを使用すると、ServiceMonitor および PodMonitor リソースを作成し、変更し、削除することもできます。

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.10/html/monitoring/granting-users-permission-to-monitor-user-defined-projects_enabling-monitoring-for-user-defined-projects#granting-user-permissions-using-the-cli_enabling-monitoring-for-user-defined-projects

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.