20200321のMacに関する記事は5件です。

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:8001

Kubernetes 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.yaml

k apply -f nginx.yaml 

k get po
NAME    READY   STATUS              RESTARTS   AGE
nginx   0/1     ContainerCreating   0          1s

curlで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 jid

curl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods | jid

下記のように対話的にjsonファイルを深掘りできる。

jid.png

curlでPodの作成を試してみる

エンドポイントについてはKubernetes APIから確認することができる

kubernetesAPI_pod.png

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": {

        },
~中略~
}

Podが作成されていることを確認
pod-example.png

先ほど作成したnginxのpodに加えて、

ログにHello Worldが出力されていることも確認できる

k logs pod-example 
Hello World

Pod内からKubernetes APIを叩く方法

必要な権限を持ったSeriveAccountを作成(ついでにnamespaceなども作成)

k apply -f api.yaml 

Namespace切り替え

kubensは別途install必要(https://github.com/ahmetb/kubectx)

kubens mynamespace

Curlを叩くための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.yaml

Pod内にアクセス

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/$HOSTNAME

jsonで取得するためぱっと見わかるづらいが、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内でもかけるため、動的に増加するリソースを制御・監視する方法を検討したい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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:8001

Kubernetes 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.yaml
k apply -f nginx.yaml 
k get po
NAME    READY   STATUS              RESTARTS   AGE
nginx   0/1     ContainerCreating   0          1s

curlで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 jid
curl -X GET http://127.0.0.1:8001/api/v1/namespaces/default/pods | jid

下記のように対話的にjsonファイルを深掘りできる。

jid.png

curlでPodの作成を試してみる

エンドポイントについてはKubernetes APIから確認することができる

kubernetesAPI_pod.png

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": {

        },
~中略~
}

Podが作成されていることを確認
pod-example.png

先ほど作成したnginxのpodに加えて、

ログにHello Worldが出力されていることも確認できる

k logs pod-example 
Hello World

Pod内からKubernetes APIを叩く方法

必要な権限を持ったSeriveAccountを作成(ついでにnamespaceなども作成)

k apply -f api.yaml 

Namespace切り替え

kubensは別途install必要(https://github.com/ahmetb/kubectx)

kubens mynamespace

Curlを叩くための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.yaml

Pod内にアクセス

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/$HOSTNAME

jsonで取得するためぱっと見わかるづらいが、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内でもかけるため、動的に増加するリソースを制御・監視する方法を検討したい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 を使うことはよくあるのではと思います。

image.png

しかしながらこの text wrapping break は Word for Windows では普通にドキュメントに挿入できるのですが、 Word for Mac ではなぜか挿入する方法がありません。

Word for Windows (「文字列の折り返し」で挿入されるのが text wrapping break):
image.png

Word for Mac (「文字列の折り返し」がない):
image.png

それでは 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 コードで置き換えて、保存ボタン :floppy_disk: を押して保存してください。

image.png

再度マクロのダイアログを開くと InsertTextWrappingBreak が見えますので、これを選択して「実行」ボタンを押すと、ドキュメントのカーソル位置に text wrapping break を挿入することができます。

さらに、このマクロ実行をツールバーに登録することで text wrapping berak を挿入するボタンを作ることができます。Word メニューの「環境設定…」 → 「リボンとツールバー」 → 「クイックアクセスツールバー」を開き、左側の「コマンドの選択」で「マクロ」を選んで、さきほど登録した VBA マクロの名前を選択して左側から右側にコピーしてください。

するとクイックツールバーに謎の ○ アイコンが出現します。これをクリックするとカーソルの位置に text wrapping break を挿入することができます。

image.png

個人環境のカスタマイズとしては、これで十分なのではないかと思います。

まとめ

今回 Word で大量のスクリーンショット画像を含む業務マニュアルを作ってみましたが、スタイルや改ページを納得いくまで調整するのに思った以上に時間をとられてしまい、非常に疲れました。しかしながら VBA マクロによる機能拡張や Visual Basic Editor のような開発環境を知ることができたのはよい経験でした。

やはり Qiita や Discourse のような Markdown で、細かいレイアウトを気にせず気楽に書けるのがいちばんよいと思ったので、次回はそのようなドキュメント制作環境を整備して作ってみたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が良い感じ(前述のサイト同様)
  • 特に日本ご使用は問題なし
  • 画像貼り付けも簡単

FB7EFBA1860BD9144D01CAB1F30246E8.png

ちょっとイマイチ

  • Linkを貼るには上のバー(または⌘K)で呼び出す(「⌘」は「コマンド」で出てくる:参考
    • Linkをつけるときに「http://」が既に入っているが、ちょっと邪魔(アドレスをまるごとコピペするので、しかもhttp!)
  • Webからコピペするとスタイルが残るので、これまた上のバーから「Paste and Match style」でテキストのみ貼り付ける

どちらも右クリックで呼び出せると有り難い。

結論

結構便利。

上述の画像ののようにプレビュー画面もあるが、ほぼ要らない(今のところ)。
使い勝手が良さげなので、しばらく使ってみよう。

要望

  • 今のところ、markdownでexportしてQiitaに貼り付けてちょっと整形しているので、(h1タグとか付け直しなので)誰か、Qiitaへの自動投稿とか作ってくれないかな。
  • あと、Windowsも使う身なのでMac限定を外してほしいな。

余談

QiitaとしてはWebでそのまま書いてくれということなのかな?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOSでUnityを開いてVRM作業をするときのメモ

前書き

macでVRMを触る人って相当なマイノリティなのでは?
と思うほど、ネット上に情報が少ない...

ので、自分がハマったことを色々メモしておこうと思う。
(溜まったネタ帳から逐次追記してくので、この記事も逐次更新される...)

モデルが表示されない

元々、Unityでハイポリの3Dのモデルを開くことがそんなに多くなかったので、面を食らった。
そう、Scene/Game View でモデルが透明 or 真っ黒なのである。

  • Player Settings で Metal Editor Support を有効にする
  • Camera の Rendering Path を Deferred にする

で、大体解決した。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む