esa.io のデータを丸ごと GROWI に移行する

概要

GROWI には esa.io や Qiita:Team から記事をインポートする機能があります。
しかし、 2019/10/21 現在の機能では、画像は移行されず、移行元に残ったままになります。
今回、 esa.io から GROWI に画像も移行するためのgemを作成しましたので、使い方も合わせて説明します。 Qiita:Team からのインポートにはまだ対応していません。

インポート前の準備

esa.io や Qiita:Team と少々違う部分なのですが、 GROWI は App を立ち上げた初期設定のままでは画像などのファイルをアップロードすることができません。
Amazon S3などのストレージの準備が必要です。

設定方法は下記記事で説明しています。

記事のインポート

esa.io から GROWI に記事をインポートする場合は、GROWIの標準機能で行えます。
記事のインポートの仕方については、下記記事で説明しています。

画像のインポート

Gemのインストール

下記のGemをインストールします。

$ gem install growi-image_converter

アクセストークンの設定

esa.io から GROWI への移行してみた - zuglab で発行した GROWI のアクセストークンと、GROWI App のURLを環境変数で設定します。

シェルがBashの場合は下記のように設定します。

$ echo 'export GROWI_URL=https://*****.growi.cloud' >> ~/.bash_profile
$ echo 'export GROWI_ACCESS_TOKEN="0123456789abcdef0123456789abcdef0123456789ab"' >> ~/.bash_profile
$ source ~/.bash_profile

移行テスト

何もオプションを指定せずに growi-image_converter コマンドを実行します。
変換対象になるページの一覧が表示されます。
実際にはまだ変換されていません。

$ growi-image_converter

下記のように表示されます。

[DRY RUN MODE]
PageID: 5d9bfe5fab394d00510c39ae, Result: Through
PageID: 5d831e595799980050f87f64, Result: Converted
PageID: 5d84f0ec87339600517b338a, Result: Converted
PageID: 5d941ff8f1be7d00503c4a0a, Result: Through
PageID: 5d932aeaf1be7d00503c4a01, Result: Through
PageID: 5d8b27c67e03f70050bafa5e, Result: Through
PageID: 5d86fd378571d10046324f6c, Result: Through

移行の実行

特にエラー等が表示されていないようであれば、 -d オプションを付与して、変換を実行します。

$ growi-image_converter -d

移行に失敗した画像がある場合は、結果に出力されるので、手動で対応します。
例えば、下記のエラーでは、記事内で指定されている esa.io の画像のパスがリンク切れを起こしています。
該当のページへは、 https://*****.growi.cloud/5d8652a143cc8400554f977f のように PageID を指定してアクセスできます。

PageID: 5d8652a143cc8400554f977f, Image URL: https://img.esa.io/uploads/production/attachments/xxxxx/2019/09/21/xxxxx/xxxxx.jpeg, Message: 403 Forbidden

以上で esa.io にある記事、画像を GROWI にインポートできました。

参考

f:id:Aqutam:20190920001740p:plain

GROWI APIを簡単に使ってみる

概要

前回の記事で、GROWI のAPIを使い、GROWI記事の更新を試してみました。

curl コマンドを使用してAPIのコールを行っていましたが、少々コマンドの組み立てが大変でした。
growi-client という便利なgemがあるので、今回はこれを使ってもうちょっと簡単にAPIを呼んでみようと思います。

https://github.com/ryu-sato/growi-client

API Tokenの生成

APIを利用するには、まず API Token の生成が必要です。
すでにAPI Tokenが生成済みの場合は、この手順は対応不要です。

右上 ユーザー名 > ユーザー設定 を開きます。
API設定」タブを開きます。
f:id:Aqutam:20190921173149p:plain

API Tokenを更新」ボタンをクリックします。
f:id:Aqutam:20190921195038p:plain

インストール・準備

ターミナルを起動し、下記コマンドでgemをインストールします。

$ gem install growi-client

.bash_profile などに環境変数API Token と GROWI.cloud のURLを設定します。

export GROWI_ACCESS_TOKEN=0123456789abcdef0123456789abcdef0123456789ab
export GROWI_URL=https://*****.growi.cloud/

設定したら、 source コマンドで適用します。

$ source ~/.bash_profile

irb を起動し、GrowiClientインスタンスを準備します。

$ irb
irb(main):001:0> require 'growi-client'
=> true
irb(main):002:0> growi_client = GrowiClient.new(growi_url: ENV['GROWI_URL'], access_token: ENV['GROWI_ACCESS_TOKEN'])
=> #<GrowiClient:0x00007fe022906f00 @growi_url="https://*****.growi.cloud", @access_token="0123456789abcdef0123456789abcdef0123456789ab", @rest_client_param={}, @cp_entry_point="https://*****.growi.cloud/_api/">

APIを使ってみる

1. ページの一覧を取得する [GApiRequestPagesList]

ページの一覧の取得は、 GApiRequestPagesList でリクエストパラメータを準備し、 growi_client.request(req) を実行することで取得できます。

