ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

海底ケーブルマップがすごい

Django GirlsのREADMEを読んでいて、インターネットの仕組みの項目を読んでいた。

そこに海底ケーブルマップのサイトのリンクがあった。

Submarine Cable Map

すごい。色々すごいけど、志摩市の海底ケーブルの本数がすごい。志摩スペイン村しか知らなかったのに。

オホーツク海のケーブルや、クック諸島にぽつーんとケーブル引かれてるのが見てて面白い。

海底ケーブルって途方がなさすぎて全然イメージできないんですけど、こんなに張られてたんですねぇ。あと地下鉄感がすごい。

f:id:takeg:20190305172520p:plain
志摩の海底ケーブル

f:id:takeg:20190305172551p:plain
オホーツクの大三角形

f:id:takeg:20190305172618p:plain
太平洋にインターネットを届けている

ラズパイでgpartedを実行、"e2fsck cannot continue aborting is mounted"エラー

Raspbian用のSDカードの容量を小さくしたかった。

以前にもやったので、その方法を備忘録として残していました。試行錯誤の結果、以下の記事のまんまやればよいことがわかりました。

qiita.com

で、やってたらエラーが起きました。エラーの詳細を読むと、以下のような感じのことが書いてありました。

e2fsck cannot continue aborting is mounted

/dev/sda2 is mounted

/dev/sda2をアンマウントしてるのにおかしいなーと思ってたんですが、小一時間悩んで理由がわかりました。

私は以下のような構成でやっていました。

  • ラズパイ(起動中。gpartedを実行する。コピー元のSDカードでもある)
  • コピー先のSDカードをUSBに挿す

これではラズパイは起動中なので実際にはアンマウントできていないのが原因でした(たぶん)。

本当に必要な構成は、

  • ラズパイ(起動中。gpartedを実行する)
  • コピー元のSDカードをUSBに挿す
  • コピー先のSDカードをUSBに挿す

でした。

まあ記事をちゃんと読むとそう書いてあるんですけど、以前にやったことあったので適当に流し読みしてしまっていました。気を付けよう。

(SDカードのリーダライタが大きくて、ラズパイのUSBにそのまま2つ挿せなくて延長ケーブルが必要になって面倒くさかった)

Pythonの__file__は、対話モードで実行するとエラーになる

Pythonで、ファイル名を出力してくれる__file__は、対話モードで実行するとエラーになります。

