- 投稿日:2020-03-21T18:12:25+09:00
kubectlでやってることをcurlでやりたい
概要
kubernetesを運用する際に、アドオン的な感じで動的にPod(Kubernetes Resource)を生成するというユースケースを知った。そのため例えばPod内から新たにPodを生成するなどといった場合が考えられ、その際にkubectlをPod内から使用するケースやcurlなどの汎用的なツールを簡易的に使えるかを確認したくなった。
下記では、kubectl proxyを用いて、kubernetesクラスタ外からKubernetes APIをcurlを通して実行することで同様のことを確認した。Pod内から同様のことを行う際は、Kubernetes APIを実行するためのトークン 取得方法が異なっているので注意が必要。
Kubernetes APIとは
Kubernetes内のコンポーネント間の通信や捜査はすべてAPIを通して行われており、REST形式のAPIとなっています。
kubectlを用いることで大半の操作は行うことができますし、直接REST APIをcurlで叩くことでも同様の操作を行うことができます。
https://kubernetes.io/docs/reference/using-api/api-overview/
直接Kubernetes API叩いてみる
kubectl proxyなしの場合
なければクラスタ起動
kind create clusterクラスタ一覧確認
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'アクセスするクラスタ名を選択(自分の場合は、kindを使用しているのでこのクラスタ名を選択)
export CLUSTER_NAME="kind-kind"クラスタ名からアクセス先取得
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")アクセストークン 取得
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)kubernetes APIを実行
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "172.17.0.2:6443" } ] }kubectl proxyありの場合
kubectl proxyを起動
8001番ポートで動作していることを確認
kubectl proxy Starting to serve on 127.0.0.1:8001Kubernetes APIを叩いてみると、先ほどと同様の結果を取得できる
curl -X GET 127.0.0.1:8001/api { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "172.17.0.2:6443" } ] }試しにnginxのPodを動作させてみてから、Kubernetes APIでPodを確認してみる
k run nginx --image=nginx --restart=Never --dry-run -oyaml > nginx.yamlk apply -f nginx.yamlk get po NAME READY STATUS RESTARTS AGE nginx 0/1 ContainerCreating 0 1scurlでPod一覧取得してみるとjson形式で同様の情報が取得できる
curl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods { "kind": "PodList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/namespaces/default/pods", "resourceVersion": "5973" }, "items": [ { "metadata": { "name": "nginx", "namespace": "default", "selfLink": "/api/v1/namespaces/default/pods/nginx", "uid": "119f6219-5ff3-4542-b785-e7532301a972", "resourceVersion": "5891", "creationTimestamp": "2020-03-21T06:08:56Z", "labels": { "run": "nginx" }, "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"labels\":{\"run\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\",\"resources\":{}}],\"dnsPolicy\":\"ClusterFirst\",\"restartPolicy\":\"Never\"},\"status\":{}}\n" } }, "spec": { "volumes": [ { "name": "default-token-lh646", "secret": { "secretName": "default-token-lh646", "defaultMode": 420 } } ], "containers": [ { "name": "nginx", "image": "nginx", "resources": { }, ~中略~ } } ] }jsonだとkubectlの結果より見づらいのは仕方ないが、下記のようなツールでjson結果もある程度扱いやすくできる。
Macの場合下記のコマンドで導入できる。
brew install jidcurl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods | jid下記のように対話的にjsonファイルを深掘りできる。
curlでPodの作成を試してみる
エンドポイントについてはKubernetes APIから確認することができる
Hwllo Worldとだけ出力するPodを作成する
curl -X POST -H 'Content-Type: application/yaml' -d ' apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: ubuntu image: ubuntu:trusty command: ["echo"] args: ["Hello World"] restartPolicy: Never ' http://127.0.0.1:8001/api/v1/namespaces/default/pods実行結果
{ "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "pod-example", "namespace": "default", "selfLink": "/api/v1/namespaces/default/pods/pod-example", "uid": "4ac7cf5c-69b7-40f9-806d-582cafebd590", "resourceVersion": "8977", "creationTimestamp": "2020-03-21T06:50:46Z" }, "spec": { "volumes": [ { "name": "default-token-lh646", "secret": { "secretName": "default-token-lh646", "defaultMode": 420 } } ], "containers": [ { "name": "ubuntu", "image": "ubuntu:trusty", "command": [ "echo" ], "args": [ "Hello World" ], "resources": { }, ~中略~ }先ほど作成したnginxのpodに加えて、
ログにHello Worldが出力されていることも確認できる
k logs pod-example Hello WorldPod内からKubernetes APIを叩く方法
必要な権限を持ったSeriveAccountを作成(ついでにnamespaceなども作成)
k apply -f api.yamlNamespace切り替え
kubensは別途install必要(https://github.com/ahmetb/kubectx)
kubens mynamespaceCurlを叩くためのPodのyamlを生成
k run fedora --image=fedora --restart=Never --dry-run -oyaml -- /sbin/init > fedora.yaml出力したyamlに一部追記(tty, stdin, serviceAccountName)
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: fedora name: fedora spec: containers: - args: - /sbin/init image: fedora name: fedora resources: {} dnsPolicy: ClusterFirst restartPolicy: Never tty: true stdin: true serviceAccountName: mysa status: {}Podをデプロイ
k apply -f fedora.yamlPod内にアクセス
k exec -it fedora bashトークン を取得して、Kubernetes APIを実行
下記は、このコマンドを実行しているPod情報を取得する
KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) NAMESPACE=mynamespace curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \ https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$NAMESPACE/pods/$HOSTNAMEjsonで取得するためぱっと見わかるづらいが、k get po と同様の内容を取得できている。
{ "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "fedora", "namespace": "mynamespace", "selfLink": "/api/v1/namespaces/mynamespace/pods/fedora", "uid": "7c918fc0-f194-4729-896a-f52167c4a803", "resourceVersion": "17841", "creationTimestamp": "2020-03-21T08:51:57Z", "labels": { "run": "fedora" }, "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"labels\":{\"run\":\"fedora\"},\"name\":\"fedora\",\"namespace\":\"mynamespace\"},\"spec\":{\"containers\":[{\"args\":[\"/sbin/init\"],\"image\":\"fedora\",\"name\":\"fedora\",\"resources\":{},\"stdin\":true,\"tty\":true}],\"dnsPolicy\":\"ClusterFirst\",\"restartPolicy\":\"Never\",\"serviceAccountName\":\"mysa\"},\"status\":{}}\n" } }, "spec": { "volumes": [ { "name": "mysa-token-lt4gh", "secret": { "secretName": "mysa-token-lt4gh", "defaultMode": 420 } } ], "containers": [ { "name": "fedora", "image": "fedora", "args": [ "/sbin/init" ], "resources": { }, ~中略~ }まとめ
Kubernetes APIを知ることでkubectlでやっていることをcurlでも同様に行えることを確認した。
新たにPodなどを作る処理はPod内でもかけるため、動的に増加するリソースを制御・監視する方法を検討したい。
- 投稿日:2020-03-21T18:10:11+09:00
kubectlでやってることをcurlでやりたい
概要
kubernetesを運用する際に、アドオン的な感じで動的にPod(Kubernetes Resource)を生成するというユースケースを知った。そのため例えばPod内から新たにPodを生成するなどといった場合が考えられ、その際にkubectlをPod内から使用するケースやcurlなどの汎用的なツールを簡易的に使えるかを確認したくなった。
下記では、kubectl proxyを用いて、kubernetesクラスタ外からKubernetes APIをcurlを通して実行することで同様のことを確認した。Pod内から同様のことを行う際は、Kubernetes APIを実行するためのトークン 取得方法が異なっているので注意が必要。
Kubernetes APIとは
Kubernetes内のコンポーネント間の通信や捜査はすべてAPIを通して行われており、REST形式のAPIとなっています。
kubectlを用いることで大半の操作は行うことができますし、直接REST APIをcurlで叩くことでも同様の操作を行うことができます。
https://kubernetes.io/docs/reference/using-api/api-overview/
直接Kubernetes API叩いてみる
kubectl proxyなしの場合
なければクラスタ起動
kind create clusterクラスタ一覧確認
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'アクセスするクラスタ名を選択(自分の場合は、kindを使用しているのでこのクラスタ名を選択)
export CLUSTER_NAME="kind-kind"クラスタ名からアクセス先取得
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")アクセストークン 取得
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)kubernetes APIを実行
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "172.17.0.2:6443" } ] }## kubectl proxyありの場合
kubectl proxyを起動
8001番ポートで動作していることを確認
kubectl proxy Starting to serve on 127.0.0.1:8001Kubernetes APIを叩いてみると、先ほどと同様の結果を取得できる
curl -X GET 127.0.0.1:8001/api { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "172.17.0.2:6443" } ] }試しにnginxのPodを動作させてみてから、Kubernetes APIでPodを確認してみる
k run nginx --image=nginx --restart=Never --dry-run -oyaml > nginx.yamlk apply -f nginx.yamlk get po NAME READY STATUS RESTARTS AGE nginx 0/1 ContainerCreating 0 1scurlでPod一覧取得してみるとjson形式で同様の情報が取得できる
curl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods { "kind": "PodList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/namespaces/default/pods", "resourceVersion": "5973" }, "items": [ { "metadata": { "name": "nginx", "namespace": "default", "selfLink": "/api/v1/namespaces/default/pods/nginx", "uid": "119f6219-5ff3-4542-b785-e7532301a972", "resourceVersion": "5891", "creationTimestamp": "2020-03-21T06:08:56Z", "labels": { "run": "nginx" }, "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"labels\":{\"run\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\",\"resources\":{}}],\"dnsPolicy\":\"ClusterFirst\",\"restartPolicy\":\"Never\"},\"status\":{}}\n" } }, "spec": { "volumes": [ { "name": "default-token-lh646", "secret": { "secretName": "default-token-lh646", "defaultMode": 420 } } ], "containers": [ { "name": "nginx", "image": "nginx", "resources": { }, ~中略~ } } ] }jsonだとkubectlの結果より見づらいのは仕方ないが、下記のようなツールでjson結果もある程度扱いやすくできる。
Macの場合下記のコマンドで導入できる。
brew install jidcurl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods | jid下記のように対話的にjsonファイルを深掘りできる。
curlでPodの作成を試してみる
エンドポイントについてはKubernetes APIから確認することができる
Hwllo Worldとだけ出力するPodを作成する
curl -X POST -H 'Content-Type: application/yaml' -d ' apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: ubuntu image: ubuntu:trusty command: ["echo"] args: ["Hello World"] restartPolicy: Never ' http://127.0.0.1:8001/api/v1/namespaces/default/pods実行結果
{ "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "pod-example", "namespace": "default", "selfLink": "/api/v1/namespaces/default/pods/pod-example", "uid": "4ac7cf5c-69b7-40f9-806d-582cafebd590", "resourceVersion": "8977", "creationTimestamp": "2020-03-21T06:50:46Z" }, "spec": { "volumes": [ { "name": "default-token-lh646", "secret": { "secretName": "default-token-lh646", "defaultMode": 420 } } ], "containers": [ { "name": "ubuntu", "image": "ubuntu:trusty", "command": [ "echo" ], "args": [ "Hello World" ], "resources": { }, ~中略~ }先ほど作成したnginxのpodに加えて、
ログにHello Worldが出力されていることも確認できる
k logs pod-example Hello WorldPod内からKubernetes APIを叩く方法
必要な権限を持ったSeriveAccountを作成(ついでにnamespaceなども作成)
k apply -f api.yamlNamespace切り替え
kubensは別途install必要(https://github.com/ahmetb/kubectx)
kubens mynamespaceCurlを叩くためのPodのyamlを生成
k run fedora --image=fedora --restart=Never --dry-run -oyaml -- /sbin/init > fedora.yaml出力したyamlに一部追記(tty, stdin, serviceAccountName)
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: fedora name: fedora spec: containers: - args: - /sbin/init image: fedora name: fedora resources: {} dnsPolicy: ClusterFirst restartPolicy: Never tty: true stdin: true serviceAccountName: mysa status: {}Podをデプロイ
k apply -f fedora.yamlPod内にアクセス
k exec -it fedora bashトークン を取得して、Kubernetes APIを実行
下記は、このコマンドを実行しているPod情報を取得する
KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) NAMESPACE=mynamespace curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \ https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$NAMESPACE/pods/$HOSTNAMEjsonで取得するためぱっと見わかるづらいが、k get po と同様の内容を取得できている。
{ "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "fedora", "namespace": "mynamespace", "selfLink": "/api/v1/namespaces/mynamespace/pods/fedora", "uid": "7c918fc0-f194-4729-896a-f52167c4a803", "resourceVersion": "17841", "creationTimestamp": "2020-03-21T08:51:57Z", "labels": { "run": "fedora" }, "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"labels\":{\"run\":\"fedora\"},\"name\":\"fedora\",\"namespace\":\"mynamespace\"},\"spec\":{\"containers\":[{\"args\":[\"/sbin/init\"],\"image\":\"fedora\",\"name\":\"fedora\",\"resources\":{},\"stdin\":true,\"tty\":true}],\"dnsPolicy\":\"ClusterFirst\",\"restartPolicy\":\"Never\",\"serviceAccountName\":\"mysa\"},\"status\":{}}\n" } }, "spec": { "volumes": [ { "name": "mysa-token-lt4gh", "secret": { "secretName": "mysa-token-lt4gh", "defaultMode": 420 } } ], "containers": [ { "name": "fedora", "image": "fedora", "args": [ "/sbin/init" ], "resources": { }, ~中略~ }まとめ
Kubernetes APIを知ることでkubectlでやっていることをcurlでも同様に行えることを確認した。
新たにPodなどを作る処理はPod内でもかけるため、動的に増加するリソースを制御・監視する方法を検討したい。
- 投稿日:2020-03-21T10:39:30+09:00
Word for Mac の text wrapping break
概要
年度末にあたり、普段は縁がない Microsoft Word for Mac で報告書や業務マニュアルを作ってみて、いろいろと苦労しました。
その一環として text wrapping break について深堀りしてしまったので、その正体と付き合いかたについて説明したいと思います。
Text wrapping break
Microsoft Word の text wrapping break というものをご存知でしょうか。これは表や図に対するテキストの回り込みを終わらせて、新しい行を始めたいときに使う改行のことです。 CSS の
clear: both;
と同じ目的で使うもの、というとわかりやすいかもしれません。表を使ったレイアウトに頼らないまともな業務マニュアルを作ろうとすると、スクリーンショット画像とその説明文の組を量産するために text wrapping break を使うことはよくあるのではと思います。
しかしながらこの text wrapping break は Word for Windows では普通にドキュメントに挿入できるのですが、 Word for Mac ではなぜか挿入する方法がありません。
Word for Windows (「文字列の折り返し」で挿入されるのが text wrapping break):
それでは Mac では text wrapping break は全く使えないのかというとそうではなく、 Windows で作った text wrapping break を含む Word ドキュメントを Mac で開くと普通に機能しますし、それを別の場所にコピペすることもできます。
Text wrapping break を使ったサンプル text-wrapping-breaks.docx を用意したのでダウンロードして確認してみてください。
OOXML の text wrapping break
Text wrapping break は Open Office XML の仕様 によると
<w:br w:clear="all"/>
で表される改行のことのようです。text-wrapping-breaks.docx を unzip して grep してみれば、これが文中で使われていることが実際に確認できます。
$ unzip text-wrapping-breaks.docx -d out Archive: text-wrapping-breaks.docx inflating: out/[Content_Types].xml inflating: out/_rels/.rels inflating: out/word/_rels/document.xml.rels inflating: out/word/document.xml extracting: out/word/media/image6.svg extracting: out/word/media/image1.png extracting: out/word/media/image2.svg extracting: out/word/media/image3.png inflating: out/word/theme/theme1.xml extracting: out/word/media/image5.png extracting: out/word/media/image4.svg inflating: out/word/settings.xml inflating: out/word/fontTable.xml inflating: out/docProps/core.xml inflating: out/docProps/app.xml inflating: out/word/styles.xml inflating: out/word/numbering.xml inflating: out/word/webSettings.xml $ xmllint --format out/word/document.xml | grep -B6 'clear="all"' <w:t>たとえば、一致する表紙、ヘッダー、サイドバーを追加できます。</w:t> </w:r> <w:r w:rsidR="00FC2804"> <w:rPr> <w:rFonts w:ascii="游明朝" w:eastAsia="游明朝" w:hAnsi="游明朝"/> </w:rPr> <w:br w:type="textWrapping" w:clear="all"/> -- <w:t>テーマとスタイルを使って、文書全体の統一感を出すこともできます。</w:t> </w:r> <w:r> <w:rPr> <w:rFonts w:ascii="游明朝" w:eastAsia="游明朝" w:hAnsi="游明朝"/> </w:rPr> <w:br w:type="textWrapping" w:clear="all"/>なお text-wrapping-breaks.docx を Google Docs や LibreOffice に持っていってみたところ、いずれも正しくレンダリングされませんでした。実はあまり使われていない機能なのかもしれません。
マクロで text wrapping break を挿入する
Text wrapping break の正体がわかったところで、ではなぜ Word for Mac ではこれが挿入できないんだろうと Microsoft のフォーラムで尋ねてみました。
結果としてその理由はわかりませんでしたが、代替手段として Word の VBA マクロを使って text wrapping break を挿入する方法を教えてもらいました。
Sub InsertTextWrappingBreak() Dim oRange As Range Set oRange = Selection.Range With oRange .Collapse Direction:=wdCollapseStart .InsertBreak Type:=wdTextWrappingBreak End With End Subこのマクロを登録するには Word のメニューより「ツール」→「マクロ」→「マクロ…」を選択します。マクロのダイアログが出ますので「マクロ名」に
InsertTextWrappingBreak
と入力して「+」ボタンを押してください。すると Visual Basic Editor が開きます。サブルーチン
InsertTextWrappingBreak
のテンプレートがすでに入力されていますので、上記の Visual Basic コードで置き換えて、保存ボタン を押して保存してください。再度マクロのダイアログを開くと
InsertTextWrappingBreak
が見えますので、これを選択して「実行」ボタンを押すと、ドキュメントのカーソル位置に text wrapping break を挿入することができます。さらに、このマクロ実行をツールバーに登録することで text wrapping berak を挿入するボタンを作ることができます。Word メニューの「環境設定…」 → 「リボンとツールバー」 → 「クイックアクセスツールバー」を開き、左側の「コマンドの選択」で「マクロ」を選んで、さきほど登録した VBA マクロの名前を選択して左側から右側にコピーしてください。
するとクイックツールバーに謎の ○ アイコンが出現します。これをクリックするとカーソルの位置に text wrapping break を挿入することができます。
個人環境のカスタマイズとしては、これで十分なのではないかと思います。
まとめ
今回 Word で大量のスクリーンショット画像を含む業務マニュアルを作ってみましたが、スタイルや改ページを納得いくまで調整するのに思った以上に時間をとられてしまい、非常に疲れました。しかしながら VBA マクロによる機能拡張や Visual Basic Editor のような開発環境を知ることができたのはよい経験でした。
やはり Qiita や Discourse のような Markdown で、細かいレイアウトを気にせず気楽に書けるのがいちばんよいと思ったので、次回はそのようなドキュメント制作環境を整備して作ってみたいと思います。
- 投稿日:2020-03-21T10:25:48+09:00
Kobitoの代わりにQuiver
メモ方法の模索
自分のメモ代わりに記録を残す手段を模索しているが、
- Word
- Evernote(外に出せない内容はかけない)
- Kobito
- 普通にMarkdown (MacDownか、VS Code+Preview plugin)
- 表示はgitbookをかませて見やすく
- 最近はdocsify
と移行してきた。
参考:docsifyでgitbookやSphinxより手軽にドキュメントサイトを構築
もちろん.mdファイルをまとめておけば良いんだけど、
たまにメモを整理しておきたい欲求もある。
(特にMacでのメモ、タグ付けして整理したい)docsifyもgitbbookも良し悪しである(ゴリゴリのエンジニアではないので)。
で、Kobitoを探したら普通にサポート終了してた(気づくの遅い)まあ、ドキュメント増えたらバンバン強制終了するようになったので、
普通に使うのが苦しくなって、移行した経緯もある。Kobito-likeなソフトはないのか?
正直markdown記法に慣れるとそこまで負担ではなく、GUIに依存しなくなったが、
とはいえKobito-likeはインターフェースは確かに使いやすく、
何かないのかということで調べてみたら、「Quiver」に移行してた話を発見。参考:Kobitoのサポートが終了してしまったので、Quiverに移行するスクリプトを書いた
使用感
ということで使ってみた感想(これもQuiver使用して記載)
良いところ
- 普通に使える
- タグ付けやNotebookの分類も良い感じ
- テーマはSpacegrayが良い感じ(前述のサイト同様)
- 特に日本ご使用は問題なし
- 画像貼り付けも簡単
- 画像の内容によっては使い分けが良いかも(QiitaはAWSに自動アップロードだった)
- 画像もlocal保存のよう(Quiverのnoteはどのように管理されているか)
ちょっとイマイチ
- Linkを貼るには上のバー(または⌘K)で呼び出す(「⌘」は「コマンド」で出てくる:参考)
- Linkをつけるときに「http://」が既に入っているが、ちょっと邪魔(アドレスをまるごとコピペするので、しかもhttp!)
- Webからコピペするとスタイルが残るので、これまた上のバーから「Paste and Match style」でテキストのみ貼り付ける
どちらも右クリックで呼び出せると有り難い。
結論
結構便利。
上述の画像ののようにプレビュー画面もあるが、ほぼ要らない(今のところ)。
使い勝手が良さげなので、しばらく使ってみよう。要望
- 今のところ、markdownでexportしてQiitaに貼り付けてちょっと整形しているので、(h1タグとか付け直しなので)誰か、Qiitaへの自動投稿とか作ってくれないかな。
- あと、Windowsも使う身なのでMac限定を外してほしいな。
余談
QiitaとしてはWebでそのまま書いてくれということなのかな?
- 投稿日:2020-03-21T02:55:57+09:00
macOSでUnityを開いてVRM作業をするときのメモ
前書き
macでVRMを触る人って相当なマイノリティなのでは?
と思うほど、ネット上に情報が少ない...ので、自分がハマったことを色々メモしておこうと思う。
(溜まったネタ帳から逐次追記してくので、この記事も逐次更新される...)モデルが表示されない
元々、Unityでハイポリの3Dのモデルを開くことがそんなに多くなかったので、面を食らった。
そう、Scene/Game View でモデルが透明 or 真っ黒なのである。
- Player Settings で Metal Editor Support を有効にする
- Camera の Rendering Path を Deferred にする
で、大体解決した。