irb(main):003:0> req = GApiRequestPagesList.new path_exp: '/'
=> #<GApiRequestPagesList:0x00007fe0218af670 @entry_point="/_api/pages.list", @method="GET", @param={:path=>"/"}>
irb(main):004:0> growi_client.request(req)
=> #<GApiReturn:0x00007fe021bf51e0 @ok=true, @data=[#<GrowiPage:0x00007fe021a8d348 @_id="5d9bfe5fab394d00510c39ae", @redirectTo=nil, @updatedAt=#<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>, @lastUpdateUser=#<GrowiUser:0x00007fe022942e10 @_id="5d53b1e3403080003a491d6c", @email="email", @username="username", @name="name", @admin=true, @createdAt=#<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>, @status=2, @lang="ja", @isGravatarEnabled=false, @isEmailPublished=true>, @creator="5d53b1e3403080003a491d6c", @path="/path/", @__v=1, @revision=#<GrowiPageRevision:0x00007fe0229415d8 @_id="5d9bfe5fab394d00510c39af", @author=nil, @body=nil, @path=nil, @__v=0, @createdAt="", @format="">, @createdAt=#<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>, @commentCount=0, @seenUsers=["5d53b1e3403080003a491d6c"], @liker=[], @grantedUsers=[], @grant=1, @status="published", @grantedGroup=nil, @id="5d9bfe5fab394d00510c39ae">, #<GrowiPage:0x00007fe021a84888 @_id="5d831e595799980050f87f64", @redirectTo=nil, @updatedAt=#<DateTime: 2019-10-04T04:57:32+00:00 ((2458761j,17852s,540000000n),+0s,2299161j)>, @lastUpdateUser=#<GrowiUser:0x00007fe0221673f8 @_id="5d53b1e3403080003a491d6c", @email="email", @username="username", @name="name", @admin=true, @createdAt=#<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>, @status=2, @lang="ja", @isGravatarEnabled=false, @isEmailPublished=true>, @creator="5d53b1e3403080003a491d6c", @path="/path/", @__v=1, @revision=#<GrowiPageRevision:0x00007fe0221661d8 @_id="5d96d13c00830e00457918df", @author=nil, @body=nil, @path=nil, @__v=0, @createdAt="", @format="">, @createdAt=#<DateTime: 2019-09-19T06:21:13+00:00 ((2458746j,22873s,448000000n),+0s,2299161j)>, @commentCount=0, @seenUsers=["5d53b1e3403080003a491d6c"], @liker=[], @grantedUsers=[], @grant=1, @status="published", @grantedGroup=nil, @id="5d831e595799980050f87f64">]>

2. 指定したページの情報を取得する [GApiRequestPagesGet]

GApiRequestPagesGet のリクエストパラメータ page_id に、「1. ページの一覧を取得する [GApiRequestPagesList]」で取得した GrowiPage._id を指定します。
すると、下記のように指定した page_id の本文を含む情報が取得できます。

irb(main):007:0> req = GApiRequestPagesGet.new page_id: '5d9bfe5fab394d00510c39ae'
=> #<GApiRequestPagesGet:0x00007fe022981fe8 @entry_point="/_api/pages.get", @method="GET", @param={:page_id=>"5d9bfe5fab394d00510c39ae"}>
irb(main):008:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe02218c5e0
 @data=
  #<GrowiPage:0x00007fe0221853f8
   @__v=1,
   @_id="5d9bfe5fab394d00510c39ae",
   @commentCount=0,
   @createdAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
   @creator=
    #<GrowiUser:0x00007fe02218f920
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @grant=1,
   @grantedGroup=nil,
   @grantedUsers=[],
   @id="5d9bfe5fab394d00510c39ae",
   @lastUpdateUser=
    #<GrowiUser:0x00007fe022184520
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @liker=[],
   @path="/path/",
   @redirectTo=nil,
   @revision=
    #<GrowiPageRevision:0x00007fe02218e548
     @__v=0,
     @_id="5d9bfe5fab394d00510c39af",
     @author=nil,
     @body="本文本文本文本文本文本文",
     @createdAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,954000000n),+0s,2299161j)>,
     @format="markdown",
     @path="/path/">,
   @seenUsers=["5d53b1e3403080003a491d6c"],
   @status="published",
   @updatedAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>>,
 @ok=true>

3. 画像をアップロードする [GApiRequestAttachmentsAdd]

画像のアップロードは、 GApiRequestAttachmentsAdd で行います。
リクエストパラメータには、 page_idfile を指定します。
fileFile.open('/path/to/image.jpg', 'r') の形式でローカルに保存されている画像ファイルのパスを指定します。
APIを呼ぶと、下記のように指定したページに画像がアップロードされます。

irb(main):011:0> req = GApiRequestAttachmentsAdd.new page_id: '5d9bfe5fab394d00510c39ae', file: File.open('/path/to/image.jpg', 'r')
=> #<GApiRequestAttachmentsAdd:0x00007fe0211253c8 @entry_point="/_api/attachments.add", @method="POST", @param={:page_id=>"5d9bfe5fab394d00510c39ae", :file=>#<File:/path/to/image.jpg>}>
irb(main):012:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe0220586d8
 @data=
  {:page=>
    #<GrowiPage:0x00007fe021187af0
     @__v=1,
     @_id="5d9bfe5fab394d00510c39ae",
     @commentCount=0,
     @createdAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
     @creator="5d53b1e3403080003a491d6c",
     @grant=1,
     @grantedGroup=nil,
     @grantedUsers=[],
     @id="5d9bfe5fab394d00510c39ae",
     @lastUpdateUser="5d53b1e3403080003a491d6c",
     @liker=[],
     @path="/path/",
     @redirectTo=nil,
     @revision=
      #<GrowiPageRevision:0x00007fe021195f88
       @__v=0,
       @_id="5d9bfe5fab394d00510c39af",
       @author=nil,
       @body=nil,
       @createdAt="",
       @format="",
       @path=nil>,
     @seenUsers=["5d53b1e3403080003a491d6c"],
     @status="published",
     @updatedAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>>,
   :attachment=>
    #<GrowiAttachment:0x00007fe02204ace0
     @__v=0,
     @_id="5d9c91b2ab394d00510c39b3",
     @createdAt=
      #<DateTime: 2019-10-08T13:40:02+00:00 ((2458765j,49202s,350000000n),+0s,2299161j)>,
     @creator="5d53b1e3403080003a491d6c",
     @downloadPathProxied="/download/5d9c91b2ab394d00510c39b3",
     @fileFormat="image/jpeg",
     @fileName="image.jpg",
     @filePath=nil,
     @filePathProxied="/attachment/5d9c91b2ab394d00510c39b3",
     @fileSize=65987,
     @id="5d9c91b2ab394d00510c39b3",
     @originalName="image.jpg",
     @page="5d9bfe5fab394d00510c39ae",
     @url="">},
 @ok=true>