> python
Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> print(__file__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined

対話モードなので、ファイルなんてないので当然といえば当然なエラーでしょうか。

ファイルで実行するときちんと出力してくれます。

# sample.py
import os

print(__file__)

a = os.path.dirname(os.path.abspath(__file__))
print(a)
a = os.path.dirname(os.path.abspath("__file__"))
print(a)
> python sample.py
sample.py
C:\Users\XXXX\workspace
C:\Users\XXXX\workspace

Bitbucketでブランチのブランチタイプを変更する

Bitbucketで、masterブランチのブランチタイプ(Branch type)がMAINかつDEVELOPMENTになっていたので、developブランチをDEVELOPMENTにしたいという話です。

f:id:takeg:20190131152325p:plain
masterブランチがMAINかつDEVELOPMENT

設定 > Branching model で、Development branchを変更して、保存します。

f:id:takeg:20190131152408p:plain
Deveropment branchの変更

ブランチ画面に行き、ブランチタイプの変更ができていることを確認します。

f:id:takeg:20190131152704p:plain
developブランチがDEVELOPMENT

ブランチタイプの説明は以下の公式に詳しく書いてあります。

ja.confluence.atlassian.com

はてなブログをHTTPS化した

私のはてなブログHTTPSじゃなくて、「いつになったらはてなHTTPS対応してくれるんだろーー~~~~~~~~~~ばなな」って口を開けて待ってたんですが、普通に公式からアナウンスがありました。

help.hatenablog.com

移行方法

ダッシュボードから設定画面にアクセスし、「変更する」を選択してください。

ワンクリックでHTTPS化できました。はてなさんありがとう。

Access to bucket "staging.PROJECT_ID.appspot.com" denied. You must grant Storage Object Viewer permission to ... エラーの解消

Google App EngineHello Worldチュートリアルを進めていたらデプロイ中にエラーが発生しました。

(python_docs_samples) C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world>gcloud app deploy
Services to deploy:

descriptor:      [C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world\app.yaml]
source:          [C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world]
target project:  [PROJECT_ID]
target service:  [default]
target version:  [20190126t190818]
target url:      [https:/PROJECT_ID.appspot.com]


Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
#============================================================#
#= Uploading 5 files to Google Cloud Storage                =#
#============================================================#
File upload done.
Updating service [default]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build AA-BB-CC-DD-EEEEE status: FAILURE.
Build error details: Access to bucket "staging.PROJECT_ID.appspot.com" denied. You must grant Storage Object Viewer permission to 9XXXXXXXX8@cloudbuild.gserviceaccount.com.
.
Check the build log for errors: https://console.cloud.google.com/gcr/builds/AA-BB-CC-DD-EEEEE?project=9XXXXXXXX8

注目すべきエラーメッセージは Build error details: Access to bucket "staging.PROJECT_ID.appspot.com" denied. You must grant Storage Object Viewer permission to 9XXXXXXXX8@cloudbuild.gserviceaccount.com. . の部分で、「バケットへのアクセスが失敗」と言われています。

さらに「9XXXXXXXX8@cloudbuild.gserviceaccount.com」に「Storage Object Viewer権限を与えてくれ」と言われています。

権限のエラーはIAMをいじれば解消できるはず。IAMの設定をろくにしたことがないので以下のリンクを読みます(バケットに対するIAMについても書いてあります)。

Using (Cloud IAM) Permissions  |  Cloud Storage  |  Google Cloud

なんとなくわかったところで、GCPから「IAMと管理」の画面を開き、9XXXXXXXX8@cloudbuild.gserviceaccount.comの編集アイコンをクリックします。

f:id:takeg:20190128160804p:plain
9XXXXXXXX8@cloudbuild.gserviceaccount.comの編集アイコンをクリック

「別の役割を追加」で「ストレージオブジェクトの閲覧者」を追加します。

f:id:takeg:20190128160910p:plain
「ストレージオブジェクトの閲覧者」を追加

そして再度デプロイするといけるはず……たぶん。

(python_docs_samples) C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world>gcloud app deploy
Services to deploy:

descriptor:      [C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world\app.yaml]
source:          [C:\Users\XXXX\workspace\python-docs-samples\appengine\standard_python37\hello_world]
target project:  [PROJECT_ID]
target service:  [default]
target version:  [20190126t193649]
target url:      [https://PROJECT_ID.appspot.com]


Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
#============================================================#
#= Uploading 0 files to Google Cloud Storage                =#
#============================================================#
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

デプロイできました!

gcloud app browseを実行するとWEBアプリケーションにアクセスできます。

chcpコマンドは何の略なのか

"CHange CodePage" の略らしいです。

ターミナルでchcp /?と打つと、

>chcp /?
Displays or sets the active code page number.

CHCP [nnn]

  nnn   Specifies a code page number.

Type CHCP without a parameter to display the active code page number.

Specifies a code page numberと書いてあるので、たしかにcode pageの略で間違いなさそうです。ところでcode pageってなんでしょう。

Wikipediaによれば

コードページとは、特定の符号化文字集合を指定するための数字、またはその数字で指定された符号化文字集合、あるいはそのような方法で符号化文字集合を指定するためのシステムのことである。cpと表示されることもある。それぞれの符号化文字集合は「コードページ○○(○○は2桁から5桁の数字)」という形で管理される。

「符号化文字集合」とあるので、文字コード(charset)のイメージでよいのでしょうか。

そして、

コードページという用語は、システムベンダ各社が管理している符号化文字集合を指す時にしか用いられず、ISO等の公的な規格の文字集合を「コードページ○○」などということはない。IBMおよび、マイクロソフトは各自、コードページを定めて管理している。マイクロソフトのコードページ群はMS-DOSWindowsなどで利用されている。IBMのコードページはSystem iやDB2等の文字データ表現体系(CDRA: "Character Data Representation Architecture")をサポートするIBMシステムで利用されている。

とあるので、文字コードをコードページと言い換えてベンダ各社が勝手に定義している…という理解でいいのかな。

最後によく使うchcpコマンド。

# 現在のcode pageを確認する
> chcp
Active code page: 932
# UTF-8に変更する
> chcp 65001
# SJISに変更する
> chcp 932