雑多なブログ

音楽や語学、プログラム関連の話題について書いています

電車内で、会社支給のノートPCで仕事する奴は馬鹿

真面目な話、情報漏洩のリスクがあるから、そんな事やっているなら即やめなはれ。上から、真横から、窓の反射から、 と色々な角度から見えるからね。危険だよ。

何よりも、管理番号とか本体に貼り付けてあったりすると、パッと見で仕事で使っている端末であるという事がバレてしまうので危険だよ。

今日のロシア語の単語

ネイティブの人が使っていた単語のリスト。

 

----

 

выращивать (不完了体)

(動植物を)育てる(飼育、栽培)

(人を)育てる

 

речка

小川


домашнее дело

家事?


удалённо

遠隔


пожилые

年配の人たち

 

вид

眺め


виднеться(不完了体)

見える

 

「キャッチコピー」は和製英語

「キャッチコピー」は和製英語

単に、「copy」で良さそうです。 「catchphrase」だと「キャッチコピー」のニュアンスからずれているようなので・・・

さておき、走り書きみたいになっているので、 改めて時間のあるときに調べなおしておきたい。

cutコマンドでtsvファイルを処理するには。

cutコマンドは、特定の列だけ抽出する事ができるコマンド。
ちなみに、tsvファイル(タブ区切りのファイル)の場合は区切り文字の 指定不要。そのまま取得する列だけ指定すれば列の抽出ができてしまう!

macのterminalでcutコマンドのman pageを見てみると、下記のように説明が書かれている。つまり、タブがデフォルトの区切り文字なのだ。

-d delim
    Use delim as the field delimiter character instead of the tab char-
    acter.

tsvファイルの特定列を抽出する例

test.tsv

col1  col2    col3
1   2   3
11  22  33

3列目を抽出する

cat test.tsv | cut -f 3 

CSP: Content Security Policyとは?

CSP(Content Security Policy)は、リソースの読み込みを制限する仕組み。
CSPはmetaタグや、HTTPのレスポンスで設定する。

目次

CSP: Content Security Policyとは?

jsやcss、画像などのリソースを読み込む際、意図しない外部のドメインからの読み込みをブロックする事ができる。

リソースの種類

CSPで読み込みの制御をできるリソースは下記の通り。

  • base-uri (base要素に使用できるURLを制限)
  • img-src (画像)
  • script-src (jsなどのスクリプト)
  • child-src (iframe)
  • style-src (CSS)
  • font-src (Webフォント)
  • form-action (formのactionの送信先)
  • object-src (flashなどのプラグイン)
  • default-src (リソース特定の指定がない場合に適用されるデフォルトの設定)

なお、下記についてはdefault-srcの設定は適用されないため、全て許可している設定として扱われるようだ。

  • base-uri
  • form-action

キーワードの種類

参照元のURLの部分に、URLキーワードを使用する事ができる。

キーワード 意味
'none' 何にも一致しない
'self' 現在のサイトと同じドメインのみ許可(サブドメインは除外)。
'unsafe-inline' インラインのJSとCSSを許可する。
'unsafe-eval' text-to-javascript の仕組みを許可する(evalなど)。

インラインのJSとCSS弾くと結構めんどいような気もする・・・

記述例

下記の通りディレクティブ毎にセミコロンで区切って記述する。
URLは半角スペース区切りで記述する。

directive1 url1 url2; directive2 url1 url2; directiveN url1 url2 ...

許可ドメインを記述

script-src https://a.example.com https://b.example.com

参考サイト

Googleの解説が詳しく書かれていたので一読すると良いかも。

developers.google.com developer.mozilla.org

Brad Mehldau - Suite: April 2020

Brad Mehldau の新しいピアノソロアルバム Suite: April 2020 が発売された。
Spotifyでも聴けるので早速聴いてみてる。

コロナ禍の世界を捉えたアルバム、ということらしい。
詳しい事はこちらを読んでみると良い。

wmg.jp

個人的な感想としては、外側に弾ける音楽というよりは、心の内側に潜っていくような曲が多いと感じた。

ちなみに、アルバムの中から一曲「remembering before all this」という曲の楽譜が無料で公開されている。
派手な曲ではなく、どことなく影を感じさせる曲ではあるけれど、とても美しい曲であると思う。

modernworksmusicpublishing.com

Youtube APIについて

やりたい事はこの通り

Youtube APIを使って、動画を特定のキーワードで検索し、   
動画それぞれの視聴数・like/unlikeの数などを取得したい。

これを実現するには、search/list APIで動画のIDを取得し、個々の動画のlike/dislikeの情報を videos APIで取得する必要があるようだ。

APIについての概要はこちらから。 [:contents]

search API