4. ページを編集する [GApiRequestPagesUpdate]

ページの編集は、 GApiRequestPagesUpdate で行います。
「2. 指定したページの情報を取得する [GApiRequestPagesGet]」で取得した本文を書き換え、「3. 画像をアップロードする [GApiRequestAttachmentsAdd]」でアップロードしたファイルを、記事内から参照できるようにしてみます。

リクエストパラメータは下記のように指定します。

  • page_id: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPage._id を指定します。
  • body: 更新する内容の本文を記載します。今回は、 本文\\n\\n![画像](/attachment/5d9c91b2ab394d00510c39b3) としました。
  • revision_id: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPageRevision._id を指定します。
  • grant: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPage.grant を指定します。

APIを呼ぶと、下記のように指定したページの本文を更新することができます。

irb(main):015:0> req = GApiRequestPagesUpdate.new page_id: '5d9bfe5fab394d00510c39ae', body: "本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)", revision_id: '5d9bfe5fab394d00510c39af', grant: 1
=> #<GApiRequestPagesUpdate:0x00007fe0212af770 @entry_point="/_api/pages.update", @method="POST", @param={:body=>"本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)", :page_id=>"5d9bfe5fab394d00510c39ae", :revision_id=>"5d9bfe5fab394d00510c39af", :grant=>1}>
irb(main):016:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe0212fe898
 @data=
  #<GrowiPage:0x00007fe0212e7cb0
   @__v=1,
   @_id="5d9bfe5fab394d00510c39ae",
   @commentCount=0,
   @createdAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
   @creator=
    #<GrowiUser:0x00007fe0212ef898
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @grant=1,
   @grantedGroup=nil,
   @grantedUsers=[],
   @id="5d9bfe5fab394d00510c39ae",
   @lastUpdateUser=
    #<GrowiUser:0x00007fe0212e5ff0
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @liker=[],
   @path="path",
   @redirectTo=nil,
   @revision=
    #<GrowiPageRevision:0x00007fe0212ef780
     @__v=0,
     @_id="5d9c948fab394d00510c39b4",
     @author=nil,
     @body="本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)",
     @createdAt=
      #<DateTime: 2019-10-08T13:52:15+00:00 ((2458765j,49935s,542000000n),+0s,2299161j)>,
     @format="markdown",
     @hasDiffToPrev=true,
     @path="path">,
   @seenUsers=["5d53b1e3403080003a491d6c"],
   @status="published",
   @updatedAt=
    #<DateTime: 2019-10-08T13:52:15+00:00 ((2458765j,49935s,546000000n),+0s,2299161j)>>,
 @ok=true>

下記のように、画像をアップロードして、本文を更新することができました。

f:id:Aqutam:20191008230011p:plain

GROWI でAPIを使ってみる

概要

GROWI はAPIを利用して操作することが可能です。
今回は、APIをいくつか試してみようと思います。

GROWI のAPI

GROWI のAPIドキュメントを参照すると、 ExportHealthcheck に関するAPIしか記載がありません。
GROWI REST API v3 | GROWI Docs

ドキュメントにはまとまっていませんが、下記にその他の豊富なAPIが定義されています。
https://github.com/weseek/growi/blob/1ad5b697c857db760f293dbb10e3b0e9b09ea93d/src/server/routes/index.js

API Tokenの生成

APIを利用するには、まず API Token の生成が必要です。

右上 ユーザー名 > ユーザー設定 を開きます。
API設定」タブを開きます。
f:id:Aqutam:20190921173149p:plain

API Tokenを更新」ボタンをクリックします。
f:id:Aqutam:20190921195038p:plain

APIを呼ぶ前に

1. コマンドのインストール

macのターミナルでAPIの呼び出しを試します。
その際、 jq コマンドと nkf コマンドを使います。

jq がない場合は、先にインストールしてください。
Download jq

macの場合は、homebrew でインストールできます。

$ brew install jq

nkf がない場合も、先にインストールしてください。
macの場合は、これも homebrew でインストールできます。

$ brew install nkf

2. API Tokenの変換

APIcurl コマンドを使って呼び出します。
その際「API Tokenの生成」で作成したAPI Tokenを利用しますが、このままセットするとエラーになってしまうので、URL Encodeしておきます。

$ echo "[API Token]" | nkf -WwMQ | tr = %

例えば、API Tokenが =/0123456789/abcdef/= だとした場合は、URL Encodeすると下記のようになります。

$ echo "=/0123456789/abcdef/=" | nkf -WwMQ | tr = %
%3D%2F0123456789%2Fabcdef%2F%3D

APIを使ってみる

1. ページの一覧を取得する [/_api/pages.list]

ページの一覧の取得は、 /_api/pages.list で行えます。
APIを呼び出すために、 curl コマンドに下記を設定します。

  • app名: xxxxx.growi.cloudxxxxx の部分です。
  • access_token: 「2. API Tokenの変換」で準備したURL Encode済みのAPI Tokenです。
  • user: 右上に表示されているログイン中のユーザー名です。

下記のようにページの一覧が取得できました。

$ curl -s "https://[app名].growi.cloud/_api/pages.list?access_token=[URL Encode済みAPI Token]&user=[ユーザー名]" | jq .
{
  "pages": [
    {
      "status": "published",
      "grant": 4,
      "grantedUsers": [
        "5d53b1e3403080003a491d6c"
      ],
      "liker": [],
      "seenUsers": [
        "5d53b1e3403080003a491d6c"
      ],
      "commentCount": 0,
      "_id": "5d84f0ec87339600517b338a",
      "createdAt": "2019-09-20T15:31:56.653Z",
      "updatedAt": "2019-09-20T15:31:56.870Z",
      "path": "/test",
      "creator": "5d53b1e3403080003a491d6c",
      "lastUpdateUser": {
        "isGravatarEnabled": false,
        "isEmailPublished": true,
        "lang": "ja",
        "status": 2,
        "admin": true,
        "_id": "5d53b1e3403080003a491d6c",
        "createdAt": "2019-08-14T07:01:55.366Z",
        "name": "名前",
        "username": "ユーザー名",
        "email": "メールアドレス"
      },
      "redirectTo": null,
      "grantedGroup": null,
      "__v": 1,
      "revision": "5d8610eb43cc8400554f9775",
      "id": "5d84f0ec87339600517b338a"
    },
    {
      "status": "published",
      "grant": 1,
      "grantedUsers": [],
      "liker": [],
      "seenUsers": [
        "5d53b1e3403080003a491d6c"
      ],
      "commentCount": 0,
      "_id": "5d831e595799980050f87f72",
      "createdAt": "2019-09-19T06:21:13.745Z",
      "updatedAt": "2019-09-19T06:21:13.760Z",
      "path": "/Templates/%E6%89%8B%E9%A0%86%E6%9B%B8/title",
      "creator": "5d53b1e3403080003a491d6c",
      "lastUpdateUser": {
        "isGravatarEnabled": false,
        "isEmailPublished": true,
        "lang": "ja",
        "status": 2,
        "admin": true,
        "_id": "5d53b1e3403080003a491d6c",
        "createdAt": "2019-08-14T07:01:55.366Z",
        "name": "名前",
        "username": "ユーザー名",
        "email": "メールアドレス"
      },
      "redirectTo": null,
      "grantedGroup": null,
      "__v": 1,
      "revision": "5d831e595799980050f87f73",
      "id": "5d831e595799980050f87f72"
    },
    ...
  ],
  "totalCount": 85,
  "offset": 0,
  "limit": 51,
  "ok": true
}

2. 指定したページの情報を取得する [/_api/pages.get]

指定したページの中身を取得します。
/_api/pages.get で行います。
curl コマンドに下記を設定します。

  • app名: xxxxx.growi.cloudxxxxx の部分です。
  • access_token: 「2. API Tokenの変換」で準備したURL Encode済みのAPI Tokenです。
  • page_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の .pages[].id を選択します。例として 5d84f0ec87339600517b338a を指定します。
$ curl -s "https://[app名].growi.cloud/_api/pages.get?access_token=[URL Encode済みAPI Token]&page_id=5d84f0ec87339600517b338a" | jq .
{
  "page": {
    "status": "published",
    "grant": 1,
    "grantedUsers": [],
    "liker": [],
    "seenUsers": [
      "5d53b1e3403080003a491d6c"
    ],
    "commentCount": 0,
    "_id": "5d84f0ec87339600517b338a",
    "createdAt": "2019-09-20T15:31:56.653Z",
    "updatedAt": "2019-09-21T12:00:43.124Z",
    "path": "/test",
    "creator": {
      "isGravatarEnabled": false,
      "isEmailPublished": true,
      "lang": "ja",
      "status": 2,
      "admin": true,
      "_id": "5d53b1e3403080003a491d6c",
      "createdAt": "2019-08-14T07:01:55.366Z",
      "name": "名前",
      "username": "ユーザー名",
      "email": "メールアドレス"
    },
    "lastUpdateUser": {
      "isGravatarEnabled": false,
      "isEmailPublished": true,
      "lang": "ja",
      "status": 2,
      "admin": true,
      "_id": "5d53b1e3403080003a491d6c",
      "createdAt": "2019-08-14T07:01:55.366Z",
      "name": "名前",
      "username": "ユーザー名",
      "email": "メールアドレス"
    },
    "redirectTo": null,
    "grantedGroup": null,
    "__v": 3,
    "revision": {
      "format": "markdown",
      "_id": "5d8610eb43cc8400554f9775",
      "createdAt": "2019-09-21T12:00:43.122Z",
      "path": "/test",
      "body": "## 概要\nGROWI.cloud は esa.io や Qiita:team から直接インポートできる便利な機能があります。<br>\n今回、このインポート機能を利用して esa.io から GROWI.cloud へ移行しました。<br>\nインポート機能を利用する際、ハマった所があったため、備忘録としてまとめます。\n\n## esa.io から GROWI への移行\n\n### 1. esa.io の設定\n\nGROWI から esa.io の記事を取得できるように、 esa.io で Personal access token を作成します。<br>\nSETTINGS > Applications にある Personal access tokens 右の Generate new token ボタンをクリックします。\n\n![ORG__DSC0030.jpeg (2.1 MB)](https://img.esa.io/uploads/production/attachments/xxxxx/2019/09/21/xxxxx/xxxxx.jpeg)\n\n下記を設定して Save ボタンをクリックします。\n\n- Token description: 何でもよいので目的がわかる名前をつけます。 例) GROWI\n- Select scopes: Readにのみチェックします。",
      "author": {
        "isGravatarEnabled": false,
        "isEmailPublished": true,
        "lang": "ja",
        "status": 2,
        "admin": true,
        "_id": "5d53b1e3403080003a491d6c",
        "createdAt": "2019-08-14T07:01:55.366Z",
        "name": "名前",
        "username": "ユーザー名",
        "email": "メールアドレス"
      },
      "hasDiffToPrev": true,
      "__v": 0
    },
    "id": "5d84f0ec87339600517b338a"
  },
  "ok": true
}

3. 画像をアップロードする [/_api/attachments.add]

画像のアップロードをするためには、 /_api/attachments.add を使います。
API名から推測できる通り、このAPIはページに対して画像をアップロードして紐付けます。
アップロードしただけでは、記事内に配置されないため、ページを編集するAPIもしくはWeb UIでコンテンツを書き換える必要があります。
curl コマンドは下記を設定します。

  • app名: xxxxx.growi.cloudxxxxx の部分です。
  • access_token: 上記までのAPIとは違い、URL Encodeしていない「API Tokenの生成」で作成したAPI Tokenをセットします。
  • file: @ファイルフルパス の形式でアップロードする画像を指定します。
  • page_id: 画像をアタッチしたい、「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の .pages[].id を選択します。例として 5d84f0ec87339600517b338a を指定します。