search APIのレスポンスには、動画のIDやサムネイルの情報などの基本的な情報しか含まれていないため、動画の詳細な情報はvideosAPIにて個別に取得する必要がある。

ドキュメントURL: https://developers.google.com/youtube/v3/docs/search/list

APIエンドポイントURL:

GET https://www.googleapis.com/youtube/v3/search

レスポンス:

{
  "kind": "youtube#searchListResponse",
  "etag": etag,
  "nextPageToken": string,
  "prevPageToken": string,
  "pageInfo": {
    "totalResults": integer,
    "resultsPerPage": integer
  },
  "items": [
    検索リソース
  ]
}

検索リソースのデータ構造

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string
  }
}

videos API

レスポンスのデータ構造を見たところ、自分が必要としているlike/dislikeの情報が含まれている事が確認できた。

ドキュメントURL:
https://developers.google.com/youtube/v3/docs/videos/list

APIエンドポイントURL:
GET https://www.googleapis.com/youtube/v3/videos

レスポンス:

{
  "kind": "youtube#videoListResponse",
  "etag": etag,
  "nextPageToken": string,
  "prevPageToken": string,
  "pageInfo": {
    "totalResults": integer,
    "resultsPerPage": integer
  },
  "items": [
    動画リソース
  ]
}

動画リソースのデータ構造

{
  "kind": "youtube#video",
  "etag": etag,
  "id": string,
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string,
    "tags": [
      string
    ],
    "categoryId": string
  },
  "contentDetails": {
    "duration": string,
    "dimension": string,
    "definition": string,
    "caption": string,
    "licensedContent": boolean,
    "regionRestriction": {
      "allowed": [
        string
      ],
      "blocked": [
        string
      ]
    },
    "contentRating": {
      "mpaaRating": string,
      "tvpgRating": string,
      "bbfcRating": string,
      "chvrsRating": string,
      "eirinRating": string,
      "cbfcRating": string,
      "fmocRating": string,
      "icaaRating": string,
      "acbRating": string,
      "oflcRating": string,
      "fskRating": string,
      "kmrbRating": string,
      "djctqRating": string,
      "russiaRating": string,
      "rtcRating": string,
      "ytRating": string
    }
  },
  "status": {
    "uploadStatus": string,
    "failureReason": string,
    "rejectionReason": string,
    "privacyStatus": string,
    "license": string,
    "embeddable": boolean,
    "publicStatsViewable": boolean
  },
  "statistics": {
    "viewCount": unsigned long,
    "likeCount": unsigned long,
    "dislikeCount": unsigned long,
    "favoriteCount": unsigned long,
    "commentCount": unsigned long
  },
  "player": {
    "embedHtml": string
  },
  "topicDetails": {
    "topicIds": [
      string
    ],
    "relevantTopicIds": [
      string
    ]
  },
  "recordingDetails": {
    "locationDescription": string,
    "location": {
      "latitude": double,
      "longitude": double,
      "altitude": double
    },
    "recordingDate": datetime
  },
  "fileDetails": {
    "fileName": string,
    "fileSize": unsigned long,
    "fileType": string,
    "container": string,
    "videoStreams": [
      {
        "widthPixels": unsigned integer,
        "heightPixels": unsigned integer,
        "frameRateFps": double,
        "aspectRatio": double,
        "codec": string,
        "bitrateBps": unsigned long,
        "rotation": string,
        "vendor": string
      }
    ],
    "audioStreams": [
      {
        "channelCount": unsigned integer,
        "codec": string,
        "bitrateBps": unsigned long,
        "vendor": string
      }
    ],
    "durationMs": unsigned long,
    "bitrateBps": unsigned long,
    "recordingLocation": {
      "latitude": double,
      "longitude": double,
      "altitude": double
    },
    "creationTime": string
  },
  "processingDetails": {
    "processingStatus": string,
    "processingProgress": {
      "partsTotal": unsigned long,
      "partsProcessed": unsigned long,
      "timeLeftMs": unsigned long
    },
    "processingFailureReason": string,
    "fileDetailsAvailability": string,
    "processingIssuesAvailability": string,
    "tagSuggestionsAvailability": string,
    "editorSuggestionsAvailability": string,
    "thumbnailsAvailability": string
  },
  "suggestions": {
    "processingErrors": [
      string
    ],
    "processingWarnings": [
      string
    ],
    "processingHints": [
      string
    ],
    "tagSuggestions": [
      {
        "tag": string,
        "categoryRestricts": [
          string
        ]
      }
    ],
    "editorSuggestions": [
      string
    ]
  }
}

とりあえず、概要調べて力尽きたので、今度はAPIを実際にリクエストするところまではやってみたい・・・・