アップロードに成功すると、下記のような結果が返ってきます。

$ curl -s -X POST -F "access_token=[URL EncodeしていないAPI Token]" -F file=@/path/to/image.jpeg -F page_id=5d84f0ec87339600517b338a https://[app名].growi.cloud/_api/attachments.add | jq .
{
  "page": {
    "status": "published",
    "grant": 1,
    "grantedUsers": [],
    "liker": [],
    "seenUsers": [
      "5d53b1e3403080003a491d6c"
    ],
    "commentCount": 0,
    "_id": "5d84f0ec87339600517b338a",
    "createdAt": "2019-09-20T15:31:56.653Z",
    "updatedAt": "2019-09-21T12:00:43.124Z",
    "path": "/test",
    "creator": "5d53b1e3403080003a491d6c",
    "lastUpdateUser": "5d53b1e3403080003a491d6c",
    "redirectTo": null,
    "grantedGroup": null,
    "__v": 3,
    "revision": "5d8610eb43cc8400554f9775",
    "id": "5d84f0ec87339600517b338a"
  },
  "attachment": {
    "fileSize": 2094923,
    "_id": "5d86407b43cc8400554f977c",
    "createdAt": "2019-09-21T15:23:39.544Z",
    "page": "5d84f0ec87339600517b338a",
    "creator": "5d53b1e3403080003a491d6c",
    "originalName": "ORG__DSC0030_2.jpeg",
    "fileName": "1e26426f80e91863eb13fb3c61f52305.jpeg",
    "fileFormat": "image/jpeg",
    "__v": 0,
    "filePathProxied": "/attachment/5d86407b43cc8400554f977c",
    "downloadPathProxied": "/download/5d86407b43cc8400554f977c",
    "id": "5d86407b43cc8400554f977c"
  },
  "pageCreated": false,
  "ok": true
}

Web UIでも実際にファイルがアップロードされているか確認してみます。
下記のように、 https://[app名].growi.cloud/ の後ろに、 page_id を指定するとそのページを表示できます。

https://[app名].growi.cloud/[page_id]

例)
https://[app名].growi.cloud/5d84f0ec87339600517b338a

ページを開き、一番下にある Attachments に画像が追加されていることが確認できます。

f:id:Aqutam:20190922003802p:plain

4. ページを編集する [/_api/pages.update]

ページの書き換えは、/_api/pages.update を使います。
このAPIを使って、「3. 画像をアップロードする [/_api/attachments.add]」でアタッチした画像をページに埋め込んでみます。
curl コマンドは下記を設定します。
リクエストパラメータは -d オプションで JSON 形式で指定します。

  • app名: xxxxx.growi.cloud の xxxxx の部分です。
  • access_token: ここでもURL Encodeしていない「API Tokenの生成」で作成したAPI Tokenをセットします。
  • body: ページの内容を記載します。ここを編集してアタッチした画像を埋め込みます。編集方法は後述します。
  • page_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の .pages[].id を選択します。例として 5d84f0ec87339600517b338a を指定します。
  • revision_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスで、 .pages[].id と同じハッシュに指定されている .pages[].revision を指定します。
  • grant: 今回は 1 を指定します。

body パラメータは下記のように追加を行いました。
末尾に \n\n![ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d) を追加しています。
markdown の画像埋め込み書式で記載し、パスに /attachment/[attachment id] を指定します。

[変更前]
## タイトル\n本文本文本文

[変更後]
## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)

リクエストとレスポンスは下記のようになります。

curl -s -X POST \
-H 'Content-Type:application/json' \
-d '{"access_token":"[URL EncodeしていないAPI Token]","body":"## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)","revision_id":"5d8610eb43cc8400554f9775","grant":1}' \
https://[app名].growi.cloud/_api/pages.update | jq .
{
  "page": {
    "status": "published",
    "grant": 1,
    "grantedUsers": [],
    "liker": [],
    "seenUsers": [
      "5d53b1e3403080003a491d6c"
    ],
    "commentCount": 0,
    "_id": "5d84f0ec87339600517b338a",
    "createdAt": "2019-09-20T15:31:56.653Z",
    "updatedAt": "2019-09-21T15:52:21.581Z",
    "path": "/test",
    "creator": {
      "isGravatarEnabled": false,
      "isEmailPublished": true,
      "lang": "ja",
      "status": 2,
      "admin": true,
      "_id": "5d53b1e3403080003a491d6c",
      "createdAt": "2019-08-14T07:01:55.366Z",
      "name": "名前",
      "username": "ユーザー名",
      "email": "メールアドレス"
    },
    "lastUpdateUser": {
      "isGravatarEnabled": false,
      "isEmailPublished": true,
      "lang": "ja",
      "status": 2,
      "admin": true,
      "_id": "5d53b1e3403080003a491d6c",
      "createdAt": "2019-08-14T07:01:55.366Z",
      "name": "名前",
      "username": "ユーザー名",
      "email": "メールアドレス"
    },
    "redirectTo": null,
    "grantedGroup": null,
    "__v": 3,
    "revision": {
      "format": "markdown",
      "_id": "5d86473543cc8400554f977e",
      "createdAt": "2019-09-21T15:52:21.579Z",
      "path": "/test",
      "body": "## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)",
      "author": {
        "isGravatarEnabled": false,
        "isEmailPublished": true,
        "lang": "ja",
        "status": 2,
        "admin": true,
        "_id": "5d53b1e3403080003a491d6c",
        "createdAt": "2019-08-14T07:01:55.366Z",
        "name": "名前",
        "username": "ユーザー名",
        "email": "メールアドレス"
      },
      "hasDiffToPrev": true,
      "__v": 0
    },
    "id": "5d84f0ec87339600517b338a"
  },
  "ok": true
}

Web UIで記事を開いてみると、末尾に画像の記述が追加され、画像が表示されていることが確認できます。

f:id:Aqutam:20190922011921p:plain

以上、APIを利用してGROWIをかなり柔軟に操作できることがわかりました。

GROWI で画像をアップロードできるようにする (AWS S3の設定)

概要

GROWI.cloud は App を立ち上げた初期設定のままでは画像などのファイルをアップロードすることができません。画像をアップロードできるようにするには、AWS設定 が必要となります。

今回、 GROWI で画像をアップロードできるように、AWSへの設定を説明したいと思います。

なお、この設定後にアップロードされたファイルは Amazon S3 に保存されます。
GROWI.cloud の利用料金とは別に Amazon S3 の料金がかかります。

ちょっとだけ導入の敷居が高いGROWI

esa.io では、契約後に特に設定することなく記事に画像をアップロードすることができました。
画像アップロードは頻繁に使う機能なので、設定が必要になるのは少々不便です。

GROWI Docsを確認すると、2019/9/20現在 「AWS S3 へのアップロード設定」 は執筆中となっています。これもまた、GROWI.cloud の導入を敷居の高いものにしています。
ファイルのアップロード設定 | GROWI Docs

今後、順次ドキュメントは充実していくと思いますから、今だけの問題だと思います。

ちなみに、GROWI に何も設定せずに画像をアップロードしてみようとすると、このように File uploading is disabled と表示されアップロードできません。

f:id:Aqutam:20190920214426g:plain

設定方法

1. AWSアカウントの準備

AWSアカウントを持っていない場合は、下記からアカウントを作成します。
アカウント作成だけであれば無料です。

AWS アカウント作成の流れ | AWS

作成されたアカウントはrootアカウントになります。
rootアカウントのまま利用するとセキュリティ上の危険性が高いため、下記記事にあるような設定をし、IAMユーザーを使用するようにしましょう。

AWSのアカウント開設後にすべき事をまとめてみた | DevelopersIO

2. S3バケットの作成

アカウント発行後、コンソールにログインします。
「サービスを検索する」検索フィールドに S3 と入力し、選択します。

f:id:Aqutam:20190920225317p:plain

バケットを作成する」 ボタンをクリックします。
「1. 名前とリージョン」 では下記を設定し、「次へ」ボタンをクリックします。

  • バケット名: 任意の名前をつけます。なお、世界中でユニークな名前である必要があるため、簡単なバケット名は既に他の方に取得されている場合があります。
  • リージョン: 普段 GROWI を利用する場所と地理的に近いリージョンを選ぶことをおすすめします。今回は、 アジアパシフィック (東京) を選択します。

f:id:Aqutam:20190920232217p:plain

「2. オプションの設定」は、必要に応じて設定します。特に設定せず、「次へ」ボタンをクリックしても大丈夫です。

f:id:Aqutam:20190920232746p:plain

「3. アクセス許可の設定」は、下記を設定し、「次へ」ボタンをクリックします。

  • パブリックアクセスをすべてブロック: 下記をチェックします。
    • 任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
    • 新しいパブリックバケットポリシーを介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
    • 任意のパブリックバケットポリシーを介して、バケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする
  • システムのアクセス許可の管理: Amazon S3 ログ配信グループにこのバケットへの書き込みアクセス権限を付与しない

f:id:Aqutam:20190921014325p:plain f:id:Aqutam:20190920233553p:plain

「4. 確認」では、設定内容を確認し、「バケットを作成」ボタンをクリックします。
S3バケットの一覧に作成されたバケットが追加されます。

f:id:Aqutam:20190920234821p:plain

3. GROWI用IAMユーザーの作成

再度コンソールホーム画面に戻り、IAMを開きます。

f:id:Aqutam:20190920234957p:plain

「ユーザー」をクリックし、「ユーザーを追加」ボタンをクリックします。
下記を設定し、「次のステップ: アクセス権限」ボタンをクリックします。

  • ユーザー名: 任意の名前を設定します。 例) growi-user
  • アクセスの種類: プログラムによるアクセス にのみチェックします。

f:id:Aqutam:20190920235221p:plain

既存のポリシーを直接アタッチ を選択し、 「ポリシーの作成」ボタンをクリックします。

f:id:Aqutam:20190920235840p:plain

JSON」タブを選択し、下記を貼り付けます。
その際、 Resourcegrowi-hogehoge-test-bucket の部分は、「2. S3バケットの作成」で設定したバケット名に変更します。

f:id:Aqutam:20190921000523p:plain

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::growi-hogehoge-test-bucket",
                "arn:aws:s3:::growi-hogehoge-test-bucket/*"
            ]
        }
    ]
}

「ポリシーの確認」で、「名前」に任意のポリシー名を設定し、「ポリシーの作成」ボタンをクリックします。

f:id:Aqutam:20190921000837p:plain

先程のユーザーを追加画面に戻り、「ポリシーの作成」ボタンの右にある 更新マーク のボタンをクリックします。
検索フィールドに growi と入力し、一覧に先程作成したポリシー名が表示されたら選択し、「次のステップ: タグ」をクリックします。

f:id:Aqutam:20190921001614p:plain

タグの追加は任意で設定し、「次のステップ: 確認」ボタンをクリックします。

f:id:Aqutam:20190921001808p:plain

確認画面の内容に問題がなければ、「ユーザーの作成」ボタンをクリックします。

f:id:Aqutam:20190921001845p:plain

ユーザーが作成され、 アクセスキーシークレットアクセスキー が表示されます。 シークレットアクセスキー は「表示」をクリックして確認します。一度この画面を離れると再度確認できなくなります。「.csvのダウンロード」ボタンをクリックして保存しておきましょう。

f:id:Aqutam:20190921002303p:plain

GROWI でのAWS設定

管理 > アプリ設定を開きます。
AWS設定」セクションで下記を設定し「更新」ボタンをクリックします。

  • リージョン: 「2. S3バケットの作成」で選択したリージョンをリージョンコードで入力します。
    リージョンコードは下記で確認します。
    リージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud
    アジアパシフィック (東京) の場合は、 ap-northeast-1 です。
  • カスタムエンドポイント: 今回はS3を利用するため、空欄にします。
  • バケット名: 「2. S3バケットの作成」で入力したバケット名を設定します。
  • Access Key ID: 「3. GROWI用IAMユーザーの作成」で発行された アクセスキーID を設定します。
  • Secret Access Key: 「3. GROWI用IAMユーザーの作成」で発行された シークレットアクセスキー を設定します。

f:id:Aqutam:20190921003009p:plain

下記メッセージが表示されたら、設定を保存成功です。

f:id:Aqutam:20190921003047p:plain

アップロードを試す

「作成」ボタンをクリックし、任意のページ名を付け、エディタ領域に画像をドラッグアンドドロップします。
正しく設定されると、記事に画像が埋め込まれます。

f:id:Aqutam:20190921020249g:plain

以上でAWSの設定が完了し、画像などのファイルをアップロードできるようになりました。

esa.io から GROWI への移行してみた

概要

2019年8月中旬に GROWI.cloud が公開され、ライトプランを契約していましたが、今までずっと放置していました。
そして本日、ようやく設定をし始めました。
いままで個人的な情報は esa.io で管理していました。

GROWI.cloud は、esa.io や Qiita:team などのユーザーごとの課金とは異なり、プランを選択して課金します。
プランに応じた上限人数まで同一料金で利用できます。
また、ライトプランの場合、1人で利用したとしてもユーザーあたりに換算した料金は他のサービスと比較しても安いです。

GROWI.cloud は esa.io や Qiita:team から直接インポートできる便利な機能があります。
今回、このインポート機能を利用して esa.io から GROWI.cloud へ移行しました。
インポート機能を利用する際、ハマった所があったため、備忘録としてまとめます。

esa.io から GROWI への移行

1. esa.io の設定

GROWI から esa.io の記事を取得できるように、 esa.io で Personal access token を作成します。
SETTINGS > Applications にある Personal access tokens 右の Generate new token ボタンをクリックします。

f:id:Aqutam:20190919215040p:plain

下記を設定して Save ボタンをクリックします。

  • Token description: 何でもよいので目的がわかる名前をつけます。 例) GROWI
  • Select scopes: Readにのみチェックします。

f:id:Aqutam:20190919220310p:plain

アクセストークンが生成されるので、コピーします。
画面リロードなどをすると、生成されたアクセストークンは確認することができなくなります。
確認できなくなった場合は、一度アクセストークンを削除し、もう一度生成してください。

f:id:Aqutam:20190919220753p:plain

2. GROWI の設定

管理 > データインポート を開きます。

f:id:Aqutam:20190919221442p:plain

下記を設定します。

  • チーム名: xxxxx.esa.io の xxxxx の部分
  • アクセストークン: 先程生成しコピーしたアクセストーク

f:id:Aqutam:20190919221918p:plain

ここで少々ハマりポイントです。
値を設定後に 接続テスト ボタンをクリックしたくなりますが、先に 更新 ボタンをクリックして設定を保存します。
更新 ボタンをクリックせずに 接続テスト ボタンをクリックすると下記のエラーが表示されます。

f:id:Aqutam:20190919222024p:plain

更新 ボタンで設定を保存後に、 接続テスト ボタンをクリックし、下記のように表示されれば esa.io との接続が成功です。

f:id:Aqutam:20190919222250p:plain

3. インポート

インポート ボタンをクリックします。
インポートできなかった記事は下記のようにエラーが表示されます。
それらの記事は手動で GROWI に記事を作成して移行します。

f:id:Aqutam:20190919222948p:plain

GROWI トップページを開くと、 Contents に esa.io からインポートされた記事が表示されています。

f:id:Aqutam:20190919223501p:plain

インポート機能の注意点

esa.io からインポートされた記事内に含まれる画像などのURLは、 https://img.esa.io/uploads/production/attachments/xxxxxx/xxxx.jpg のように img.esa.io のままになっています。バージョン 3.5.12 時点では、インポート時のファイルのURLの変換機能は提供されていません。画像などのファイルは手動で GROWI にアップロードし直す必要があります。

そもそも GROWI で画像などのファイルをアップロードするためには、自前でAWSアカウントを発行し、 GROWI に設定する必要があります。 GROWI は画像などのファイルを、自前で用意したAWSアカウントのS3バケットに保存します。
AWS設定方法は下記で説明しています。
www.zuglab.tech

GROWI の情報について

GROWI.cloud は、OSSである GROWI.org を手軽に利用できるようにしたクラウドサービスです。
しかし、公開されて間もないため「インポート機能」、「AWS設定」をはじめ、ドキュメントが不足しています。
設定につまづいた際は、Slack ワークスペースがあるので、ここに質問するとすぐにサポートが受けられます。

growi-slackin.weseek.co.jp

参考

f:id:Aqutam:20190920001740p:plain

Raspberry Piの画面キャプチャ

概要

前回の記事でRaspberry Piのキャプチャを貼っていました。
インストール中の画面は、VNCなどができないため、そのままではキャプチャすることができません。
そこで、HDMIキャプチャ機器の購入と、キャプチャソフトウェア環境を整えました。

キャプチャ機器

購入したHDMIキャプチャ機器はこちらです。
HDMIキャプチャ機器は他にもたくさんありますが、こちらはUVC(USB Video Class) 、いわゆるWebカメラの規格に対応しています。そのため、ドライバは特に要りません。Macでも使いたかったのでこのHDMIキャプチャ機器にしました。

キャプチャソフト

Macの場合はQuickTimeで撮れるので良いとして、今回はWindowsで使用するキャプチャソフトを探しました。
この辺りが見つかりました。

  • Windows 10 カメラ
  • VLC
  • OBS (Open Broadcaster Software)

結論から言うと、 OBS (Open Broadcaster Software) が一番使いやすいと感じました。

Windows 10 カメラ

Windows 10 に標準で入っているアプリです。
シンプルでいいものの、設定があまりできず音声はプレビューできません。
Raspberryのモニタ代わりとして、音声も聞きたい場合は使えません。
録画したファイルには音声が記録されます。

f:id:Aqutam:20190717074837p:plain

良い点

悪い点

  • 音声がプレビューできない。

VLC

なんでも大体再生できるプレーヤーです。
https://www.videolan.org/vlc/index.ja.html

f:id:Aqutam:20190717075649p:plain

良い点

悪い点

  • 画質が悪い。
  • 遅延が大きい。

この2つは設定をいじっても改善できず。

OBS (Open Broadcaster Software)

OSSの配信用ソフトウェアです。
I-O DATA GV-HUVCのマニュアルに説明があり、そこからこのソフトウェアを知りました。
3つの中で遅延が最も少なく感じました。
https://obsproject.com/ja

f:id:Aqutam:20190717075756p:plain f:id:Aqutam:20190717075820p:plain

良い点

  • 画質が良い。
  • 遅延が少ない。

悪い点

スクリーンショットは撮れないため、ブログなどにキャプチャを貼る場合は一度録画をして、そこから切り出していこうと考えています。

Rasbianのインストール

概要

Raspberry Piに、NOOBSを利用してRaspbianをインストールします。

※ 事情によりWindowsMacが混在しています。

参考手順

下記のインストールガイドに従って作業します。
https://www.raspberrypi.org/documentation/installation/installing-images/README.md

と、ガイドを開いて早速こんな記載がありました。

We recommend most users download NOOBS, which is designed to be very easy to use. However, more advanced users looking to install a particular image should use this guide.

NOOBSとは、Raspbianなどのを含むOSの簡易インストーラーのようです。
NOOBSが登場する前は、SDカードに直接OSイメージを書き込んで利用していましたが、現在はこちらが主流のようです。

NOOBSインストールガイド
https://www.raspberrypi.org/documentation/installation/noobs.md

NOOBSの書き込み

1. NOOBSのZIPをダウンロードする

下記URLからNOOBSのZIPをダウンロードします。
https://www.raspberrypi.org/downloads/

f:id:Aqutam:20190716230541p:plain

f:id:Aqutam:20190716230622p:plain

2. SDカードにNOOBSをインストールする

Mac OS The SD Association's Formatting Tool is also available for Mac users, although the default OS X Disk Utility is also capable of formatting the entire disk. To do this, select the SD card volume and choose Erase with MS-DOS format.

これによると、「 SD Memory Card Formatter を使ってフォーマットを行え」とのことなので、さっそくアプリケーションをダウンロードします。

SD Memory Card Formatter
https://www.sdcard.org/downloads/formatter/

f:id:Aqutam:20190716231818p:plain

3. SD Memory Card Formatterをインストールする

SD Memory Card Formatterのzipをダウンロードしたら、中にインストーラーが入っているので、インストールを行います。

4. SD Memory Card Formatterでフォーマットする

キャプチャの通りにフォーマットを進めていきます。

f:id:Aqutam:20190716232041p:plain

f:id:Aqutam:20190716232103p:plain

f:id:Aqutam:20190716232141p:plain

f:id:Aqutam:20190716232223p:plain

5. NOOBS_v3_0_1.zip を展開し、中身をフォーマットしたSDカードにコピーする

MacのFinderでファイルを一式、直接コピーします。

f:id:Aqutam:20190716232513p:plain

コピーが終わったらSDカードを安全に取り外します。

NOOBSでのRaspbianインストール

1. Raspberry Piの起動

NOOBSを書き込んだSDカードをRaspberry Piにセットし、電源を接続します。

2. インストールするOSの選択

しばらくすると、OSの一覧が表示されます。 今回は Raspbian Full をインストールします。

※ 今回はRaspberry PiとLANケーブルで接続しています。WiFiの場合は先に WiFi networks ボタンをクリックし、WiFiアクセスポイントに接続する必要があります。WiFi接続後OSの一覧が表示されます。

f:id:Aqutam:20190717212939p:plain

下記の確認ダイアログが表示されたら、「はい」をクリックします。

f:id:Aqutam:20190717214159p:plain

3. インストール

インストールが完了するまでしばらく待ちます。

f:id:Aqutam:20190717214341p:plain

インストールが完了すると、「OSのインストールに成功しました」ダイアログが表示されます。 OKボタンをクリックすると、再起動されます。

f:id:Aqutam:20190717214452p:plain

4. Raspbianの初期設定

再起動するとデスクトップにセットアップダイアログが表示されるので、初期設定を行います。

f:id:Aqutam:20190717215834p:plain

Country, Language, Timezoneを設定します。

f:id:Aqutam:20190717220341p:plain

デフォルトで登録されている Pi ユーザーのパスワードを設定します。

f:id:Aqutam:20190717220455p:plain

Raspbianのデスクトップ表示のまわりに黒帯が表示されている場合は、 This screen shows a black border around the desktop にチェックを入れると、再起動後に領域が拡張されます。

f:id:Aqutam:20190717220600p:plain

ソフトウェアのアップデートを行います。 アップデート完了まで少々時間がかかります。

f:id:Aqutam:20190717220637p:plain

f:id:Aqutam:20190717220750p:plain

アップデートが完了したら、Raspbianを再起動します。

f:id:Aqutam:20190717220853p:plain

5. ビデオメモリの設定

RaspbianはビデオメモリをRAMと共有しています。 初期のビデオメモリの割り当てのままだと少なく、YouTubeなどで全画面再生を行うとかなり再生がカクつきます。 そこで、ビデオメモリの割り当てサイズを増やします。

f:id:Aqutam:20190717220940p:plain

GPUメモリに、 256 と入力します。 再起動後、新しいビデオメモリの割り当てで有効化されます。

f:id:Aqutam:20190717221038p:plain

以上で、Raspbianのインストールは終了です。