Skip to content

Instantly share code, notes, and snippets.

@hotchpotch
Created April 17, 2021 05:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hotchpotch/8fc0e5bc0ec559e6998a98b3dd61d31b to your computer and use it in GitHub Desktop.
Save hotchpotch/8fc0e5bc0ec559e6998a98b3dd61d31b to your computer and use it in GitHub Desktop.
tf-idf を用いた類似記事ピックアップ、検索
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python388jvsc74a57bd0554ac07f47e1711c42ec55e4aa9730646f95a52fcd34b4a8daedbf47c222a220",
"display_name": "Python 3.8.8 64-bit ('base': conda)"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from pathlib import Path\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"3140"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"data_path = Path(os.environ['HOME']).joinpath('src/github.com/hotchpotch/secon.dev/hosting/data-devel/')\n",
"md_paths = list(data_path.glob('**/*.md'))\n",
"len(md_paths)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from markdown import Markdown\n",
"from bs4 import BeautifulSoup\n",
"\n",
"md = Markdown(extensions=['full_yaml_metadata'])\n",
"\n",
"def parse(source):\n",
" body = md.convert(source)\n",
" text = ''.join(BeautifulSoup(body).findAll(text=True)).strip()\n",
" meta = md.Meta\n",
" return (text, meta)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 92.4 ms, sys: 117 ms, total: 209 ms\nWall time: 735 ms\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"3140"
]
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"%%time\n",
"import multiprocessing as mp\n",
"\n",
"pool = mp.Pool(mp.cpu_count())\n",
"parsed_mds = pool.map(parse, [path.read_text() for path in md_paths])\n",
"len(parsed_mds)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1414"
]
},
"metadata": {},
"execution_count": 5
}
],
"source": [
"parsed_mds = list(filter(lambda x: len(x[0]) > 400, parsed_mds))\n",
"len(parsed_mds)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"('いまさらながらに2014買って良かった物とか\\nAQUOS LC-60XL10\\nテレビが無ければ時間を他のことに使えるから、と思ってテレビなし生活を一年半ほど続けていて、最初の方は読書等に有効に時間を使えていたんだけど、その後 3DS やら PS Vita やらスマフォでゲームやらPCでsteamやら、テレビ以外で引きこもりエンターテイメントで結局の所時間を消費してしまって、ならばいっそテレビあっていいじゃん、ということで再びテレビを購入したところ、非常に引きこもりエンターテイメントクオリティが上がって満足。\\n4Kを買うかか迷ったけど、4Kそもそもソースがほぼ無い状態だし、4Kがメインストリームになることにはテレビ自体の質もまた上がっていて買い換えれば良いだろうと判断して、4Kでないモデルのフラッグシップ機を。デザインが気に入らなくてこれにするか非常に迷った(画質は一番良かった)んだけど、部屋に置いてみたらしっくりきて良かった。\\nXperia Z3 compact SO-02G\\n\\nNexus5 を壊してしまったので、N6 が出たら買おう、と思って数ヶ月、一向に Google Play ストアから買える気配が無かった中、SO-02G の値崩れが起きて何となく買ってみたら非常に良かった。\\n手にしっくりくるサイズ、ハイパフォーマンス、おサイフケータイ、ダブルタップで起動、MagSafe みたいなマグネット給電(防水なので、USBから給電するにはカバーを取る必要があるため重宝する)、STAMINA モード、一日使っても電池切れない、等々素晴らしい感じ。良い物使ってる感が感じられる。\\n欲を言えば、マグネット給電のマグネットがもっと強ければ良いなとか、あと裏がつるつるなんで滑って落として壊しそうだな、ぐらいかな。\\nSONY α7S ILCE-7S\\n人が持ってるのを見て欲しくなって、深く考えると買わなくなりそうなので、あまり考えずに購入。一緒にツァイスの35/55mm も。適当にとっても綺麗にとれるし、人を撮るのがめっちゃ楽しくなった!\\nこう書き出してみると、どれも後半に買った物ばかりで、前半に買った物を見落としている気がしてならない…。',\n",
" {'Draft': False,\n",
" 'Title': '2014買って良かった物',\n",
" 'Date': '2015-01-12T11:54:17+09:00',\n",
" 'Image': 'https://farm8.staticflickr.com/7521/16233932846_7c58a8f984_k.jpg',\n",
" 'Slug': '2015/01/12/115417',\n",
" 'Tags': ['life-and-consume']})"
]
},
"metadata": {},
"execution_count": 6
}
],
"source": [
"parsed_mds[0]\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"いまさら 副詞\nながら 助詞\nに 助詞\n2014 名詞\n買っ 動詞\nて 助詞\n良かっ 形容詞\nた 助動詞\n物 名詞\nと 助詞\nか 助詞\nAQUOS 名詞\nLC 名詞\n- 記号\n60 名詞\nXL 名詞\n10 名詞\nテレビ 名詞\nが 助詞\n無けれ 形容詞\nば 助詞\n時間 名詞\nを 助詞\n他 名詞\nの 助詞\nこと 名詞\nに 助詞\n使える 動詞\nから 助詞\n、 補助記号\nと 助詞\n思っ 動詞\nて 助詞\nテレビ 名詞\nなし 名詞\n生活 名詞\nを 助詞\n一 名詞\n年 名詞\n半 名詞\nほど 助詞\n続け 動詞\nて 助詞\nい 動詞\nて 助詞\n、 補助記号\n最初 名詞\nの 助詞\n方 名詞\nは 助詞\n読書 名詞\n等 接尾辞\nに 助詞\n有効 形状詞\nに 助動詞\n時間 名詞\nを 助詞\n使え 動詞\nて 助詞\nい 動詞\nた 助動詞\nん 助詞\nだ 助動詞\nけど 助詞\n、 補助記号\nその 連体詞\n後 名詞\n3 名詞\nDS 名詞\nやら 助詞\nPS 名詞\nVita 名詞\nやら 助詞\nスマフォ 名詞\nで 助詞\nゲーム 名詞\nやら 助詞\nPC 名詞\nで 助詞\nsteam 名詞\nやら 助詞\n、 補助記号\nテレビ 名詞\n以外 名詞\nで 助詞\n引きこもり 名詞\nエンターテイメント 名詞\nで 助詞\n結局 名詞\nの 助詞\n所 名詞\n時間 名詞\nを 助詞\n消費 名詞\nし 動詞\nて 助詞\nしまっ 動詞\nて 助詞\n、 補助記号\nなら 助動詞\nば 助詞\nいっそ 副詞\nテレビ 名詞\nあっ 動詞\nて 助詞\nいい 形容詞\nじゃん 助詞\n、 補助記号\nと 助詞\nいう 動詞\nこと 名詞\nで 助詞\n再び 副詞\nテレビ 名詞\nを 助詞\n購入 名詞\nし 動詞\nた 助動詞\nところ 名詞\n、 補助記号\n非常 形状詞\nに 助動詞\n引きこもり 動詞\nエンターテイメント 名詞\nクオリティ 名詞\nが 助詞\n上がっ 動詞\nて 助詞\n満足 名詞\n。 補助記号\n4 名詞\nK 名詞\nを 助詞\n買う 動詞\nか 助詞\nか 助詞\n迷っ 動詞\nた 助動詞\nけど 助詞\n、 補助記号\n4 名詞\nK 名詞\nそもそも 名詞\nソース 名詞\nが 助詞\nほぼ 副詞\n無い 形容詞\n状態 名詞\nだ 助動詞\nし 助詞\n、 補助記号\n4 名詞\nK 名詞\nが 助詞\nメイン 名詞\nストリーム 名詞\nに 助詞\nなる 動詞\nこと 名詞\nに 助詞\nは 助詞\nテレビ 名詞\n自体 名詞\nの 助詞\n質 名詞\nも 助詞\nまた 副詞\n上がっ 動詞\nて 助詞\nい 動詞\nて 助詞\n買い換えれ 動詞\nば 助詞\n良い 形容詞\nだろう 助動詞\nと 助詞\n判断 名詞\nし 動詞\nて 助詞\n、 補助記号\n4 名詞\nK 名詞\nで 助動詞\nない 形容詞\nモデル 名詞\nの 助詞\nフラッグシップ 名詞\n機 名詞\nを 助詞\n。 補助記号\nデザイン 名詞\nが 助詞\n気 名詞\nに 助詞\n入ら 動詞\nなく 助動詞\nて 助詞\nこれ 代名詞\nに 助詞\nする 動詞\nか 助詞\n非常 形状詞\nに 助動詞\n迷っ 動詞\nた 助動詞\n( 補助記号\n画質 名詞\nは 助詞\n一番 副詞\n良かっ 形容詞\nた 助動詞\n) 補助記号\nん 助詞\nだ 助動詞\nけど 助詞\n、 補助記号\n部屋 名詞\nに 助詞\n置い 動詞\nて 助詞\nみ 動詞\nたら 助動詞\nしっくり 副詞\nき 動詞\nて 助詞\n良かっ 形容詞\nた 助動詞\n。 補助記号\nXperia 名詞\nZ 名詞\n3 名詞\ncompact 名詞\nSO 名詞\n- 記号\n02 名詞\nG 名詞\nNexus 名詞\n5 名詞\nを 助詞\n壊し 動詞\nて 助詞\nしまっ 動詞\nた 助動詞\nの 助詞\nで 助動詞\n、 補助記号\nN 名詞\n6 名詞\nが 助詞\n出 動詞\nたら 助動詞\n買おう 動詞\n、 補助記号\nと 助詞\n思っ 動詞\nて 助詞\n数 名詞\nヶ月 名詞\n、 補助記号\n一向 副詞\nに 助詞\nGoogle 名詞\nPlay 名詞\nストア 名詞\nから 助詞\n買える 動詞\n気配 名詞\nが 助詞\n無かっ 形容詞\nた 助動詞\n中 名詞\n、 補助記号\nSO 名詞\n- 記号\n02 名詞\nG 名詞\nの 助詞\n値崩れ 名詞\nが 助詞\n起き 動詞\nて 助詞\n何 代名詞\nと 助詞\nなく 形容詞\n買っ 動詞\nて 助詞\nみ 動詞\nたら 助動詞\n非常 形状詞\nに 助動詞\n良かっ 形容詞\nた 助動詞\n。 補助記号\n手 名詞\nに 助詞\nしっくり 副詞\nくる 動詞\nサイズ 名詞\n、 補助記号\nハイ 名詞\nパフォーマンス 名詞\n、 補助記号\nお 接頭辞\nサイフ 名詞\nケータイ 名詞\n、 補助記号\nダブル 名詞\nタップ 名詞\nで 助詞\n起動 名詞\n、 補助記号\nMagSafe 名詞\nみたい 形状詞\nな 助動詞\nマグネット 名詞\n給電 名詞\n( 補助記号\n防水 名詞\nな 助動詞\nの 助詞\nで 助動詞\n、 補助記号\nUSB 名詞\nから 助詞\n給電 名詞\nする 動詞\nに 助詞\nは 助詞\nカバー 名詞\nを 助詞\n取る 動詞\n必要 名詞\nが 助詞\nある 動詞\nため 名詞\n重宝 名詞\nする 動詞\n) 補助記号\n、 補助記号\nSTAMINA 名詞\nモード 名詞\n、 補助記号\n一 名詞\n日 名詞\n使っ 動詞\nて 助詞\nも 助詞\n電池 名詞\n切れ 動詞\nない 助動詞\n、 補助記号\n等々 接尾辞\n素晴らしい 形容詞\n感じ 名詞\n。 補助記号\n良い 形容詞\n物 名詞\n使っ 動詞\nてる 助動詞\n感 名詞\nが 助詞\n感じ 動詞\nられる 助動詞\n。 補助記号\n欲 名詞\nを 助詞\n言え 動詞\nば 助詞\n、 補助記号\nマグネット 名詞\n給電 名詞\nの 助詞\nマグネット 名詞\nが 助詞\nもっと 副詞\n強けれ 形容詞\nば 助詞\n良い 形容詞\nな 助詞\nと 助詞\nか 助詞\n、 補助記号\nあと 名詞\n裏 名詞\nが 助詞\nつるつる 形状詞\nな 助動詞\nん 助詞\nで 助動詞\n滑っ 動詞\nて 助詞\n落とし 動詞\nて 助詞\n壊し 動詞\nそう 形状詞\nだ 助動詞\nな 助詞\n、 補助記号\nぐらい 助詞\nか 助詞\nな 助詞\n。 補助記号\nSONY 名詞\nα 記号\n7 名詞\nS 名詞\nILCE 名詞\n- 記号\n7 名詞\nS 名詞\n人 接尾辞\nが 助詞\n持っ 動詞\nてる 助動詞\nの 助詞\nを 助詞\n見 動詞\nて 助詞\n欲しく 形容詞\nなっ 動詞\nて 助詞\n、 補助記号\n深く 形容詞\n考える 動詞\nと 助詞\n買わ 動詞\nなく 助動詞\nなり 動詞\nそう 形状詞\nな 助動詞\nの 助詞\nで 助動詞\n、 補助記号\nあまり 副詞\n考え 動詞\nず 助動詞\nに 助詞\n購入 名詞\n。 補助記号\n一緒 名詞\nに 助詞\nツァイス 名詞\nの 助詞\n35 名詞\n/ 補助記号\n55 名詞\nmm 名詞\nも 助詞\n。 補助記号\n適当 名詞\nに 助詞\nとっ 動詞\nて 助詞\nも 助詞\n綺麗 形状詞\nに 助動詞\nとれる 動詞\nし 助詞\n、 補助記号\n人 名詞\nを 助詞\n撮る 動詞\nの 助詞\nが 助詞\nめっちゃ 副詞\n楽しく 形容詞\nなっ 動詞\nた 助動詞\n! 補助記号\nこう 副詞\n書き出し 動詞\nて 助詞\nみる 動詞\nと 助詞\n、 補助記号\nどれ 代名詞\nも 助詞\n後半 名詞\nに 助詞\n買っ 動詞\nた 助動詞\n物 名詞\nばかり 助詞\nで 助動詞\n、 補助記号\n前半 名詞\nに 助詞\n買っ 動詞\nた 助動詞\n物 名詞\nを 助詞\n見落とし 動詞\nて 助詞\nいる 動詞\n気 名詞\nが 助詞\nし 動詞\nて 助詞\nなら 動詞\nない 助動詞\n… 補助記号\n。 補助記号\n"
]
}
],
"source": [
"from fugashi import Tagger\n",
"\n",
"tagger = Tagger('-Owakati')\n",
"for word in tagger(parsed_mds[0][0]):\n",
" print(word.surface, word.feature[0])\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'2014 物 AQUOS LC 60 X'"
]
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"def convert_noun_only(text):\n",
" res = []\n",
" for word in tagger(text):\n",
" if word.feature[0] == \"名詞\":\n",
" res.append(word.surface)\n",
" return ' '.join(res)\n",
"\n",
"convert_noun_only(parsed_mds[0][0])[:20]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'2014買って良かった物\\nいまさらながらに2014買って良かった物とか\\nAQUOS LC-60XL10\\nテレビが無ければ時間を他のことに使えるから、と思ってテレビなし生活を一年半ほど続けていて、最初の方は読書等に有効に時間を使えていたんだけど、その後 3DS やら PS Vita やらスマフォでゲームやらPCでsteamやら、テレビ以外で引きこもりエンターテイメントで結局の所時間を消費してしまって、ならばいっそテレビあっていいじゃん、ということで再びテレビを購入したところ、非常に引きこもりエンターテイメントクオリティが上がって満足。\\n4Kを買うかか迷ったけど、4Kそもそもソースがほぼ無い状態だし、4Kがメインストリームになることにはテレビ自体の質もまた上がっていて買い換えれば良いだろうと判断して、4Kでないモデルのフラッグシップ機を。デザインが気に入らなくてこれにするか非常に迷った(画質は一番良かった)んだけど、部屋に置いてみたらしっくりきて良かった。\\nXperia Z3 compact SO-02G\\n\\nNexus5 を壊してしまったので、N6 が出たら買おう、と思って数ヶ月、一向に Google Play ストアから買える気配が無かった中、SO-02G の値崩れが起きて何となく買ってみたら非常に良かった。\\n手にしっくりくるサイズ、ハイパフォーマンス、おサイフケータイ、ダブルタップで起動、MagSafe みたいなマグネット給電(防水なので、USBから給電するにはカバーを取る必要があるため重宝する)、STAMINA モード、一日使っても電池切れない、等々素晴らしい感じ。良い物使ってる感が感じられる。\\n欲を言えば、マグネット給電のマグネットがもっと強ければ良いなとか、あと裏がつるつるなんで滑って落として壊しそうだな、ぐらいかな。\\nSONY α7S ILCE-7S\\n人が持ってるのを見て欲しくなって、深く考えると買わなくなりそうなので、あまり考えずに購入。一緒にツァイスの35/55mm も。適当にとっても綺麗にとれるし、人を撮るのがめっちゃ楽しくなった!\\nこう書き出してみると、どれも後半に買った物ばかりで、前半に買った物を見落としている気がしてならない…。'"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"texts = [meta['Title'] + \"\\n\" + text for (text, meta) in parsed_mds]\n",
"\n",
"texts[0]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 3.56 s, sys: 156 ms, total: 3.72 s\nWall time: 3.71 s\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"TfidfVectorizer(preprocessor=<function convert_noun_only at 0x7fd4b1a740d0>)"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"%%time\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"vectorizer = TfidfVectorizer(preprocessor=convert_noun_only)\n",
"vectorizer.fit(texts)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"32945\n[('2014', 1071), ('AQUOS', 2639), ('LC', 6081), ('60', 1898), ('XL', 9923), ('10', 156), ('テレビ', 23351), ('時間', 29404), ('こと', 19963), ('なし', 20314)]\n[4.06523007 4.88758898 5.95229972 7.56173763 5.95229972 6.17544327\n 7.56173763 7.56173763 7.56173763 7.56173763]\n"
]
}
],
"source": [
"print(len(vectorizer.vocabulary_.items()))\n",
"print(list(vectorizer.vocabulary_.items())[:10])\n",
"print(vectorizer.idf_[:10])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 3.28 s, sys: 2.61 ms, total: 3.28 s\nWall time: 3.28 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"vect_texts = vectorizer.transform(texts)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Firebase Cloud Functions でのメールフォーム用 function を作る\nいわゆるメールフォーム機能がほしい。基本無料で使えて、SPAMは弾いて、自分にメールが届けばok、という単純な要件なので、Cloud Fuctions for Firebase で作った。TypeScriptでの実装例はこんな感じ。\n\nhttps://gist.github.com/hotchpotch/4eaec5982be1466c3932e07d3bbcae02\n\nCloud Functions で各種値を取得するために、functions:config:set で値を入れ、適当に onCallかHTTP経由での関数呼び出しにマッピングすれば OK。\nnpx firebase functions:config:set \\\n gmail.user=\"\" \\\n gmail.client-id=\"\" \\\n gmail.client-secret=\"\" \\\n gmail.refresh-token=\"\" \\\n recaptcha.v3secret=\"\"\nsmpt は Colud Functions で叩ける API 群にはないので、Gmail からメールを送れる OAuth2 の cliendId / clientSecret / refreshToken を取得する。これがややこしくて面倒なのだけど、node.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送る の方法で取得すれば OK。なおnode.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送るにのっているserver.jsのサンプルコードは私の環境ではうまく動かず、nodemailer のドキュメント通りにやったらうまく動いた。\nメール送信APIだけだとspamロボットが叩きまくるので、reCAPTCHA v3を使って、人かどうかの判定も入れている。なおクライアントサイド(Webブラウザ)側ではreact-google-recaptcha-v3を使ってる。\n\n以前、このサイトにおたよりフォームを作った時には、いわゆるメールフォーム機能を提供しているサービスを比較検証して作ったのだけど、それよりもとっとと自分で Cloud Functions で作ったほうが簡単かつ短時間で終わったのだった。\nFirebase Extensionsが一般の開発者も公開できるようになり、かつ Cloud Fucntions とうまくマッピングできれば、各種設定だけ入力して自分のプロダクトにデプロイできるようになり、たとえば今回のようなメールフォームのユースケースを満たす単機能 function は自ら実装することなく利用できるようになるだろうから、今後拡充していくと嬉しいなぁ。\n(なお今でも extensions として、firestore-send-emailがあるけど、これは firestore のドキュメントをトリガーに smtp でメールを送るものなので、用途が異なる。)\n--------------------\n親族間で写真を共有する\n実家に帰っていたので、孫の写真を親族間で共有しようと google+ を設定したけどいまいち…。google+ のコミニュティ機能で親族のプライベートコミュニティを作ったんだけど、PC からしか使えないし、友人グラフを構築しないと招待状を送れない(正確には送れるけど、受け取る側が友人になってないと表示されない)し、メインのタイムラインにノイズが多すぎる(有名人のタイムラインや、僕が入っているパブリックコミュニティが表示される)し、一苦労だった。\ngoogle+ を選んだのは、現時点で対抗馬となる facebook はそもそもみんなやってないし、家族間がプライベートで写真共有できるようなサービスは沢山あるんだけど、数年後残ってるかどうか、というのもあって google+ を選んだんだけど、なかなか厳しかった。\nまた従兄弟みんな iPhone は持ってるけど gmail 使ってない(友人とのやりとりは LINE、メールはキャリアメールだけでいまはほぼ使ってない)とか、Android 持ってる別の従兄弟も Yahoo! メール使ってて gmail は使ってなかったとか、いろいろ興味深かった。そろそろメール滅びそう。\ngoogle+ の悪いところばっかり書いてたけど、みんなスマフォで撮った写真すぐ共有できて便利だし、どのデバイスからも chromecast でテレビに即写真を写せるのが大変便利だった。chromecast なんてニッチな物は一般家庭にはあんまりなさそうだけど、父親がそういうの好きなのであって便利だった。\n"
]
}
],
"source": [
"from sklearn.metrics.pairwise import cosine_similarity\r\n",
"\r\n",
"n = 1\r\n",
"top = cosine_similarity(vect_texts[n], vect_texts).argsort()\r\n",
"top = top[0][::-1][1]\r\n",
"print(texts[top])\r\n",
"print('--------------------')\r\n",
"print(texts[n])\r\n",
"\r\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from sklearn.metrics.pairwise import cosine_similarity\n",
"\n",
"def similar_top_k(vect_text, vect_texts, k=3):\n",
" scores = cosine_similarity(vect_text, vect_texts)[0]\n",
" sort_indexes = scores.argsort()[::-1]\n",
" top_indexes = sort_indexes[:1+k]\n",
" top_scores = scores[top_indexes]\n",
" if abs(top_scores[0] - 1.0) < 0.01:\n",
" # top-1 == texts, delete top\n",
" top_scores = np.delete(top_scores, 0)\n",
" top_indexes = np.delete(top_indexes, 0)\n",
" else:\n",
" top_scores = np.delete(top_scores, k)\n",
" top_indexes = np.delete(top_indexes, k)\n",
" return zip(top_scores, top_indexes)\n",
"\n",
"def print_similar_results(document_index, parsed_mds, vect_texts, k=3):\n",
" print(parsed_mds[document_index][1], \"\\n\")\n",
" print(parsed_mds[document_index][0], \"\\n\")\n",
" for (score, index) in similar_top_k(vect_texts[document_index], vect_texts, k=5):\n",
" print('**', score, index)\n",
" print(parsed_mds[index][1], \"\\n\")\n",
" print(parsed_mds[index][0], \"\\n\")\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Draft': False, 'Title': '親族間で写真を共有する', 'Date': '2015-01-03T22:13:05+09:00', 'Image': None, 'Slug': '2015/01/03/221305', 'Tags': ['life-and-consume']} \n\n実家に帰っていたので、孫の写真を親族間で共有しようと google+ を設定したけどいまいち…。google+ のコミニュティ機能で親族のプライベートコミュニティを作ったんだけど、PC からしか使えないし、友人グラフを構築しないと招待状を送れない(正確には送れるけど、受け取る側が友人になってないと表示されない)し、メインのタイムラインにノイズが多すぎる(有名人のタイムラインや、僕が入っているパブリックコミュニティが表示される)し、一苦労だった。\ngoogle+ を選んだのは、現時点で対抗馬となる facebook はそもそもみんなやってないし、家族間がプライベートで写真共有できるようなサービスは沢山あるんだけど、数年後残ってるかどうか、というのもあって google+ を選んだんだけど、なかなか厳しかった。\nまた従兄弟みんな iPhone は持ってるけど gmail 使ってない(友人とのやりとりは LINE、メールはキャリアメールだけでいまはほぼ使ってない)とか、Android 持ってる別の従兄弟も Yahoo! メール使ってて gmail は使ってなかったとか、いろいろ興味深かった。そろそろメール滅びそう。\ngoogle+ の悪いところばっかり書いてたけど、みんなスマフォで撮った写真すぐ共有できて便利だし、どのデバイスからも chromecast でテレビに即写真を写せるのが大変便利だった。chromecast なんてニッチな物は一般家庭にはあんまりなさそうだけど、父親がそういうの好きなのであって便利だった。 \n\n** 0.1872032708339952 805\n{'Title': 'Firebase Cloud Functions でのメールフォーム用 function を作る', 'Date': datetime.datetime(2020, 12, 22, 11, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\nいわゆるメールフォーム機能がほしい。基本無料で使えて、SPAMは弾いて、自分にメールが届けばok、という単純な要件なので、Cloud Fuctions for Firebase で作った。TypeScriptでの実装例はこんな感じ。\n\nhttps://gist.github.com/hotchpotch/4eaec5982be1466c3932e07d3bbcae02\n\nCloud Functions で各種値を取得するために、functions:config:set で値を入れ、適当に onCallかHTTP経由での関数呼び出しにマッピングすれば OK。\nnpx firebase functions:config:set \\\n gmail.user=\"\" \\\n gmail.client-id=\"\" \\\n gmail.client-secret=\"\" \\\n gmail.refresh-token=\"\" \\\n recaptcha.v3secret=\"\"\nsmpt は Colud Functions で叩ける API 群にはないので、Gmail からメールを送れる OAuth2 の cliendId / clientSecret / refreshToken を取得する。これがややこしくて面倒なのだけど、node.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送る の方法で取得すれば OK。なおnode.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送るにのっているserver.jsのサンプルコードは私の環境ではうまく動かず、nodemailer のドキュメント通りにやったらうまく動いた。\nメール送信APIだけだとspamロボットが叩きまくるので、reCAPTCHA v3を使って、人かどうかの判定も入れている。なおクライアントサイド(Webブラウザ)側ではreact-google-recaptcha-v3を使ってる。\n\n以前、このサイトにおたよりフォームを作った時には、いわゆるメールフォーム機能を提供しているサービスを比較検証して作ったのだけど、それよりもとっとと自分で Cloud Functions で作ったほうが簡単かつ短時間で終わったのだった。\nFirebase Extensionsが一般の開発者も公開できるようになり、かつ Cloud Fucntions とうまくマッピングできれば、各種設定だけ入力して自分のプロダクトにデプロイできるようになり、たとえば今回のようなメールフォームのユースケースを満たす単機能 function は自ら実装することなく利用できるようになるだろうから、今後拡充していくと嬉しいなぁ。\n(なお今でも extensions として、firestore-send-emailがあるけど、これは firestore のドキュメントをトリガーに smtp でメールを送るものなので、用途が異なる。) \n\n** 0.14814469785404635 39\n{'Draft': False, 'Title': '2009-02-10', 'Date': '2009-02-10T00:00:00+09:00', 'Image': None, 'Slug': '2009/02/10-subtech', 'Tags': ['subtech']} \n\nvimperator の plugin 書くの楽しい\nグリモンはそんな書いてなかったけど、vimp の plugin は書くのが楽しくてついつい作ってしまう。chrome 権限で書けるため全然制約が無い、というのも大きいんだけど、なにより手軽に動かせるのがよいなぁ。簡単に vimp の機能として実装できちゃう。開発も auto_source.js があるため、さくさく作れちゃう。うーん楽しい。\nvimperator で、:gsearch で google の検索結果を直接表示プラグイン\n\nhttp://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/google-search.js\n\nvimp 2.0 では :open google 単語 で良しなにサジェストしてくれるんだけど、サジェストのとび先はあくまで google で、もっとダイレクトに飛びたいなーと思ったので作った。\n:gsearch のと[tab]\nとかすると↓みたいになる。最近 google についた「もしかして」の上位二件表示がとても便利で、それっぽい単語入れて補完するだけでオフィシャルサイトや wikipedia が引っかかって便利。\n\nmulti_requester.js を使えば xpath などをちょろりと書けば同等のことができる、というのをプラグインを書いてから知った、という・・・。ただ URL の一部書き換えや favicon 表示などをやってるので、multi_requester を使っても completer の上書きが必要になってしまうので、まあいいかなぁ。 \n\n** 0.13284037170642096 325\n{'Draft': False, 'Title': 'カメラを買った', 'Date': '2018-12-10T19:52:54+09:00', 'Image': None, 'Slug': '2018/12/10/195254', 'Tags': ['life-and-consume']} \n\n最近、写真は見るデバイスと撮るデバイスに最適化されていって、つまるところ写真のほとんどはスマートフォン上のアプリ、Instagram, Twitter, LINE, Weixin, Facebook といった物へアップロードされ閲覧されている。\nラップトップの大きい画面で写真を見ることはとても少なくなり、またPCブラウザで上記サービスを利用した際は、基本的にスマートフォンの画像の荒が解らない程度のサムネイルサイズで表示される。\nスマートフォンは iPhone 7+から始まった、複数レンズを搭載することにより今までは難しいとされていたボケを表現するに始まり、昨今は Pixel3に代表されるようなディープラーニングによる、シングルレンズでも画像解析を行い、つまりニンゲンが感じる美しいボケはこんな感じでしょ、暗いけどきっとこんな味付けの高コントラストな夜景がみたいんだよね、と良い感じ、に表現してくれる。後数年、数十年たつと粗い画像でもよりシャープな画像(復元ではなく、機械がつまりシャープな画像ってこんな感じでしょ、と加工してくれる。ただニンゲンが見たら、本物かどうか区別はつかない)になるだろうし、更なる進化を遂げることは目に見えている。とても素敵なユートピア。\nという私もご多分に漏れず、P20Proで写真を撮りまくっている日々で、これはこれで手軽でとても楽しい物だけど、そういえば最近めっきりカメラ使ってなかったな、というわけで a7s を引っ張り出してきて撮っていたら(そしてうっかり物欲が出て a7iii と新しいレンズを買った…)、これはこれで楽しい!!!11のだけど、写真をスマフォ最適化サービス以外のどこかにアップロードする場所が欲しい!というわけで medium を再開してみるのであった。\n銀座 \n\n** 0.11745985187415053 231\n{'Title': '写真一覧ページを作る / 2021年1月26日', 'Date': datetime.datetime(2021, 1, 26, 22, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n\n晴れのち曇りのち雨。な予報だったので午前中に散歩。\n\n今までも作っては居たけど、ちゃんと手を入れていなかった写真一覧ページをそれなりにちゃんとした。すべての写真の120pxサムネイルが出る(画像はloading=\"lazy\"属性で、ビューポートに入るまではロードしない遅延ロード)のでそれなりに重いのだけど、一度に見渡したくてこのような表示にしてる。日付が主張しない程度に出てるのが、昔の写真を見るときに、いつろごろのか解って気に入っている。\nと deploy して念の為スマフォで確認すると、Android 環境だとブラウザが止まる…。環境によってまちまちで、Android Chrome 最新環境でも、エミュレータや P30 lite 環境では問題なく動き、Pixel 3 や Galaxy S20 だと止まる。うーん、4,000枚ほどの画像なので処理的には大した事なさそうなのだけど、何かを踏んでいるっぽいなぁ。画像が1500枚ぐらいからブラウザが止まりだす、あたりの調査で時間切れ。後で直そう。\n\n趣味(Webサイトづくり)に時間を使うと、趣味(写真)の時間がなくなるなぁ、当たり前なのだけど。 \n\n** 0.11472390318466283 849\n{'Title': 'Ther Color of Jazz を見返す', 'Date': datetime.datetime(2020, 11, 3, 12, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\nふと、自分が好きな写真って何なんだろう、と思いPete Turner の The Color of Jazz を見返す。この写真集は CTI レコードから出していたアルバムにはまった時、「ジャケットもすごく良い」と思い、CTIのジャケ写のフォトグラファーであるPete Turnerの写真集で、写真家の写真集としては人生で初めて買ったものだ。 CTIのジャケットはもとより、それ以外の写真もいくつも入っていて、LP見開きから、オリジナルの写真まで、144ページに渡り載っている。\nいちばん有名なジャケットは、たぶんJobimのWave、好きなジャケットはWesのRoad Song、印象深かかったのはTurrentineのSugarだなぁ、とか懐かしく見返す。\n\n写真集はLPぐらいの大きさの正方形で、LPのジャケットを開いたまんまのページもいくつもある。そして今更ながらに気づいたのだけど、LPを開いた時の 1:2 という大きさに合わせてデザインされたものばかりで、CDを聴いていたときは表紙の1:1のところばかり印象に残っていて、見開きの写真含めてのデザインというのを見落としていた。Milt JacksonのSunflowerなんか何度も見たはずなのに、見開きの右半分の記憶しか無くてもったいない。\n\n写真集の表紙になってるJoe Farrell の Canned Funk なんかは見開きだとぐっと人っぽく見えて、目玉も気持ち悪さからちょっと愛らしく変わる。\n写真表現としては、多重露光、高コントラスト、色飽和、逆光、高感度フィルムによる粒子、赤もしくは青の単色現像、等々が使われていて、現代でよく見る解像度が高い写真はほとんどない。大体の写真が、なにかの色を主体に表現しいることが多く、どれもPete Turnerぽさが出ていて、コントラスト、色合いが美しくて好きだなーというのを再認識した。\n\nちなみに secon.dev のメインタイトルである『A Day in the Life』は Wes Montgomery の A Day in the Life から、ではなく、そのオリジナルの The Beatles の A Day in the Life から。 \n\n"
]
}
],
"source": [
"print_similar_results(1, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Title': 'きれいな朝焼け・ピンぼけが気にならない・らーめん再遊記(2)を読んで感無量 / 2020年12月25日', 'Date': datetime.datetime(2020, 12, 25, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝ジョギング散歩40分。曇り空だったのだけど、東の地平だけ雲がかっておらず、きれいなオレンジの朝焼けの朝。晴天では見れない景色で、しばし海沿いに座って薄明を見ていた。とても良い空・海の色だった。この朝焼けはRAW現像でほんのちょっと黒レベルを下げる程度の調整で、ほぼ無調整。本当にこんな色だった。\n\n昨日はクリスマスイブだったからか、普段は点灯していない豪華客船が夜明け前からライトアップしていた。\n\n最近GR3の一番利用しているユーザモードでは、F2.8でスナップ撮影距離5mにしている(GR3にはピント距離を固定するスナップ撮影モードというのがある)。以前はスナップ撮影距離2.5mにして1.5mぐらいからパンフォーカスになるF8前後にしてたのだけど、夜明け前後の暗い写真をよく撮るようになったので変更。\n最近はa7Cでマニュアルフォーカスのレンズやオールドレンズを使いだして、するとぶれている(手ブレというよりピンぼけ)写真を撮ることが増えた。オールドレンズはたいてい絞り開放で撮っているし、最近のマニュアルレンズはF1.4と大口径のものが多し、そんななかで開放近く撮ると、ピンぼけが発生しやすい。\nマニュアルフォーカスで撮る以前は、ちゃんとAFでピントを合わす、というのを儀式的に行っていたけど、マニュアルフォーカスにしてからは完全にピントは合ってないけど大体合ってるでしょ、とパンフォーカスでなくとも場合によっては全くピント合わせせずにシャッターを切る様になってきた。ピント合わせよりもシャッターチャンス優先。それで撮っていると、もちろん拡大やクロップするとピンぼけがバレバレなのだけど、拡大しない環境やL判ぐらいの環境ではピンぼけがわからない写り。そのため、ちょっとしたピンぼけが気にならなくなってくる。\nというわけで、GR3でF2.8でパンフォーカスで撮るとピントが合う範囲が狭く、それはそれはピンぼけするのだけど、もうピンぼけが以前ほど気にならなくなって、むしろシャッターチャンスが増えたり、明るいことによるメリット(手ブレ削減や低感度ISO)のほうを享受できるようになってきた気がする。\nクロップを活かしたい高画素数カメラや、シャープな写りをする近代的レンズだとまた別なのかもしれないけど、ピンぼけはピンぼけで発生してもいたずらに嫌う必要はない、と思えてきた。\nなお2枚目の船の写真はピンぼけではなく手ブレである…。\n\nらーめん再遊記(2)を読んだ。いやーーーー面白すぎる。らーめん再遊記(1)も面白かったが、(2)はさらに面白い。この漫画はラーメン発見伝(全26巻)、らーめん才遊記(全11巻)に続くシリーズ物なのだけど、シリーズを通して嫌われ愛されキャラである本作の主人公、ラーメンハゲの芹沢達也のために発見伝、才遊記があったと言っても過言ではないであろう。発見伝では主人公が到底勝てない(憧れもある)ライバルとして描かれ、才遊記では主人公がふと就職することになった会社の社長として描かれ、そして本作では主人公として描かれる。感無量。いいヤツじゃなくて基本嫌なヤツだけどどこか憎めない、というのも愛着が持てて良いのだよなぁ。\n昭和、平成、ラーメン、とハイコンテキストな物語で、この漫画を理解できる日本人に生まれてよかった、と心底思える作品である。続きも楽しみだ。普段漫画の感想を日記に書かないのだけど、思わず書いてしまうぐらい衝撃的な良さだった。\nなお、もし読む人が居たら、シリーズ最初のラーメン発見伝から読むことをおすすめしたい。 \n\n** 0.15676397813295923 804\n{'Title': 'Industar-10 50mm F3.5 レビュー', 'Date': datetime.datetime(2020, 12, 27, 18, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': ['Industar-10 50mm F3.5']} \n\nロシア製レンズの、Industar-10 50mm F3.5 を買った。送料を除くと eBay で 29$、たまたまなのか、ウクライナからたった11日で届いた。外見がライカのレンズ Elmar 50/3.5 のコピーと言われる、ライカLスクリューマウントの沈胴式のレンズだ。沈胴式レンズ、外観がTHEオールドレンズという感じで、一度は使ってみたかったのだ。\nなお重さはキャップなどを除いたレンズのみ実測111.5g(あまり重さについての記述を見かけないので記載する)。\n\nオールドレンズは個体の当たり外れがあるというというけど、このレンズ個体はヘリコイドが軽い(もうちょっとグリスがあって丁度よい摩擦があると良いけど、ヘリコイド用グリスは高い...)ぐらいでほかは問題なく使えている。外観も年代を考えるとオーバーホールして磨いたんじゃ、というぐらいの綺麗さだった。\n沈胴式レンズはその名の通り、収納時は沈胴してるのでレンズ筒が後ろにせり出す。これがフランジバックが短いミラーレスだとイメージセンサーにあたってしまう可能性があるのだけど、少なくとも手持ちの Industar-10 + a7C ではわずかに隙間ができてセンサーに当たらず収納ができた。同時に Industar-22 も購入したのだけど、ざっくりとライカLスクリューマウントからせり出した長さを図ると、Industar-10が18mm, Industar-22が21mmほどでIndustar-10のほうが短い。\n\n【Leica】検証!α7 で Elmar M50mmは沈胴できる!? の記事によると、a7では20mmでぶつかった、ということなので、18mmはギリギリのよう。なおぶつかると解っている場合、レンズ筒にセロファンテープなどをつけて厚みを付け、ぶつからないようにするテクニックなどあるみたい。イメージセンサに強くぶつかったらセンサーが使い物にならなくなるだろうからなぁ…。\nまた、Industar-10/22/50 には無限遠ロック機構があるのだけど、これがマウントアダプターと干渉する、ということがどういうことなのか理解する。ロック解除のためにボタンを押し込む必要があるのだけど、これがアダプターにぶつかってはずれないのだ。\n\n買ったものでは Industar-10は干渉し、22は問題ない(使っているマウントアダプターのKF-LM-5075はロックの干渉を避けるため、アダプタ外周の1/3ぐらいに凹みがあって、22のほうはそこにうまくロックが当たる)。ただ、オーバーインフのため、無限遠ロックを外した状態でも無限遠にピントが合うので大きな問題はなく、この状態で使っている。ヤスリで削ったりしてロックをなくす方法もあるみたいだ。\n\nさっそく Industar-10 をつけて散歩をする。ほとんど開放の F3.5 で撮っていて、ちょっと、いささか、だいぶピンぼけしていたので昼間だしもっと絞ればよかった、とPCで見返して思う。だいたいピンぼけしてる。\nTHEみなとみらい的風景。\n\n青が階調いじったんじゃ、というぐらいちょっと偽色っぽい青々した写りをすることも。これはRAWからなにもいじらず現像。\n\nレンズへ斜めの光源が入ると、斜めの虹(フレア)が出現する。\n\n\n逆光だ!フレアだ!ゴーストだ!と思うシーンでもあんまりフレア・ゴーストが出ない。\n\n好みかなーと思う写真は大抵空が写っている写真だった。空の色が好み。まぁ撮っている写真の大半に空が入っているから、という事もあるのだけど…。\n\n\n\n\n\n\n\n\n最短焦点距離は1mなのだけど、マウントアダプターヘリコイドせり出しで4mm伸ばすと、最短撮影距離は50cm弱ぐらいかな。その距離で撮影。\n\n\n丸ボケはF3.5なのであまり出ない。焦点距離1mだとこれぐらい。\n\n焦点距離50cmぐらいでこれぐらい。\n\n\n沈胴式のIndustar(というか大抵の大量生産されたロシアンレンズ)は安く手に入り、遊びでも買えてしまうお値段なので、一つ持っておくと楽しいかもしれない。というか大抵の安価なオールドレンズは一つ持っておくと楽しいかもしれない、と言えてしまう。 \n\n** 0.150075201469491 872\n{'Title': 'Voigtlander NOKTON classic 35mm F1.4 II SCが届いた・旅行で動画をもっと撮るべきだった / 2020年11月25日', 'Date': datetime.datetime(2020, 11, 25, 20, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': ['Voigtlander NOKTON classic 35mm F1.4 II SC VM']} \n\n新しいレンズのVoigtlander NOKTON classic 35mm F1.4 II SC VMが届き、さっそくレンズを付け近所を散歩する。オールドレンズの味わいの作りだけあって、2019年のレンズなのに開放からピントが合ってもボケていて味がある。また SC はよりコントラストが淡く、フレアやゴーストが出やすくて面白い。フルサイズでF1.4の明るさのレンズは持っていなかったので、こちらも新鮮。\nライカMマウント用のレンズで、ライカMがレンジファインダー機なため、作りとして最短撮影距離が長くなる(35mmだと70cm)のだけど、マウントアダプターのヘリコイドを伸縮させることでミラーレスではさらに接写ができる。同時に手に入れたVM-E Close Focus Adapterではイメージセンサーから最大4mm離せるようになる。この4mmで最短撮影距離を70cm→28.7cmと短くすることができ、めちゃくちゃ接写、とまではいかないまでも、まぁまぁ接写ができるようになる。\nソニーE用には、Voigtlander NOKTON classic 35mm F1.4 E-mountがあり、こちらは最初から最短撮影距離が30cmで、MFのフォーカシングが2段でない(アダプタをつけると二つのフォーカスリングが発生する)ことや、フォーカスリングを回した時にピント拡大できること、Exifデータへのレンズ情報の反映もでき、重さもアダプターを考慮するとソニーEのほうが若干軽いと良いことがいくつもあるのだけど、今後もライカMマウントのレンズを使いたくなったり(いつか Summilux 35mmが何故か手元にあったりするかもしれないし)、SCのよりオールド風に写る描画だったりを考えてVMマウントの方を選んだ。というか外観がVMのレンズのほうがかっこよい!!1\n\n\n\nはー楽しい散歩だった。\n\nGoogle Photos の整理をしていたら、世界旅行中の動画が数十個見つかる。大抵は誰かに送るためにスマフォで撮った短い動画なのだけど、写真とは違った見え方・情報量で、強く記憶が呼び覚まされる。\n旅行中は写真の方に気を取られてしてしまっていたのだけど、もっと気軽にスマフォで動画を撮るべきだったなぁ。次に行くときはもっと動画を撮ろう。 \n\n** 0.14702934364787748 853\n{'Title': '朝ジョギングとGR III / 2020年11月16日', 'Date': datetime.datetime(2020, 11, 16, 19, 45, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝のジョギング、なにかカメラ持っていってるの?という質問をもらった。今までは Galaxy S20 を持っていっていたのだけど、運動量計測は時計で行ってるし、とりわけスマフォは必要なく、そういえばポケットに入るカメラと言えば GR III があったぞ、と海外旅行後ぜんぜん使ってなかったGR3を引っ張り出して、ジョギングに持っていった。\n結果、夜明けの撮影が楽しすぎて、ジョギングというよりはちょっと走って撮影の繰り返しでジョギング的には失敗、楽しさ的には満足。SDカードがなかったので、GR本体搭載の2GBのメモリに記録していたのだけど、RAW+JPEGでも60枚ぐらい撮れ、ちょうど撮りきって帰宅。というわけで、本日の朝ジョギング、というよりは朝散歩を45分。4kmほどの距離は移動したので良しとする…。\n\n\n\nGR3はポケットから取り出す時に電源を入れて、構えたときにはすぐ撮れるし、スナップ前提だとパンフォーカスなので焦点距離固定で撮る(ユーザモードに割り当ててる)からAFせずに撮れる、クロップがボタン一発ででき28/35/50画角にすぐに変えられる、などなどスナップシューター用のニッチ需要ではコレしか無いカメラで存在感がある。いまだにコンデジの中では売れてるみたいだしね。\n困った点は前にも書いたのだけど、リングキャップがすぐとれること(あまりにもとれるので、接着剤で固定した…)、AF性能がダメダメなところ(AF使わない事がほとんどなので)なんだけど、それを差っ引いても良いコンデジで、ポケットから気軽にすぐ撮れる、というのは代えがたい。\nと、久しぶりにGR3をググってみたら、電源オフから再生ボタン(▶)長押しで、再生モードで電源入るの!?知らなかった。レンズがせせり出ずに写真だけ確認できて便利だわ。そしてRX100(IV)も同様な機能があった、しらなんだ…。\n\n\n朝食はコブサラダ、昼食はこないだ釣ったサバの塩漬けを焼いた、つまるところ塩サバ焼き。大きいサバだったので、そのへんでサビキで釣ったものより脂がのっていて美味しい。最近はだいぶ太ってしまったので、低糖質な食事を作ってくれている妻偉い。\n\n夕方、自転車でぶらり山下公園へ。大概電動バイクのベイバイクを使ってしまっていた(ポートで乗り捨てたいから)のだけど、今回は往復予定だったので普通に自転車。ちょっとした運動になるね。雲ひとつない青空だったのだけど、空は大気汚染の影響か、塵っぽい感じだった。\n大気汚染と言うと、一昨年の冬はたいてい上海で過ごしていたのだけど、毎日晴れでも大気汚染で曇り空な感じだったなぁ。去年の冬は東南アジア、ネパール、インドで、どこも大気汚染がひどく、とりわけニューデリーやカトマンズはそこらじゅう霧がかかった感じを思い出す。それに比べると日本の空気は圧倒的に綺麗だ、と大気汚染にまみれた頃は思っていたのだけど、日本に戻るとその空気の綺麗さのありがたさをあっという間に忘れてしまっていた。\n\n久しぶりにサウナによって、日が完全に落ちてから帰る。もう冬のイルミネーションの季節だ。\n\nおたより返信コーナー\n\nおたよりシステムいいですね! ラクサといえば、茅ヶ崎にある「いただきます食堂」というところのがとても美味しいので、もし行く機会があったら是非!\nあー食べたい!!!🤤🤤 (こっちでまだおいしいラクサをみつけられていない\n--typester\n\nおおー、いただきます食堂、ラクサ専門店なんですね!鎌倉行った時に、立ち寄れそうなら寄ってみようと思います、ラクサ情報どもです~~。オレゴンでも美味しい店が見つかると良いですね。\nみなさんもおたよりお気軽にお送り下さい。フィードリーダーからは見えないですが、エントリー下部から送れるよ! \n\n** 0.13772045185140191 812\n{'Title': 'ライカ10M-Pを買わなかった / 2020年12月14日', 'Date': datetime.datetime(2020, 12, 14, 18, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': ['Voigtlander NOKTON Vintage Line 50mm F1.5 Aspherical II VM SC']} \n\n新宿駅横の地下連絡通路。外国人(彼も欧米人であろう風貌だった)はカメラ向けるとピースする人が多く平和なふいんき。\n\n今日も夜明け前から山下公園に行き、海沿いを散歩をする。紫色になるトワイライトな海を見るのが好きなんだよなぁ。カラス同士ががくちばしや脚で威嚇でなく戦っていて、本気の喧嘩を見る。50mmじゃ撮れない。\n\nなおこの写真もトワイライト時ではない。\n\nライカM型欲しい熱が高まってしまったので、実機を触りに新宿へ。\n\n\n\n新宿のざわめく喧騒を通り、ライカ10M-Pを触れるお店で一通り使ってみると、なるほどレンジファインダーの機能は面白いのだけど「やばい!欲しい!」みたいになることはなく、購入には至らず。まだa7Cで自分は十分楽しめそうなので、またライカM型熱が高まったら検討しよう。\n\nその後、北村写真機店に行き中古レンズやオールドレンズをいろいろつけさせてもらう。こないだ行ったときよりレンズ知識が広まって楽しいぞ。VoigtlanderのAPO-LANTHARの50mm F2 や 65mm F2 MACRO などを触り、今使っているマニュアルレンズとは違った近代的な光学性能レンズも良いなーとか思ったり、Summilux 35mm F1.4 2ndの開放はソフト、F2.8ぐらいまで絞るとシャープ、感を味わってみたり。\nまた TECHART のライカMレンズをSony-E でオートフォーカスできる LM-EA7 は、最短撮影距離も短くできるし、AFも思ったよりもできが良くて(他のTECHARTのAFアダプタを昔買ったのだけどイマイチだったので期待してなかった)欲しくなったり。\n等々、レンズを触ってみたら色々と欲が満たされて何も買わず満足して帰ってきた。いつか北村写真機店にお布施したい。 \n\n** 0.13258783730747445 816\n{'Title': 'M42マウント(スクリューマウント)で最短撮影距離を縮める', 'Date': datetime.datetime(2020, 12, 17, 9, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': ['SMC Takumar 28mm F3.5']} \n\n最近でライカMマウントのレンズの最短焦点距離を close focus adapter を使うことで、ミラーレスで短く(より寄れる)できて便利に使っている。仕組み的には単純で、レンズとイメージセンサとの距離を広げることで焦点が変わり、最短撮影距離が短くなる。たった4mmレンズとセンサーの距離を開けるだけでも、とりわけ広角レンズに置いてはめちゃ寄れるようになる。\nMマウントに関わらず close focus をうたっているマウントアダプターでは、ヘリコイドを回すことでレンズが前にせり出す仕組みで実現しているのだけど、よくよく考えるとM42(や、たぶんM39/L39などでも)などのスクリューマウントレンズを、きっちりと最後まで回してはめるのではなく、ゆるく装着すればレンズがせり出した状態になり、きちんとしたマウントアダプターを用いなくてもほぼ同等の環境を作ることができる。\n\nこんな感じで隙間があき、3mm強ぐらいレンズがせり出した状態で無理やり使うことができる。実際にどれぐらい寄れるようになるか、というと例えば焦点距離28mmのレンズ(SMC Takumar 28mm F3.5)では、手前のサボテンにピントを合う状態でこれぐらい寄れるようになる。\n\n\nもちろん、隙間ができてホコリが入りやすくなったり、僅かな光が内側に入ってしまう可能性が増えたり、はずみでレンズが落ちてしまったり、光が直線にならなかったり(ゆるみのため、角度がわずかに傾く)、意図していないであろう焦点距離なので光学的にも性能が落ちたりするのだろうけど、室内でもうちょっと寄りたい、というときには便利なテクニックかもしれない。というか普通にカメラやってる人には常識的な話なのかもしれないが、自分は知らなかったのでメモがてら残しておく。 \n\n"
]
}
],
"source": [
"print_similar_results(806, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Draft': False, 'Title': '2020年8月29日', 'Date': '2020-08-29T20:10:33+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/f/firstlife/20200829/20200829200858.jpg', 'Slug': '2020/08/29/201033', 'Tags': ['life-and-consume']} \n\n朝、3:30にシャキっと目が覚める。サウナ効果に違いない。\nので釣りに行く。2時間ほど釣っていたけど、0匹…。\n周りの釣りおじさんがたと話すと、この場所は8月はめっきり釣れてないらしい。\n日の出(5時)の一時間ぐらい前から、緩やかにダークブルーの空が赤に変わっていく。日が昇る前のほうがオレンジが強い。\n海の色は青とオレンジできれい。今日は凪で波もなく、柔らかな海面。日が出る前のこの時間帯が一番好きな景色だ。\n\n\n新しいスマフォの Galaxy S20 が昨日届いたのでセットアップする。\n次に求めていたスマフォ、AndroidでDSDSでeSIMが使えて超広角カメラがあれば良い、のだけどなんとAndroidでこの要件を満たせるのが Galaxy S20(グローバル版・香港版はダメ)しかない、気がする。Pixel5 も噂ではこのスペックなのだけど。日本の S20 は DSDS でもないし eSIM も使えない悲しさよ。\n中国製品が主力の Android、中国は国策(たぶん)により eSIM が使えない(その代わり中国本土キャリアの国際ローミングは安価で色んな国のデータ通信が買える。めちゃ発達している)ため、eSIM 端末が無い。\nなお iPhone 11 はこの要件を満たしているけど Android でないので…\n\n\nスマフォ、今使ってる Pixel3 でとりわけ困ってない(USBの充電コネクタが接触不良なことぐらい)のだけど、仕事の実機検証で Galaxy S20 を使ったら 120Hz ディスプレイヌルヌルでいいじゃん、ほかもいろいろ良く出来ていて、久しぶりに新しいスマフォ欲しくなったぞ、ということで購入した。\nそういえば Pixel5 は SoC は Snapdragon 765G という噂なんだけど、SoC の速さは今日日ゲームとカメラにしか活かせない感がある。Google のフラグシップ機、画像処理は自前チップでやるのだろうから 765G でも良いのだろうなぁ。\n\n\nGalaxy S20 は Windows の同期アプリで Windows PC 上から Android を操作可能になったらしいので使ってみる。\n昔からある Android のスクリーンをストリーミングで流すタイプか。\nWindows のタスクバーに Android のアイコンを表示できるのは面白いね。ただのショートカットだけど。\nセットアップが捗るなぁ。ただ、当然だけど画面録画許可されてない画面、つまり殆どのパスワード入力画面などで画面が真っ黒になってしまって結局実機をいじる必要が多々あった。\n\n\n午後は Next.js を弄る。しんちょくわるいです。\n朝食は鴨ローストのトースト。マスタードとよく合う。\n夜はハンバーグと昨晩釣ったアジ刺し身サラダ。アジは一晩置いたほうがやはりうまい。 \n\n** 0.2299668452356861 306\n{'Draft': False, 'Title': 'Android 2.2 の Flash Player 10.1 beta', 'Date': '2010-05-24T00:00:00+09:00', 'Image': None, 'Slug': '2010/05/24-subtech', 'Tags': ['subtech']} \n\nAndroid 2.2 の Flash Player 10.1 beta\n使ってみた感想をつらつらと\n速度\n\nすごい遅いと思っていたらそうでもない\nAS3 (FP9) のベタな1000パーティクルの3D座標計算で30FPSぐらい\nこれ http://subtech.g.hatena.ne.jp/./secondlife/20080113/1200230344\n\n\nPV3D のFlashもそこそこみれる\nただニコニコ動画なんかの重いサイトでは実用速度とは云えない\nニコ動がAndroid用のFlashUI つくってくれればけっこみれそうだけど、そんな手間かけるならアプリ作るよね…\n\n\n\nインターフェイスの反応\n\n画面クリック\n反応がだいぶ鈍い\n\n\n画面ドラッグ\nこちらも鈍い。反応速度が大事なタップ系のゲームは無理なレベルかな\n\n\nFlash 上の textarea によるキー入力\nちゃんと Android のソフトウェアキーボードが立ち上がる!でも入力後の画面の再描画がおかしくなる気がする…\n\n\nハードウェアキーイベント\nあ、チェックするの忘れてた。とれるのかな。\n\n\n\nその他\n\nフルスクリーン\nふつうにつかえてびっくりする。一気にネイティブアプリっぽくなる\nFlash のフォトスライドショーしてみたけど十分実用的。ただPC向けの Flash で、スライドショーの画像のbmp持ち続けたままメモリ解放してなかったりすると Android の FP が死ぬ\n\n\n\n最初の Android FP 10.1 への期待値が低かったので、思った以上に使えたという感じでした。これ、モバゲーとかグリーとかFlashLite作ってる会社は、アプリ自体は用意するけど中では内部ブラウザ + Flash でってのが再利用できて、課金自体は自前(もしくは DoCoMo が冬あたりに用意するやつ)を使えば、ガラケーアプリ作りつつも Android 向けゲームも提供できるんじゃないかなー。\nAndroid 2.2 のブラウザから camera/加速度センサも JS でとれるようになったらしいし(未確認) ExternalInterface でちゃんと受け渡しできるなら、それ系利用した Flash ゲーも移植できるんじゃないかなー。\nとまぁ個人的にはさほど夢は広がらないんですが、今後 Adobe が CS で Android アプリをFlashでパッケージ作れるようになったりすると(たぶんやりますよね)、Flasher が既存の知識でいろいろできそうだなーとは思えました。まる。 \n\n** 0.22944651418837306 304\n{'Draft': False, 'Title': 'Chrome to Phone を Greasemonkey と Vimperator で利用できるようにする', 'Date': '2010-05-29T17:04:28+09:00', 'Image': None, 'Slug': '20100529/1275120268', 'Tags': ['2ndlife']} \n\n先日の公開された Android 2.2 ですが、この 2.2 で API から Google 経由で簡単に Push Notification Service を利用することができるようになりました。\n\nAndroid Cloud to Device Messaging Framework - Android — Google Developers\n\nアプリ開発者はこの API を使えば簡単に Web やその他 Android 以外のデバイスから起こしたアクションを Android に通知することができます。感覚としては5秒後にはもうすでにAndroid端末にpushされてる感じです。\nで、この API を作った Chrome to Phone という Google Chrome で見ているページをワンクリックで Android に通知して Android ブラウザで開いたり、GoogleMapでみれたり、電話をかけれたり*1するデモアプリが公開されてます。\n\nchrometophone - Google Chrome to Phone Extension - Google Project Hosting\nChrome-To-Androidエクステンション:これはスゴイ (TechCrunch の紹介記事)\n\nデモアプリだと思って甘く見てたんですが、かんたんに PC ブラウザ -> Android 連動が可能なため使い始めてみたら超絶便利でした。\nしかしながら現在のメインブラウザは Firefox なため、Firefox からも Chrome to Phone を使いたい!というか vimp から使いたい!と思ったので GreaseMonkey と Vimperator Plugin を作ってみました。\n\nユーザースクリプト\nhttp://gist.github.com/raw/418062/firefox_to_phone.user.js\n\n\nVimperator Plugin\nhttp://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/vimp_to_android_phone.js\n\n\n\nグリモンの方は入れるとユーザースクリプトコマンドに \"Firefox to Phone\" という項目が出るのでそれをクリックして送れます。vimp plugin のほうは :sp コマンドで引数なしだと見てるページの URL を、また引数に URL を入れるとその URL を Android に送れます。 もちろん Froyo な端末が必要なのと、Android に chrometophone-android.apk 入れないと動かないですよ。\nというわけで Firefox & Android 2.2 ユーザーの人は使ってみるといいんじゃないかなー、と思いました。\n*1:ユーザがブラウザの文字列選択範囲に電話番号があれば電話アプリが立ち上がる \n\n** 0.1929338488777653 231\n{'Title': '写真一覧ページを作る / 2021年1月26日', 'Date': datetime.datetime(2021, 1, 26, 22, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n\n晴れのち曇りのち雨。な予報だったので午前中に散歩。\n\n今までも作っては居たけど、ちゃんと手を入れていなかった写真一覧ページをそれなりにちゃんとした。すべての写真の120pxサムネイルが出る(画像はloading=\"lazy\"属性で、ビューポートに入るまではロードしない遅延ロード)のでそれなりに重いのだけど、一度に見渡したくてこのような表示にしてる。日付が主張しない程度に出てるのが、昔の写真を見るときに、いつろごろのか解って気に入っている。\nと deploy して念の為スマフォで確認すると、Android 環境だとブラウザが止まる…。環境によってまちまちで、Android Chrome 最新環境でも、エミュレータや P30 lite 環境では問題なく動き、Pixel 3 や Galaxy S20 だと止まる。うーん、4,000枚ほどの画像なので処理的には大した事なさそうなのだけど、何かを踏んでいるっぽいなぁ。画像が1500枚ぐらいからブラウザが止まりだす、あたりの調査で時間切れ。後で直そう。\n\n趣味(Webサイトづくり)に時間を使うと、趣味(写真)の時間がなくなるなぁ、当たり前なのだけど。 \n\n** 0.18395596640880132 315\n{'Draft': False, 'Title': 'はてなモノリス開発話', 'Date': '2010-04-05T19:36:36+09:00', 'Image': None, 'Slug': '20100405/1270463796', 'Tags': ['2ndlife']} \n\n本日、はてなモノリスという Android / iPhone3GS 向けの簡単にモノのバーコードをスキャンして投稿(Twitter にも同時投稿できます)というサービスを作りました。是非対応端末をお使いの方は利用してみてくださいね。概要だけきいてもうーん、という感じですが実際に使ってみると簡単にモノのバーコードが認識できお気楽に投稿できるのは楽しいです!\n\nhttp://mono.hatena.ne.jp/\n\n約一ヶ月ほど専念して開発したんですが、その話でも。\n開発の経緯\n最近僕ははてなブックマークのディレクターと、はてなの Android 開発周りを担当しています。とあるミーティングで今後 Android をどう展開していくか、という話を id:jkondo, id:naoya, id:cho45 と僕で行いました。Android の開発おもしろーい、と個人的に強く思ってることもあり Android 向けのサービスを2つ案出ししてミーティングに望んだんですが、おもしろさの決め手に欠けてどちらもいまいち。さあどうしようかー、と雑談混じりのブレストをしていたときにたまたま飲んでいたのがカゴメの野菜生活100で、\n\nid:secondlife「コレ(野菜生活)とか簡単にブックマークできたら面白いですよね」\nid:naoya 「モノに対してもブックマークしたい!」\nid:jkondo 「そこら中にバーコードあるやん、これでピっと」\nid:secondlife「Androidのバーコードリーダーで認識…、おお一瞬」\nみんな:「面白ろそう!」\nid:cho45「Android ならインテント発行すればすぐ作れそうですね。僕なら二日で余裕ッスよマジで(誇張表現)」\n\nという話になって、じゃあ面白そうだしプロトタイプを作ろう!という流れになり開発しました。\n\nで、実際に id:cho45 が二日には及ばなかったものの三日で Android のプロトタイプアプリとサーバサイドの簡易実装を、僕が JS を書いてデザイナーの id:nagayama が一日でデザインしてそれっぽいプロトタイプができあがったので見せたところ、これは面白くなりそうとのことで約一ヶ月ちょっとの専念する時間を貰いサービスの開発を始めました。\n\nプロトタイプの「モノりす」\n開発一ヶ月\nそんなに開発時間もないので、アプリはほぼバーコードスキャンと投稿に特化した実装としました。iPhone と Android で別々にコンテンツ表示のビューこみの実装している時間もないですし、AppStore にはリリース前に余裕もってレビュー申請*1をしないといけません。\n幸い、iPhone OS も Android もブラウザが WebKit なので、ほぼ同じ JS, CSS が利用できるため、完全にビューはサーバ任せにしています。WebKit に特化した JS や CSS3 が利用できるために開発自体はだいぶ楽になりました。\nまた、サーバ -> アプリ間のやりとりですが、これは独自スキーム mono:// を使ってやりとりを行ってます。Android アプリも iPhone アプリも URI にフックして起動が可能なため、たとえばスマートフォンで見た画面右上の『スキャン』を押すと、mono://scan という URI が呼ばれてアプリのスキャン画面が立ち上がるようになってます。\n\n右上のが mono スキームによるスキャンボタン\nそんなわけで開発を進め、 id:r_kurain が iPhone アプリを作り(iPhone アプリ作り始めて1ヶ月もしないのに色々調べてくれて助かりました!)、id:cho45 が Android アプリとメインのプログラミングを担当し(すごいスピードでテスト込みの実装してくれてありがとう)、id:marqs がサーバ周りの手配をし(毎度急なサーバ手配や設定どうも!) id:nagayama がはてなブックマーク周りのデザインもやりつつモノリスのデザインも手がけ(今度焼き肉奢ります)、id:motemen がメダルシステムの汎用的な実装((コードネーム:実績(トロフィーじゃないよ)))を行い(これが終わったらエクボ(xboxのこと)で対戦しよう)、id:aaron が英語翻訳をしてくれ(国際化されてます!)(ariga to!) id:naoya がプロデュースを行い(僕がんがったよ…)本日リリースとなりました。\n```\n$ prove -l t/.t t//.t\nAll tests successful.\nFiles=11, Tests=433, 2068 wallclock secs ( 0.14 usr 0.19 sys + 233.01 cusr 112.39 csys = 345.73 CPU)\nResult: PASS\n```\n僕が白紙のサービスを一からディレクションを行いチームとして開発を進めるのが初めての事もあり、チームメンバーには無理難題、最後には五月雨式PDDな実装をおねがいして至らないところも多々ありましたが、無事決めた日時にリリースできて良かったです。チームメンバーには非常に感謝しています。また色々使って意見をくれた方々、はてなスタッフのみんな、ありがとう!\n\nPDD(ポストイット駆動開発の図)\nサービスはリリースされてからが本当の始まりなので、いっそう面白いサービスにしていこうと思ってるので、是非 Android, iPhone 3GS をご利用の皆さんは使ってみてくださいね。\n\nhttp://mono.hatena.ne.jp/\n\nなお、iPhone 3G でも虫眼鏡等を使えばなんとか利用できます…!\n\n参考: 本日リリース「はてなモノリス」iPhone 3Gでも楽しめる方法とは?\n\n*1:ちなみにモノリスアプリは機能が少ないためか、1週間ほどでレビューが通りました \n\n** 0.18288925357599198 299\n{'Draft': False, 'Title': '2010-02-13', 'Date': '2010-02-13T00:00:00+09:00', 'Image': None, 'Slug': '2010/02/13-subtech', 'Tags': ['subtech']} \n\n初めての Android アプリ\nというわけで初めてAndroid アプリを作ってみたりしました。 フォトライフのはち/ょ/よ/ん/ごがほぼ全部実装していたのを横目で見ていただけなので、実際にちゃんとコード書くのは初めて。というか Java も初めて。\n美声時計ビュアーというのは、初めてのアプリとしてはちょうどいい感じの規模感で\n\n画像のロード・表示\nSD へのファイルアクセス\n\n\nタイマー処理(時計だし)\nメニュー\n簡易設定\n音声再生\n\nのような特に難しくない、基本的な実装で作れちゃうので挫折しなくて良かった。複雑な Activity/View とサービスによるバックグラウンド実行の維持、スレッド使いまくり、のようなアプリを最初から作ろうと思うと挫折してしまいそう…。\nで本業後のあまった時間*三日間で Android アプリ初でも作れちゃう Android の開発環境の良さ、ドキュメントの良さはすごいナーと思いました。\nまず言語が Java というのが良くって、Java を全く書いたことがない自分でもふつうにプログラマやってれば Java 読めるし、難しいことしなければただの OOP なのですんなり書ける感じ。Android 開発におけるリソースを利用した文字列・配列・UI 定義もすごい分かり易い。で、それらを簡単に使える Eclipse + AndroidSDK の IDE もとても良くできてる。あと Eclim で vim からコードが書けて各種補完が使えるのがとても快適でした。\nまた書籍としてはコードからわかるAndroidプログラミングのしくみが、ずば抜けて分かり易かったので最初にこれを読むべきだと思いました。なんで Android のアプリが動くのかがちゃんと解って、これ一冊 + あとは Web 上のリファレンス + ぐぐるさんで困らない感じ。\n\nコードからわかるANDROIDプログラミングのしくみ\n\n作者: フランク・アブルソン,チャーリー・コリンズ,ロビ・セン,安生真,土肥拓生,谷沢智史\n出版社/メーカー: 日経BP\n発売日: 2010/01/14\nメディア: 単行本\n購入: 4人 クリック: 218回\nこの商品を含むブログ (13件) を見る\n\nというわけで実際にやってみたら簡単にアプリが作れたので、みんなももっとアプリ作ればいいと思いました。まる。\nAndroid で動く美声時計ビュアー\nDesire for wealth : Mac/Windows で動く美声時計ビューアを作りました で、すばらしいなーと思ったので Android 版ビュアーを作ってみました。Yet Another 美声時計。動作にはもちろん AppStore で購入した美声時計が必要です。\n \n\nhttp://github.com/hotchpotch/YA-BiseiTokei-android/downloads\n\nあたりからapk入れて、SDカードのルートに bisei-tokei という名前のフォルダに、だめんちゅんにっきさんで書かれているような感じで配置すれば動くと思います。この説明でなんだか解らない人は使わない方がいいです。\n次はアイム版もいいですが僕としてはミュージックレイン版を希望します! \n\n"
]
}
],
"source": [
"print_similar_results(955, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Title': '2020年9月14日', 'Date': datetime.datetime(2020, 9, 14, 19, 40, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝食はネットで買った京都ボローニャのデニッシュ食パン。\nトースタで焼くと外サクサク、中はふわっとな食感。はちみつや小倉で更に甘さアップでヤバい(美味しさもカロリーも)。\n昼食は昨日釣ったアジでアジフライ。とても身がふわっとしていて美味しい。スーパーなどで売っているお惣菜のアジフライ(あれはあれで美味しいのだけ)とは別格のふわっとさ。\n3-4時間仕事していたら頭痛がひどくなってきたので、早めに仕事を切り上げる。久しぶりにロキソニンを飲む。あんまり頭痛にならない体質なのだけど、珍しいなぁ。\n妻がカラフルな花を買ってきた。自分では買わないので新鮮。曰く、島の住民のジュペッティ色らしい。\nsecon.dev の画像拡大時に exif 表示したり、og:description を出すようにしたり。exif の表示位置が微妙なので後で直したい。\nexif を見ると、最近はやっぱり PEN-F ばっかり使ってるなぁ。FlashAir と組み合わせてシャッターを押したら Google Photos に上がるのは便利だ。\n能動的な行動を起こさなくて良い、人間のリソースがほぼゼロ(家でWiFiに飛ばすためカメラの電源を入れる必要はある)なのは大きい。\nWindows が今日二回もスタンバイから復帰せず、むむむ…。復帰すると時計が狂っていて、このタイミングでハードウェアクロックがおかしくなってるっぽいなぁ。\n夜に前にちょっと散歩。雨が振りそうで風も強く、なにか起きそう、な天気。\n晩御飯は、アジの煮付け、アジの刺身、アジの酢じめ、アジのなめろう、と鯵づくし。とりわけ一晩たった刺し身はぷりぷりで美味しい。ひたすらアジ料理を作ってくれた妻に感謝だ。\n\nおたより返信コーナー\n\n万葉倶楽部いいよね〜、東名川崎近くの万葉倶楽部によく行ってた。\n--ヨシオリ\n\nおっ、髪の赤い人だ!ちゃんとした温泉のお湯に気軽につかれて良い~。 \n\n** 0.3503214811392338 928\n{'Title': '2020年9月13日', 'Date': datetime.datetime(2020, 9, 13, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝6時前に家を出て、近くの海釣り船を出すお店に友達と行く。釣り船で釣るのは久しぶり。\n7時出発で、アジがいそう(アジ釣船だったので)な海域を探しつつ移動。二箇所目がドンピシャで、どの時間も釣り糸を垂らすと大抵すぐにアジが釣れる。釣れまくって楽しい\n移動中、要塞のような工場の風景が。木更津あたりらいし\n友達は40匹ぐらい、自分は20匹強を4時間弱で釣る。二匹同時に釣れたりもときどきする\nいやー、海釣りも楽しいね。アジ以外も釣りたい\nコストパフォーマンス的には魚を買った方が安い(釣り竿レンタルや釣り針など、トータルで7000円弱ぐらい)んだろうけど、釣りというエンタメが味わえて、なおかつ魚も手に入るしね\n午後は3時間ぐらいかけて、妻と魚の処理をする\n魚の処理(ウロコを取る、セイゴをとる、頭を取る、内臓を取る、血合いをとる、キッチンペーパーで水分を取る)は作業的で大変だ、腰を痛くしそう。さばく用に刃渡りが短いアジ切り出刃包丁とウロコ取りを買っておいてよかった…。\n釣りの汚れを落とすために万葉倶楽部へ\n湯河原からお湯を持ってきているだけあって、銭湯じゃなくてちゃんとした温泉なのでお湯は良い\nサウナも悪くはない。サウナ後、外で外気浴ができるのが良い。\n1時間風呂・1時間休憩・1時間風呂&サウナでさっぱり\n万葉倶楽部、定価だと2500円してちょっとお高いのだけど、クーポンとか各種チケットを活用して毎回1500円前後で入れていて、これぐらいの価格だとちょいちょい行きたいなぁ。\n総じて良い休日だったなぁ \n\n** 0.33851219164620555 783\n{'Draft': False, 'Title': 'サビキ釣りを始めた', 'Date': '2020-07-27T07:08:44+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200724/20200724163739.jpg', 'Slug': '2020/07/27/070844', 'Tags': ['life-and-consume']} \n\n家から徒歩3分で海に行けるので、散歩がてら釣りをしている人をちらほら見ていたら、突然釣りがしたくなり釣りを始めた。釣りは以前友人に釣り船に一度連れて行ってもらっただけで、全くのいろはも知らない素人だ。\n\nさて、そもそも何が釣れるんだ、とググってみると、サビキ釣り、というのがこのへんでも釣りやすいらしい。サビキ釣り、というのを調べると、ファミリーフィッシング向きな、一番簡単な釣りと言っても過言ではないらしい釣り方らしい。\n釣りに詳しい友人にやり方を聞くと、「自分であれこれ調べて釣ったほうが断然楽しいよ。ちなみに自分が今ハマってるのはマゴチ釣りで、釣りと一言で言っても、種類によって全く別ジャンルと言っても過言ではない云々カンヌン…」とのことでなるほど一理あるなと、解らないなりに調べてみる。なんとなく必要なものが分かったので、近くの釣具屋に「すいません、これからサビキ釣り始めようと思うんですけど…」と買いに出かけ、店員さんが丁寧に道具類のおすすめを教えてくれ、一式購入する。\n購入後、早速釣りに行くも全く釣れず。朝は5時に、夕方は18時頃、天気が悪い日以外はほぼ毎日1-2時間の釣りに行くも釣れず。一週間ぐらいたって、初めて小鯖が一匹釣れる。それでも釣りに行くのは、ぼーっと海を眺めるだけで、なんとなく気分が良いからだ。妻も散歩ついでに大概ついてきてくれ、手持ち無沙汰になるのも悪いので、もう一本釣り竿を買ってまた一週間ぐらい釣りもするも全く釣れず。\n\n初めて釣った小鯖。全く釣れていなかったので小さな魚でもめちゃ嬉しかった。\n変化が訪れたのは大雨が上がったばかりの夜、天気が悪くて釣りに行けていなかったので、夜釣りに行ったら、釣り糸を垂らしてすぐに引きが来て、あまりの引きの強さに釣り糸が切れてしまった。その時はちょうど餌をいれるカゴも無くなってしまったので帰ったのだけど、次の朝釣りに行くと、サビキで釣っているおじさんが爆釣れしている。自分たちも初めてアジが釣れた。おじさん曰く「昨日からアジが回ってきてるよ、それまでは全然釣れなかったんだけどね。あと5時に来たんじゃ遅すぎるよ、日の出前の4時には来ないと。日が出たら(=自分たちが来た5時には)もう魚は居ないよ」と。\n次の日は4時前に起きて釣りに行くと、海岸には昨日教えてくれたおじさんが釣りを始めたところで、針を垂らした瞬間にアジがかかる。自分たちも早速始めると、嘘のようにアジが釣れる。入れる、釣れる、入れる、釣れる、を繰り返し、1時間ちょっとで20匹ほどアジが釣れる。めちゃくちゃ楽しい。\n\nおじさんとも釣りながら話をして、おじさんは定年退職して暇を持て余すかと思いきや、朝は釣り、昼は釣った魚をさばき近所に振る舞い、休日は山々を歩き、毎日が楽しくてもっと早く定年退職したかったよ、こんなに老後が面白いとはねぇ、と。いい人生だなぁ。\n家に帰って、20匹のアジを捌く。全く慣れていなかったので、最初の三枚おろしは身が全然取れない、ザ素人の三枚おろしが出来上がる。妻はあっという間に慣れ、手早く綺麗に魚をおろす。それから四日間はアジづくしで、アジフライ、塩焼き、刺し身、たたき、なめろう、頭や骨でアラ汁、とアジ三昧。アジは味が良いからアジ、という名の魚なだけあって、何で食べても美味しい。\n\n\n\n釣れない日もたくさんあるけど、そんな日は海を眺めて過ごす。釣れる日はめちゃ楽しいし、釣った魚を食べるのも美味しい嬉しい。今度はどんな魚が釣れるだろうか。 \n\n** 0.23896593659777185 260\n{'Title': '2021年3月22日', 'Date': datetime.datetime(2021, 3, 22, 19, 50, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n\n中華街にランチを食べに行く。緊急事態宣言明け、かつ雨上がりの次の日だからか、春休みと思しき高校生・大学生ぐらいの若者がわんさかいておののく。前に来た時はだいぶ人が少なかったのだけど。\n\nランチで入ったお店は味は悪くはないけどとりわけ美味しいというわけでもなく、かつ量がたくさん出てきたので食べすぎてしまった。健康を考えると、残したほうが良いのだけど、残すことに罪悪感があるのだよなぁ。\n\n散歩して帰ると、満開の桜から葉桜になりつつある桜までいろいろ。あっという間に桜の季節が終わってしまいそう。\n\n夕食は先日釣ったアジで刺し身となめろうとアラ汁。37cmの大きなアジだったけど、味は大味ということはなくプリプリの美味しさ、というか今まで釣ったアジで間違いなく一番美味しい。また、タチウオとアジのアラ汁も今まで作ったアラ汁で一番の美味しさ。大満足の夕食だった。\n\n\nWindows デスクトップ用のカメラとして、LogicoolのC922Nを購入する。今までも買おうと思っていたのだけど、需要過多のため定価以上がつづいてて、そろそろ値段が落ち着いたので。画質は悪くないのだけど、マイクはギリギリどうだろう、という感じのクオリティ。\n\nこのサイトに remark-highlight.js を導入する。\nruby\nputs 'hello syntax highlight!'\nmarkdown ビルドのパイプラインに1行追加するだけで、あっという間に適用できたので、もっと早くやるべきだったなぁ。ライブラリの導入の難しさ指標ほしい。あなたのコードには、このライブラリは平均2分で組み込めます、とか。\n\n機械学習学習日記 - 49日目\n最近の続きのライブドアニュースコーパスを使った多クラス分類。昨日は1から学習させたものを、Word2Vec の日本語WikiPediaから作った分散表現を Embedding レイヤーの初期の重みとして学習させると、すぐに学習が収束する。ただスコアは0.945ほどで、初期重みを指定しなかったほうが学習に時間はかかるがスコアが良いという結果に。 \n\n** 0.23047612070870263 938\n{'Title': '2020年9月18日', 'Date': datetime.datetime(2020, 9, 18, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝、久しぶりに良い天気なので日の出を見に散歩へ。\n日の出前の空は紫色で、その後大きな虹が2つ架かる。一つははっきり、一つはぼんやり。\n天気雨が降るとあっという間に虹が消えてしまった。空気中の水分が増え、光の反射が変わってしまったからなのだろうなぁ。\n海面が高く、普段は浸水しない公園も浸水していた。面白い天気(環境)だった。\n昼飯はアジフライとアジのアラ汁。今週はアジづくし。タルタルソースがさっぱり風味のタルタル(玉ねぎが多いからかな)で、フライが爽やかに食べれる。\n午後からは野毛山動物園へ。ベイバイクでサクッと行けて便利だったのだけど、ベイバイク返却し忘れで30分料金で良いところが2時間料金になってしまった…。ベイバイクの返却し忘れ、これで3回目だ。\nPS5の予約が始まったので、抽選予約のいくつかに申し込む。PS5、ハードウェア性能の割に安すぎ感あるので使ってみたい。\nそして先日発表された、Oculus Quest 2 もスペックの割に安すぎる。片目で 1832 x 1920 の解像度のヘッドマウントディスプレイ + Snapdragon XR2 で税込み37,000円ぐらいってすごい。たぶん ALVR もそのうち対応して WiFi 経由のストリーミングで SteamVR のゲームもできそうだし、というわけでこちらも予約してしまった。\n夕方はサウナへ。瞑想タイム。\n夜、冷麺が食べたいと言ったら豆腐麺の冷麺を作ってくれた。低炭水化物で、さっぱり美味しい。 \n\n** 0.1620883403852272 694\n{'Draft': False, 'Title': 'はてなブログ + Google Photos (というか Lightroom Classic の現像のカスタムファイル名) で、写真の exif を表示する', 'Date': '2019-04-03T20:26:06+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730081009.jpg', 'Slug': '2019/04/03/202606', 'Tags': ['life-and-consume']} \n\nGoogle Photos のオリジナルデータには exif の情報が入っているので、こいつを exif-js でパースして表示、と思ったけどそもそも CORS 的に無理だった。\nなので割と力業で表示させてみた。こんな感じで exif を表示してる。\n\n\nやり方\nLightroom Classic のファイル書き出しで、カスタムファイル名にゴリっと必要そうな exif をいれちゃう。これでファイル名が長い jpg ファイルができあがる。なお私の環境だと、カスタムファイル名でカスタムテキストや、テンプレート以外の文字列を埋め込むと、高確率で Lightroom が落ちたり、意図したファイル名にならなかったりした。\n\n少なくとも、Windows 環境(NTFS) + Windows の Google バックアップと同期 だと、意図したファイル名で Google Photos にアップロードされる。\nはてなブログ側は、このファイル名を読み取って適当に HTML に挿入する JS をフッタなどに埋め込む。これで、このエントリーのような表示になる。力業で全然美しい方法では無い…。\n```\ndocument.addEventListener('DOMContentLoaded', function() {\n jQuery('img.magnifiable').each(function(_, e) {\n var filename = e.src.replace(/.\\//, '').replace(/./, '');\n // YYYYMMDD__exif1__exif2__exif3 な lightroom から出力したファイル名。カスタムテキストは をセットしてセパレータに。\n var regexp = /^\\d{8}(.*).[^.]+$/;\n var matches = filename.match(regexp)\n if (matches) {\n var exif = decodeURI(decodeURIComponent(matches[1]))\n .replace(/__/g, ', ')\n .replace(/+/g, ' ')\n .replace(/1-(\\d+)\\s/, '1/$1')\n .replace(' mm,', 'mm,')\n .replace(/ ISO (\\d+)/, ' ISO$1')\n .replace(/\\s(f\\s-\\s(.+?))/, ', F$1');\n var exifElement = jQuery('<div/>', {\n text: exif,\n style: 'text-align: right; color: #AAAAAA; font-size: 80%; margin: -5px 5px 0 0;'\n });\n jQuery(e).parent().parent().append(exifElement);\n}\n\n});\n});\n``` \n\n"
]
}
],
"source": [
"print_similar_results(931, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Title': 'ブログ画像選択の Picker を作った', 'Date': datetime.datetime(2020, 9, 5, 15, 26, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\nこのブログの新しい文章は、markdown で書いている。といっても以前はてなブログでも markdown で書いていたのでほぼ困っていなかったのだけど、とりわけ困るのは画像貼り付け。\nはてなブログではフォトライフにアップした画像を簡単に貼り付けられるのだけど、テキストエディタ(というか VSCode)の markdown では簡単に画像をピックアップして貼り付けられない。また markdown は文章表現は強いけど、画像レイアウトの表現は普通に html 要素を書くケースがほとんど。\nので、そのため自分のはてなフォトライフにアップした画像を選択して html をクリップボードにコピーする Pickerを作った。\nレイアウトとしては\n\n普通に貼り付け\n横 100%で貼り付け\nグルーピングで貼り付け\n\nができるようにしている。\n\n横 100% で貼り付ける\nブログの本文は通常、親要素が左右の margin / padding を入れていることが殆どで、そのため横幅 100%画像貼り付けが普通には出来ない。そもそもそんな構造で作るのが悪い、というのは最もなのだけど、親での指定が楽なのでどうしてもやってしまう。\nなので、良くないやり方(将来的にはうまく動かない、ブラウザによってはうまく動かない)なのだけど、だいたいうまくいく CSS を指定して無理やり行うようにした。\ncss\n.photos-full-width img {\n display: block;\n max-width: none !important;\n max-height: none;\n width: 100vw;\n position: relative;\n left: 50%;\n transform: translateX(-50%);\n}\nグルーピングして貼り付け\n何枚も画像を貼りたいが、一枚一枚大きなサイズでなくても良い、適当に貼り付けたい、JS 使わないで CSS だけでやりたい、そんなときに便利なのが flexbin という CSS 。\nこれを使うことで、いい感じにグルーピングができる。このブログのスタイルシートは Sass で書いてるので、flexbin を使いやすい (Sass だと細かくカスタマイズできる) のも良い。\nただ完全に縦横比が分かって計算して出しているわけではないので、画像の縦か横がちょっと切れてしまうけどしょうがない。完ぺきを求めるなら、JS で書くのが手っ取り早いけど、今のところそこまでのモチベーションは無いから、適当でだいたいうまくいく、で十分だ。\nその他・自分のフォトライフ画像一覧を取得\nフォトライフの Atom フィード があるので、そこから持ってきて表示している。CORS の関係で、Google Cloud Functions を挟んで CORS を許可してちょっと整形して、 HTTPS API 経由でとってきてる。Google Cloud Functions、ちゃんとデプロイできるように環境を整えるとすごく簡単に使えるようになるのだけど、そこまでが手間感がある。 \n\n** 0.37609613421243077 958\n{'Draft': False, 'Title': 'Google Photos の画像をダウンロードして、ブログの画像を別の画像に差し替える', 'Date': '2020-08-03T10:19:14+09:00', 'Image': None, 'Slug': '2020/08/03/101914', 'Tags': ['2ndlife']} \n\nGoogle Photos は様々な Web サイトから Google Photos にアップロードした写真を貼り付けできる*1、という太っ腹な Picker API という機能がある。\nただ、この機能は他の Web サイトが無料で Google Photos の生 JPEG 画像を使え、Google 側に旨味はほぼないため、いつかはなくなるんだろうなぁ、けど無くならないと嬉しいな、という気持ちで使っていたら、Google Picker API で貼り付けた画像が「画像所有ユーザ以外は過去画像含め見れなくなる」という斜め上の変更が入ったため(この辺の認証メカニズムの変更の影響?)、数千枚の旅行写真を Google Photos から貼り付けていた 自分は悲しみに明け暮れていた。\nまたはてなブログでは、この Google Photos の貼り付け機能をはてなブログから利用できる機能としてユーザに提供していたため、\n\nhttps://staff.hatenablog.com/entry/2020/06/10/155523\n\nというアナウンスが出ていて、いつかは対応されると思うのだけど、一足先に自分でスクリプトを書いて対応してみた。\n\nhttps://github.com/hotchpotch/google-photo-downloader-w-hatena\n\nやっていることは難しくなくて、\n\nはてなブログの記事を blogsync でダウンロードする\ngoogle フォトぽいURLを抜き出す\nその URL を元に、認証情報を持った Google Chrome 経由でオリジナル画像をダウンロードする\nはてなフォトライフに画像をアップロードする\nはてなブログの記事を、Google フォトからフォトライフへと文字列置換する\nblogsync で再度はてなブログを更新する\nただ、og:image の画像は差し替えられず…\n\n\n\nみたいな流れで置き換えを行っている。これで自分のブログや妻のブログは無事フォトライフに(og:imageやサムネイル以外は)差し替えができ、旅行の写真を再び公開することができた。\n\n今回の教訓で、当たり前なのだけど、この事業/機能は儲からないじゃ、というものはやっぱりなくなった、ということだった。無料(もしくは容量を考えたら月額安すぎる)でアップロードし放題のストレージサービスが出たときも、こそって消えていったのだけど、Google フォトのこの機能は Google だから無料で使い続けられるはず、なんてことはなく、やはり消えていったのであった*2。\n*1:jpgをママ貼り付けでき、サムネイルサイズも自由なサイズを選べ、Google の高速なサーバ経由で配信され、しかもアップロードしたオリジナルファイルもダウンロードできる、という素晴らしいかった機能\n*2:Amazon Prime 会員が使える、Amazon Prime Photos にRAW画像を無限にアップロードできる機能も無くなるのでは、と思って信頼しないで使っている \n\n** 0.24519186611903532 909\n{'Draft': False, 'Title': '【今月二度目】 Google Picker API がら取得した Google Photos の画像が利用できない、ヤァ!ヤァ!ヤァ!', 'Date': '2020-03-29T13:22:56+09:00', 'Image': None, 'Slug': '2020/03/29/132256', 'Tags': ['life-and-consume']} \n\nこれは日記に画像を貼り付けできない、悲しみのポエムである。\n一度目は3月10日(JST)あたりから発生していて、Picker API で取得した画像が数分後には403になる。3月13日ごろ直ったが、発行されるサムネイルのURLが仕様が変わったのか、めちゃ長くなった。\n二度目は3月25日あたりから発生していて、今度は数分後に、GoogleにログインしてないユーザはGoogle認証画面に飛ばされるようになった。3月29日の今現在も発生している。なおGoogleにログインしてると、画像がうまく表示されるのでぱっと見気づかない。\n最近 Google Picker API(Webブラウザから使う、クライアントサイドのJavaScript API)を良く触っているのだけど、Google のサービス群のデータを返すだけあって、なかなか大変そうな匂いがする。\nたとえば Picker API が返す Photos のデータのJSONレスポンス(Response.DOCUMENTS)の Document.URL は Picasa の URL が入っており、そのURLにアクセスすると404だ。Picasa は買収した会社かつ、2016に閉鎖されたので、昔のシステムが部分部分は使われている気がするし、またGoogle+フォトという\"Googleフォトではない\"サービスも2015年に廃止・統合されたので、その事実を考えるだけで、レガシーな裏側が想像できる。\nまた \"camerasync\" という、Google Photos にアップロードした最新写真一覧が見れる便利ビューも、「携帯電話の写真」という昔の名前まんま(昔はそれが正しかったのだろう)だし、さらに \"camerasync\" に関する仕様が書かれたドキュメントはいつの間にかなくなっている。そのため、Picker API に書かれた仕様のみだと、「アルバムに追加した写真」「その場でアップロードした写真」の情報しか取得することができない。\n\n基本無料の写真サービス(やユーザのデータをアップロードするサービス)というのは、マネタイズがなかなか難しく、昔あった各サービスはだいぶ淘汰され、Flickr もほぼ有料サービスとなった。Googleフォトも、規約的にはGoogleがデータを好きにできるので、アップロードされた画像データはとりわけ機械学習用のデータとしては約に立つのだろうが、Googleの儲けにつながらなさそうな、トラフィックが多いWebサイトで、ただの jpg に直リンクされる無料静的画像アップローダとして使われると旨味はほぼない。Google Photos の Webインターフェイス上からも jpg の直リンクを生成するような機能はそもそもないしね。\n大多数のフォトサービスが提供しているような、本人と特定の人のみが見ることができるフォトアルバム(その場合はトラフィックはほとんど発生しない)へと移行していくのかもしれないが、するとWebサイトでGoogleフォトのjpg画像を直接表示していた1個人からすると残念だ。ただそんなことをしているのは Google Photos 利用者のほんの一部だろうし、そのほんの一部の利用者がトラフィックの大部分を使っているとすると、サービス継続のためには正しい判断とも言えるだろう。\nそんなことではなくて、レガシーシステムの統廃合で新しいアーキテクチャになっていく時に生じた一時的なバグでした、みたいな話でした、と杞憂に終わるとよいのだけどね。\nと、Google Photos の写真をこの日記に貼れないのでポエム記事を書いたりしたのであった。関係ないけどA Hard Day's Nightというアルバムの邦題を、ビートルズがやって来るヤァ!ヤァ!ヤァ! と付けた人は素晴らしい感性の持ち主だと思う。\n2020年4月7日追記\nメールで、2021年3月末日を持って、Picker API の Google Drive 以外の部分(Photos とか Maps)とかの終了のお知らせが来た。\n\ncloud.google.com\nそしてこのタイミングで、Google Picker API での Photos の画像取得がまたきちんと動くようになった…。\nなお、代替で案内されている Google Photos API が返す画像にアクセスできる baseURLは60分で期限が切れるらしいので、内部的にはこれが返されているっぽい。実際に Google Photos API を叩いて取得できた画像の baseURL は仕様通り、60分ちょっとで利用できなくなってしまった。また、Google Photos API は契約結んでいないと回数に利用上限がある。\n\ndevelopers.google.com\nつまるところ、2021年4月からは、Google Photos にアップした画像の認証無しで直接アクセスできる、普遍的な静的URLはなくなりそうな感じだなぁ。 \n\n** 0.2378555790911065 1255\n{'Draft': False, 'Title': 'Web2.0 アプリケーションライク な背景画像を生成する Background Image Maker', 'Date': '2005-12-17T01:13:40+09:00', 'Image': None, 'Slug': '20051217/1134749620', 'Tags': ['2ndlife']} \n\nhttp://lab.rails2u.com/bgmaker/\nウェブサイトのデザインをしているとき、自分はCSSを利用します。そのCSSを書いていて、「ああ、こんな背景画像がほしーな」と思うと、今までは画像編集ソフトでちまちま作ってSCPでサーバにアップして確認し「いやここはもうちょいこうした方が」とまた少しだけ修正してアップして…という繰り返し作業を行ってました。\nしかしその作業単調が面倒になってきたため、簡単にWeb2.0っぽいアプリケーションでよく使わるような背景画像をWeb上から作成できるツール、「Background Image Maker」を作ってみました。下のような背景画像を簡単に作成ができます。また先日このページを現在のデザインにリニューアルしたのですが、今使っている背景画像も全部 Background Image Maker を使って作成してます。 \n\n\n\n\n\n\n使い方は値を適当に弄って「Make」ボタンを押すと画面右側に画像が作成されます。各オプションの意味はこんな感じ。\n\nType\n基本となる背景の種類。四パターンある。\n\n\nMargin\n線を引く隙間。Gradationでは無効。\n\n\nLineColor, BackgroundColor\n線と背景の色。Transparentにチェックを入れることで透過色にする。\n\n\nSize\n大きさ。Autoで気に入らないサイズの場合に変更することを推奨\n\n\nOptions\nReverse 回転、反転など\n\n\n\n好きな値を入れ「Make」を押すと右側が変更されます。URLには今生成した画像のURL、Imageには生成画像自体、Sample以下に背景画像として使ってみたサンプルが表示されます。また不正な値の場合はエラー画像が表示されます。\nで、実際に生成されたURLを使いCSSに\nbackground-image:url('http://lab.rails2u.com/bgmaker/slash.png?margin=3&linecolor=383838&bgcolor=000000');\nなどと指定すればOK。各種パラメータはURLのqueryを変更することで弄れるので、たとえばもっと間隔をあけたければmarginの値を増やしたり、線の色をちょっと変えたければlinecolorを弄ったり、といったことで行うことができます。\n使ってみた感じ、自分で作っておいてなんですが、結構良い感じに背景画像が作成できます。好きなエディタでちょこちょこ値を変更して確認できるのも良いです。これでCSSでデザインしてる人がちょっとでも楽できて、より外観をクールにできたら良いですね。\n!注意事項\nこの Backgrand Image Maker を使ってCSSを作る場合、好みの画像が完成したら最終的には自分のサーバに保存して使ってもらえるとうれしいです。たぶん問題ないと思うのですが、キャッシュを利用してるとはいえ一応動的生成なので、負荷が高くなるとサーバが落ちてしまうかもしれません。またよくrails2u.comのhttpdが落ちてるor落としてるので、画像が突然表示されなくなってしまう可能性もあります。 \n\n** 0.20925155181753702 930\n{'Title': 'このウェブサイトの実装 2020年版', 'Date': datetime.datetime(2020, 9, 26, 19, 46, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\nr7kamura さんや kzys さん に倣って、このウェブサイトの実装を紹介してみる。\nホスティング\nGoogle Firebase Hosting を使って静的ファイルを配信してる。一部動的な実装に関しては、Cloud Functions for Firebase を使っている。静的ファイル配信は今は Netlify や Surge など、基本無料で超簡単に配信ができて高速なものが多々出てるのだけど、Hosting に限らず Firebase の他のサービスとの連携が楽、という理由で Firebase Hosting を使っている。\nまた最近の仕事でのサーバサイドはほぼ Firebase 製品ですませていることもあって、Firebase でなんかやる、というのが技術的にもやりやすいから、というのもある。\nなお画像はストレージをだいぶ食うため、はてなフォトライフにアップロードして使っている。はてなフォトライフは Google Photos のようにオフィシャルツールから取得した直リンクの画像が見れなくなる、というようなことは無いと信じている(が使えなくなったらそれはそれでどうにかする)。\n静的ファイルでの配信について\n個人サイトを運営している人たちで、現時点でも続けている人たちは、静的ファイルでのジェネレートしていた人たちが多い気がする。古くは blosxom なんかを使ってね。\n理由は多分二つあって、1つ目は少なくとも昔の静的ファイルジェネレータは、データソースがツールに依存しない形式が多く、markdown / html などの記事ファイルを読み込んでウェブサイトの構造に加工して出力するためシンプルな作り。単純なWebサーバさえあればサイト運営が簡単に継続できる。そして単純なWebサーバというのはコストが安い。これが CMS / blog のシステムを使っているとシンプルさが失われ、動的な要素を持つとなんだかのプログラムを動かすことになりコストが高く、継続して動かし続けるのが大変になり、ふとしたなにかのタイミング(久しぶりにサーバをを乗り換えたら動かなくなった、とかね)で失われることがある。\n2つ目は、構造がシンプルゆえに、静的サイトジェネレータの技術理解をきちんとしていたり、ジェネレータ自体を自分で実装していたりしているので、別のものに移行するときにすんなり以降ができる、というのもあるのだろう。これが複雑な CMS なんかを使っていると、export する仕組みがあるとは言え、それを別のところで動かそうとするとホネで、結局めんどくさくなって移行せずにネットの藻屑へと消えて無くなったりもする。すごく良い記事が消えて無くなるのは悲しい。\nドメイン\nGoogle Domains を使っている。以前はバリュードメインを使っていた気がする。この secon.dev を買ったのは 2020 からで、昔から自分のドメインをちゃんと持って継続しておくべきだった、と後悔している。\nドメインというのは自分の存在を表現する、インターネット上では重要な名前空間で、それを継続しなかった・持たなかったのは残念でならない。独自ドメインは個人サイトを運営するなら取っておくべきだ。\nなお日本ではメジャーな、お名前.comやバリュードメインなんかは、1年目のドメイン代だけ表示して、2年目以降の値段は表示されず、1年目の値段提示だけで安価に買わせようとしていて、それに気づくのは次のドメイン更新時、みたいな悪徳業者な感じで、本当に良くないと思っている。住宅の例えをするなら、賃貸物件に住みだしたら一年目より二年目のほうが何倍も高い請求が来て、かつそこに住みだしてしまったので引っ越しが大変(レジストラ移管は面倒なのだ)、みたいなことになるので、ドメインを購入する人は二年目以降の価格もきちんと調べたほうが良い。\nビルド\n静的サイトジェネレータには Next.js を使って実装した。この選定としては、一つは TypeScript で書きたかったこと、一つはフロントエンドの実装に React を使いたかったことが挙げられる。\nGatsby JS\n同じように TypeScript で書け、React が使える静的サイトジェネレータとしては GatsbyJS もある。Gatsby はよく出来ていて、すべてのソースを一度 GraphQL に集約し、それを元に出力するファイルを作る。つまり GraphQL を使う、以外は自由で、そのためデータソースを GraphQL に入れるためのプラグインも山ほどあるし、そのデータをどう加工して出力するか、というプラグインも山ほどある。\n他にも、例えば画像を自動でリサイズしてくれる、サイトマップを出力する、Google Analytics もいれる、などもプラグインを使うだけのプラガブルな仕組みが提供されている。\n\nhttps://www.gatsbyjs.com/plugins/\n\nそのため、入力ソースはファイル形式でもSQLでもリモートソースでも何でもよくて、出力形式も markdown だろうが MDX だろうがプレーンな HTML だろうが何にでも加工がしやすい(ふんだんにプラグインがある)。もちろん例えば Algolia で検索したい場合も、アウトプット先の一つを Algolia にしてしまえばそれだけで簡単に全文検索ができるようになる。\nなんで Next.js を使ってるのか\nこれだけ見ると、GatsbyJS はとても良く出来ていて、選定理由として選ばない理由はない感じがするのだけど、実際のところ WordPress のようなかおりがするのだ。山程プラグインはあれど、TypeScript で書かれているものも少ないし、なによりプラグインにテストが書かれているものが少ない。\nUI に関するテストが書きにくい、というのはさておき、ユニットテストが書きやすそうなものや、データソース関連はテストが書かれていてほしいものだけど、そのへんもあまり書かれていないのを見ると、技術的な危うささを感じる。\nもちろん、その分簡単にプラグイン作成に参入ができ、エコシステムとコミュニティが広がった、というのもあるのだろうけどね。\nNext.js は Gatsby に比べるとだいぶ質実剛健な作りになっていて、Gatsby にはある「超簡単にいろんな機能を持ったサイトが作れる、すげー!」という華やかさは無いのだけど、安心して実装を進めることができる。長い目で見ると、その安心感があったほうが良い、と判断した。\n記事の書き方\n記事は、はてなブログで書いていたものは、はてなブログの export 形式である Movable Type 形式のファイルを mt-parserで読み込み、静的ファイルを出力しているいる。はてなブログの記事は、blogsync でファイル + 記事ごとの markdown として取得できるのだけど、その場合は markdown 上にかかれているはてな独自記法、たとえば [f:id:secondlife:xxxx] などが展開されないため、それらすべてが HTML に展開されている Movable Type 形式にしている。\n新しく書いている記事は、VSCode + vscode-memo-life-for-you で書いて、Markdown Preview Enhanced でざっくりと確認している。書かれた記事の markdown ファイルは Dropbox 上で同期している。\nビルドするタイミングは、Dropbox で同期された記事ファイルの中から、Draft では無い記事の mtime を見て、以前のビルド時よりも新しいものがあればそれをトリガーにビルド、というのを Vultr 上の VPS にやらせている。\ngit に commit して push する仕組みだと、能動的な動作を必要としてしまい、もうちょっと雑にやりたかったので、Dropbox でのファイル同期にしている。\n記事のフォーマットについて\nまた、記事のフォーマットは markdown + HTML で書いている。markdown は markup ではなく markdown という名前からも、HTML のようになにかテキストにマークアップ情報をもたせることを極力避けているため、よくも悪くも表現の幅が狭い。\nとりわけこのサイトで問題になるのは、写真を貼り付けたときに意図したレイアウトにしにくいことがあって、その部分は HTML で書いている。\nそれを解消するために、markdown の中に JSX を書ける mdx などのアプローチや、markdown の記述順序によって HTML の出力を変えたり、独自の記法(はてなブログとか)を用いる方法あるが、今の所 HTML を貼り付ける形式にしている。\nデザイン\nデザイン、というか CSS フレームワークには Bluma を使って SCSS で書いている。flexbox が使える今、あえて CSS フレームワークを使う必要はないのかもしれないけど、昔使ったことがあって書き方をざっくり覚えていたこと、ちょっとしたデザイン(input や textarea とかね)をいい感じに当てれること、spaceing-heleprs が便利だったり、記事本文をだいたいいい感じにレイアウトする content が便利だったりで使っている。 \n\n** 0.19074019759441868 257\n{'Title': '2021年3月28日', 'Date': datetime.datetime(2021, 3, 28, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n\n雨の一日、と思ってたらそんなこともなかった。桜はだいぶ散ってしまった。春は新緑が芽吹き、色んな花が咲きだして楽しい。\n\n\n\nGoogle のメインアカウントの保存容量がそろそろ15GBになるよ、とお知らせが来る。ちまちまといらないファイルを消してスペースを2GBほどあけるが、今後もちまちまやるコストを考えると、年間2,500円とそれほど高くないし、とGoogle Oneの100GBプランに変更する。パーソナライズされた広告にまみれた世界より、ちょっとお金を払ってクリーンな世界で生きたい、IT代表の広告会社がGoogleだしこれで広告減の補填にでもしてくれ、と月200円ほどの課金で偉そうなことを思ったりした。\n\nAIで全自動マウスシールドを制御!飲み物を検知して自動開閉するプログラム の記事で、Scratch の UI 上で画像分類を学習させて判定機としてつかう、というのをやっていて面白い。利用しているML2Scratchでは、TensorFlow.js のラッパーである ml5js を使っていて、MobileNet モデルを元に fine tuning していた。ml5.js は高レベルのラッパーとして良く出来てる雰囲気だし、なによしそれを Scratch に組み込んで使ってしまうのがすごいなぁ。\n\n機械学習学習日記 - 55日目\n自分用にまとめていた Notebook をせっかくなのでこのサイトに記事として公開した。Jupyter Notebook は jupyter nbconvert --to markdown xxx.ipynb で markdown にできるのだけど、画像が svg として別ファイルに吐かれるため、そのままでは貼り付けできない。またsvg は点が多いグラフだと png よりもだいぶサイズが大きい。画像が吐かれたディレクトリを見ると、svg と一緒に png も吐かれているので、そいつを base64 で markdown に埋め込むようにした。\n今後も使うかも知れないので、それらをよしなにやってくれる、ちょっとしたスクリプトを書いた。\n\nhttps://gist.github.com/hotchpotch/c5904668fbd4cb0461382fbefa5a7591\n\n大きな画像を markdown に埋め込むと、普通に html としての表示が遅くなるのでどうなんだろう、と思いつつ、まぁ大したサイズでないので良いかな。RDBMS を使ってるようなシステムだと、text 情報なのにやたらサイズを食うのでよろしくないが、ここは静的サイトジェネレータだしなぁ。\nまた Windows で Ruby を使ったら、IO.read での png の読み込みが \"\\x89PNG\\n\"しか読みだせず、IO.binread で読み出す。Windows はテキストモードとバイナリモードなんてあるのね。 \n\n"
]
}
],
"source": [
"print_similar_results(924, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(1, 32945)"
]
},
"metadata": {},
"execution_count": 20
}
],
"source": [
"results = vectorizer.transform(['カオソイ'])\n",
"results.shape"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"** 0.4370363276477433 677\n{'Draft': False, 'Title': 'チェンマイ市場めぐり / 世界一周60日目', 'Date': '2019-11-28T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801141507.jpg', 'Slug': '2019/11/28/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n昨日おとといと観光したので、今日は観光休暇の一日。のはずだったが、ぶらり歩いた場所が市場・市場・市場と市場の密集地帯だったので、意図せず市場めぐりをしてしまった。\nまずはモン族市場。ここはクチコミなどでもあまり評価は思わしくなく、そのため行かなくて良いかなと思っていたのだけど、カフェに行く途中にあったので立ち寄ってみたら、予想に反して楽しめた。クチコミでは「ナイトマーケットなどに行けば売っている物ばかり」というのはそうなのだけど、道端に様々な店が並んでいて、色とりどりのモン族デザインはみていて楽しい。\n続いてチェンマイ花市場。こちらは名前の通り、花屋がずらーっとピン川の川沿いの道に立ち並び、お供えの花からフラワーアレンジメント等々、様々な花を売っている。痛まないように氷の上に花を並べたりと、冷室が作れない熱い地域ならではの工夫。お坊さんも花を買っていたりと、なるほど山ほど寺院があり、お供えに使っているので、需要があるのだなぁ。\n最後に花市場のちょっと北にある、生鮮市場のムアンマイ市場。ここはかなりの広さで様々な野菜・肉・魚・スパイス・果物を売っているローカル市場。店中ドリアンのみ、スイカのみ、バナナのみ、といった店も立ち並び壮観であった。\nと、本来は市場めぐりをする予定ではなかったのだが、ぶらり立ち寄って楽しかった。目的地のCafe Baan Piemsukでは、食べたココナッツクリームパイが、ココナッツクリームとココナッツ果肉たっぷりで、ココナッツ好きにはたまらない美味しさだった。ここでしばらく今後の旅程を考え、航空券の予約等を行う。\n東南アジアでの飛行機予約で使っているアプリはTrip.com(中国最大手旅行サービス、Ctripのグローバル版)一択で、Skyscannerで検索した最安値がほとんどの場合Trip.comだし、なにより自分と妻の情報を登録しておけば、航空機チケットで面倒な個人情報を入れる手間が省けるため、わざわざほんの小額安くなるため別サービスを使いたく無いのである。時々うっかりにより発生しかねない、個人情報入力ミスで飛行機に乗れない、みたいなことも起きないしね。\nただ今日はTrip.comでチケットが売り切れで、飛行機会社のオフィシャルサイトで予約したら、しょっちゅうセッション切れになって一から全て手の情報を入力し直し、チケット予約だけで30分もかかり大変悪いユーザ体験をしたため(この会社は飛行機チケットを買わせる気があるのか…)、Trip.comのありがたさをしみじみと味わったのであった。\n夕飯はカオソイとチャーハン、サーモンエビ巻き(?)とパッタイ。昼はローカル店でカオソイ(30B、お安い!)を食べたので、7食目のカオソイである。ココナッツ風味が強くクリーミーなカオソイは、残ったスープをチャーハンにかけると最高に美味しい組み合わせになるため、途中からチャーハンを追加してしまった。そう、天下一品のこってりラーメンスープとチャーハンのように…。\nカオソイはカオソイでも、すっきりスープだったりこってりクリーミースープだったり、色々あるので、こってりクリーミースープ(+チャーハン)を味わえる店として、The Chef(どちらも70Bぐらい)とカーンチャナー(どちらも100B前後、ちょっとお高いが美味しい)をオススメとして日記に残す。\nホテルに戻った後、ここ三日の疲れをほぐすために、タイマッサージへ。1時間200B(とチップ)でイタ気持ちよかった。 \n\n** 0.3508488367880793 689\n{'Draft': False, 'Title': 'ぶらチェンマイ / 世界一周58日目', 'Date': '2019-11-26T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730064950.jpg', 'Slug': '2019/11/26/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n今日はチェンマイの堀(大体壊れてしまっているが)と水路で囲まれた旧市街をぶらぶら。タイの京都、と一部で言われているように、寺院、寺院、寺院とそこら中に寺院が立ち並ぶ。\nタイの寺院は主に赤の壁に金色の装飾が施されており豪華で、内側も金色に輝く模様や仏様が描かれている。金色は時に輝かしすぎて目が痛いほどの明るさ。また、数々の仏像、実際のお坊さまを蝋で作ったもの(本物のようだ)等々が並ぶ。\n一部仏像には、曜日のタグが置かれているものもあり、自分が生まれた曜日のところでお布施をすると徳を積めるらしい(タイは日本の血液型占いのように、自分の生まれた曜日が様々なことに使われるとか)。私の生まれ曜日は土曜日なので、土曜の仏像に金箔を貼って(一枚10B(40円弱)で売られていた)お祈りする。托鉢だったりお布施だったりお祈りだったり、仏教国のタイでは様々な現世で徳を積む方法があり興味深い。\n街中では、昨日ぶらり立ち寄った妻が気に入ったアクセサリー屋で指輪をプレゼントする。デザインが日本にない感じで独特だった。\n夜はショッピングモールに行くが、一般のショッピングモールは中国で山ほどみたためかどれも似たり寄ったりに感じてしまい、また疲れていたせいもあってかあまり楽しめず。\nなお、今日も昼も夜もカオソイを食べる。昼のカオソイはローカルの店でスープも自前、麺も注文が入ってから茹でるタイプで美味しかった。夜はショッピングモールのチェーン店だったため、すでに茹でてある麺に出来合いのスープをかけ、という感じで20秒で出てきたが味は残念な感じだった。それでもカオソイ美味しいけどね。 \n\n** 0.277123143207998 670\n{'Draft': False, 'Title': 'ぶらルアンパバーン / 世界一周49日目', 'Date': '2019-11-17T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730073602.jpg', 'Slug': '2019/11/17/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n朝起きると6:10。熱は微熱を残しつつも、体調は病み上がり!という感じで観光できそう。というわけで早速ルアンパバーン名物、托鉢を見に外に繰り出すも、この時間ではすでに終わっていて、代わりに朝市がずらーっと繰り広げられていた。\n朝市では道端に畳1-3畳ほどの露天が立ち並び、日本では見ない様な野菜はもちろん、とれたとの生きた小さな川海老、雀(どれもペア、食べるじゃ無くて愛玩用?)、鶏(生きて足だけ縛れれている)、そして猪と思われる剛毛が生えている大きな脚、などなど、今まで見てきたアジアマーケットともちょっと異なり新鮮だった。\n昼はラオス名物、カオソイを食べたのだけど、酸味スープに米の麺の組み合わせで、食べる前まではそれほど好みでもないのだろうなぁと思っていたのだけど、食べてびっくり美味しい!ダシと酸味スープが絶妙で、途中でライムを混ぜるとこれまた旨い。そして具のちょい辛の鶏肉や豚肉、様々なハーブが程よく全体のバランスを整えていてうまし。なお自分は気にいると食べ物をリピートする傾向にあり、夜ご飯も別の店でカオソイを食べたのであった。\n午後はメコン川周辺を散歩したり、街一面が見渡せるプーシーの丘を登ったりと、病み上がりにしてはそれなりに街中を散策した。ルアンパバーンの街並みは、フランス統治時代の建築が残っているし、建物は綺麗にリフォームされたりしていて外観も色合いも可愛いし、その辺の家でいろんな植物を育てていて緑あふれる感じだし、山岳x熱帯という組み合わせなので山の中に熱帯雨林が生えていて今までの東南アジアとはまた違った景色だし、オシャンティカフェ多いし、食事も観光地にしては控えめ価格で美味しいし、売っている雑貨はお土産に買いたくなる様なものが多いし、今日3杯も飲んでしまったフルーツ搾りたてジュースは美味しいし、大気汚染は少なくて普通に息が吸えるし(今までのベトナムが大気汚染されすぎだった…)、なんだルアンパバーン最高だなぁとラオスの他の都市にも行こうかなと思っていたけど、ルアンパバーンに長期滞在することに決めたのであった。 \n\n** 0.25386619690687573 679\n{'Draft': False, 'Title': 'ルアンパバーンからチェンマイへ / 世界一周57日目', 'Date': '2019-11-25T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801123509.jpg', 'Slug': '2019/11/25/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n移動日ということでルアンパバーンから飛行機でタイ北部の古都チェンマイへ。ルアンパバーンもチェンマイも空港が小さいからか、定刻の20分前に空港を飛び立ち1時間ほどのフライトで予定時刻の20分前にチェンマイの空港へ降り立つ。定刻遅れてのフライト数あれど、定刻20分前に飛び立つのは初めての体験だった。定刻30分前から搭乗開始だったのだけど、小さいプロペラ機のためすぐに全員が乗り終わり即座にフライトだった。タイといえばバンコクのイメージが頭に強く残っていたので、ビルがそびえる都会かと思いきや、全然高いも建物はなく田舎な雰囲気であった。\nチェンマイはGrabは空港では全面禁止らしく、空港オフィシャルのタクシーでホテルへ。といっても空港から街中へのタクシー代はGrabとそう変わらず。既存のタクシー関連サービスとGrabで軋轢があるらしい。\nホテルについた後に、旧市街をブラブラ。夕方小腹も空いてきたので、チェンマイのカオソイを食べたところ、これがカレー坦々つけ麺という感じの味わいで美味しい!!!太い平らの卵麺の上にカリカリに揚げられた麺が載っていて、スープはカレー坦々つけ麺味。ラオスのカオソイとは呼び名は同じだけど全然異なるものだった。\nその後、ナイトマーケットへ。いろいろな道にまたがかり、かなり大きなナイトマーケットだったが、東南アジアナイトマーケットはそろそろ飽き飽きしていたのでさらっとみてホテルへ戻る。帰り道にカオソイを出している店があれば入ろう、と思っていたのだけど、そういうときに限ってまったく見つからず、ホテルに到着してしまった。お腹は空いていたので、ホテル側にたまたまあった日本料理屋へ。世界旅行初の日本料理屋である。大都市には牛丼チェーン、大戸屋、一風堂等の日本のチェーン店も並んでいるのだけど、せっかく海外にいるのだしと日本料理屋には一切入っていなかったのだが、近いからという消極的な理由でついに入ることに。GoogleMapsのレビューだと「とても美味しい」というレビューが並んでいるのだけど、そこまで絶賛するほどの味ではなく、ただ日本料理として美味しくないかと言われると、値段(一食約500円弱)を考えると妥当な感じでもあった。\n——\nそれにしてもチェンマイの街並み、どこかでみたことあると思っていたのだけど、そう日本の寂れた地方都市に似ているのだ…。電飾はあれどシャッター街になっている街並みの雰囲気がそっくり。昔はこのシャッター街も賑わっていたのだろうなぁ、なんで寂れたのだろうか、と思うと感慨深い。 \n\n** 0.1518153024077738 692\n{'Draft': False, 'Title': 'チェンマイからマンダレーへ / 世界一周61日目', 'Date': '2019-11-29T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801120837.jpg', 'Slug': '2019/11/29/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n朝、7時前に昨日も行ったローカル市場のムアンマイ市場へ。昨日は夕方近くに訪れたため、活気がある朝にも行ってみたかったのであった。昨日よりも人が多く、所々に直径1mはあろう鉄籠で買い物をする人多数で、混沌と活気に溢れていた。また、市場ではお坊さんが練り歩き、托鉢も行われていた。朝食は近くのお店でお粥とカオソイ(8食目)。\n午前中はInstagramへはてなブログの記事を投稿するプログラムがログインまわりでうまく動かなくなっていたのでちょっと修正。このプログラムは200行程度で別にたいしたことはやってないのだけど、旅行後に書き出したので全てiPad(から繋いでいるサーバ)上で書いた。Macで書いた方が全然効率的なのだけど、iPadでもなんとか書ける感じ。\n昼前にホテルを立ち、空港側の大きなショッピングモール、セントラルエアポートプラザへ。ここで最後のカオソイ(9食目)を食べる。このモールはユニクロ等々も入っており、今後の旅程それなりに寒い地域にも行く予定になったため、ヒートテックを購入。後に日本との価格差を調べたら、約2倍の値段で驚愕。\n夕方、チェンマイの空港から1時間半のフライトで、ミャンマー中部の都市マンダレーに降り立つ。ミャンマーは、今回の世界一周ではシンガポール、マレーシア、タイ、カンボジア、ベトナム、ラオス、ミャンマーと七カ国目。ミャンマーは日本との時差は2時間半で、時差が30分刻みの国は初めてだ。\nマンダレーの空港は、何にも無い場所に作られた感じで、空港から市街地の道は暫く民家や街灯といった明かりが無く、月と夕焼けが綺麗に見えた。また、お坊さんすわりタバコをしていたのが印象的だった。ルアンパバーン、チェンマイ、マンダレーと来てどの都市もお坊さんをそこらへんで見かけるが、後の都市ほどお坊さんがカジュアルな感じになっている感があるなぁ。\nホテルについて案内された部屋は、エアコンのコンセント部にLEDの数字メーターがついていて「この数字のカウントが0になるとエアコンの電源が入ります」とのこと。カウントは300から始まり秒ごとに1減っていくため、毎回エアコンの電源を入れるとき5分待つことになる。機器に書かれた説明を読む感じ電圧の安定供給のようだけど、部屋コンセントの電圧も不安定だから(ミャンマーの電気インフラは弱いと聞く)こういう機器が必要なのかなぁ。いまググって調べたら、やはり電圧が不安定のためそのままだとうまく動かなかったり機械の故障につながるため取り付ける、とのことでなるほど〜。たしかにカウントダウンが終わった後のLED数値は220〜230ほどを行き来していて(ここでこの数字が電圧値だと気付く)高電圧国だと一般的な範囲におさまている。 \n\n"
]
}
],
"source": [
"def print_text_similar_results(search_text, parsed_mds, vect_texts, k=3):\n",
" results = vectorizer.transform([search_text])\n",
" for (score, index) in similar_top_k(results, vect_texts, k=5):\n",
" print('**', score, index)\n",
" print(parsed_mds[index][1], \"\\n\")\n",
" print(parsed_mds[index][0].rstrip(), \"\\n\")\n",
"\n",
"print_text_similar_results('カオソイ スープ', parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"** 0.5254903573187533 880\n{'Draft': False, 'Title': '🇮🇳インド最終日・妻の一時帰国 / 世界一周116日目', 'Date': '2020-01-23T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730074101.jpg', 'Slug': '2020/01/23/000000', 'Tags': ['life-and-consume', '世界一周']} \n\nインドの実質的な最終日(時間的には明日明け方もインドにいるため)。今日こそはニューデリー観光するぞ、と思ったのだけど、昨日に引き続いて体調が万全ではなく、軽い風邪のような症状で、悪化したら困ることと、それほど行きたい場所があるわけではなかったので今日も部屋でゆっくりの一日。\n妻はエアロシティ近くの病院で黄熱病の注射を打ってきたのだが、値段が300rs(約450円)でイエローカードも貰えたよう。日本で打つとたしか1万円以上かかり、タイで接種したときもたしか二千円ぐらいはした(それでも日本と比較すると激安)と思うのに、安いすぎる。\n夜はこれまたローカルの店で、チョーメンとオムレツ。ここのチョーメンはマギー(インドのインスタントラーメン)をフライパンでうまく調理してチョーメン(焼きそば風)にしていた。またオムレツはパンの枚数を聞かれたので、はじめは付け合わせにパンが出るのかと思ったのだが、オムレツの外ではなく、中にパンを挟んでいる感じの食べ物が出てきた。チャイもスパイスが効いていて美味しい。インドでチャイを頼むと、店によってスパイスあり・無しがある気がするんだけど、違いはなんなのだろうか。マサラチャイと表記されていると確実にスパイス入りなのだが、そうでもない店もそこそこあった。\n夜、妻は今月末に定期的な検査のためのフライトで日本へ飛び立ち、一旦別れる。\n——\nインドは約一ヶ月滞在して、インド全体の半分ぐらいを回ることができた。インドの旅行談を聞くと、大概騙されたとか大変だったとかそういう話が多かったので、最初は一ヶ月もいて大丈夫かなぁと少々不安だったのだが、あっというまの一ヶ月じゃまだまだインド観光不足でもっといろいろな場所に行きたい、と思うぐらい楽しめた。\n出会う人たちは、基本いい人たちばかりだったし、困ってるとおっせかいなほど助けてくれる。値段交渉は面倒だけれど、相場を知っていて慣れればそれほどストレスにならない。とりわけリクシャやタクシーの交渉は相場がUber等ですぐわかるしね。\nインドにいると、いろいろなものが足りてない。「きちんとしたもの」を見つけるのは大変で、だいたい何かが壊れていたり代用されていたり工夫されていたりする。インドの言葉で単純には意図を翻訳できない言葉「ジュガード」がある。知恵と工夫で資源が足りない中どうにかする、というらしいのだが、この「ジュガード」でどうにかしている物が溢れている。こんな適当で良いのか、という物もあれば、足が不自由な物乞いのおじいさんが乗っていた車椅子は、自転車を分解し溶接して作った物で、自転車のペダルを右手で回すと車椅子が動く作りになっていて、誰が作ったのか再利用でよくできてるなぁと感心した物だった。\nまた、非常に根深い貧困も至る所で感じることができ、色々と考えさせられる物がある。法律的には無くなったとはいえカーストや不可触民、自由意志で選択できない仕事などなど、昔よりは良くはなったのだろうが、その雰囲気はいまでも十分と感じられる。\nそんな感じで、インドはまだまだ混沌としていて様々な事が興味深く、そういう旅行を楽しめる人にとっては楽しい国だろうし、合わない人は二度と行きたくない国、と評価が二分されることが理解できた。 \n\n** 0.4103977040534393 882\n{'Draft': False, 'Title': '🇮🇳 アラップーラからティルヴァナンタプラムへ・コヴァーラムビーチ / 世界一周112日目', 'Date': '2020-01-19T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125332.jpg', 'Slug': '2020/01/19/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n日の出直前に目覚め、部屋の窓から外を見ると川の水面が朝焼けを反射して真っ赤。顔を洗って準備をして船の外に出ると、残念ながらあっという間にその時間は終わってしまったのだけど、幻想的な朝焼けだった。\n9時の予定通りにハウスボートはアップーラに戻り、そこからバスでケラーラ州の州都、ティルヴァナンタプラムへ約5時間かけて移動する。通路側の席に座ったのだが、廊下に立っている人が次々と手すりにお尻を乗せてくる。インド人は物理的な距離を近づけることが多く、列に並んでいても、後ろの人がピッタリとつくため、お腹が出ているおじさん(インドでは日本以上にお腹が出ている人を多く見かける)のお腹が背中を押すことが多々ある。\nホテルに荷物を下ろし、南インドで1番綺麗という噂のコヴァーラムビーチへ。きちんと掃除されており、確かにゴミがほとんど落ちていない綺麗なビーチでびっくり。ただ、海水や砂浜がとても綺麗、というよりは十分泳げるよね、ぐらいの綺麗さ。\nこのビーチの見所は、楽しく水遊びするインド人たち。泳ぐというよりは、足がつく深さまで行ったり、砂浜にしゃがんで水を浴びたりしているのだが、何よりみんなメチャクチャに楽しそうなのだ。初めて海に入った!といったようなはしゃぎっぷりは、見ているだけで大変楽しい。また、水着の人はほとんどおらず、老若男女、着の身着のまま海に入っており、普段水浴びを服のままするインドならではの光景。\nあまりにも平和で幸せそうな光景なので、ビーチサイドのパラソルとベンチを借りて、海と楽しそうなインドの人たちを見ながら日の入までをすごす。途中ぱらぱら雨が降ったりしたのだが、傘が必要な雨に出会ったのはカトマンズ以来一ヶ月ぶりだなぁ。\n夜はホテル近くのローカル南インド料理屋でカレー。ゴビ・マンチュリアンがあったので頼んだのだが、出てきたのはゴビ・カレー(なおゴビ・カレーもメニューにあった)で違うじゃん、と思いつつも大変美味しかったので問題なし。チャパティを頼んだらEgg?と聞かれたのでうん、と答えると、今までとは違った風味のチャパティが出てきて、これがデニッシュ生地のような風味豊かな感じで美味しい。妻曰く、卵を使っている(普通チャパティは卵は使わない)からこういう味になっていそう、とのこと。インドの主食、チャパティもいろいろな風味があって面白いなぁ。\n帰り道に、どんな味かと食べたかった赤いバナナを買う。食べるとちょっとサクサクして面白い食感。そして発酵したような香りが広がる。この匂い知ってるぞ、と考えると、納豆の匂いのような気がした。 \n\n** 0.37789127964300606 897\n{'Draft': False, 'Title': '🇮🇳アーユルヴェーダアビヤンガ・マンチュリアンのインド中華 / 世界一周108日目', 'Date': '2020-01-15T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125733.jpg', 'Slug': '2020/01/15/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n周辺の観光へ。マッタンチェリー宮殿は宮殿と言うより大きな建物、という感じで博物館のようになっていた。すぐ側のユダヤ教教会のパラデシ・シナゴークはかつてユダヤ人街があったことの名残だそう。スタッフの一人のTシャツが「ISRAEL」だったことが印象深かった。両方とも入場料が現地価格の5rs/10rs。インドはたいていの観光地が、外国人は別価格で10倍以上するので大変安く感じる。ただ、両方とも内部写真撮影NGであった。\nその後、アーユルヴェーダという現地の予防医学のマッサージ、アビヤンガを受ける。全身に塗りたくる薬草のオイルマッサージ。カジュアルな所で受けたため、全裸になった後インド人おじさんにもみくちゃにされた。直後は特に効いた、という感じはしないのだけど、明日スッキリしていたら効いたということなのだろうなぁ。\n夜は近所の魚も扱っているお店へ。最近魚を食べておらず、海岸沿いなので新鮮な魚も多そうで食べたくなったのだ。そのお店で、フィッシュカレーとフィッシュマンチュリアン(fish manchurian)なるものがあったので注文する。マンチュリアンは満州の、という意味で、インドで作る満州料理らしい。\nフィッシュカレーはマンゴーの酸味がちょっと効いた味で美味しかったのだが、それよりもフィッシュマンチュリアンが絶妙な旨さ。インド中華というとチョーメンをいくつも食べてきたのだが、うまい、というものに出会ったことがなかったのだが、ここのフィッシュマンチュリアンは、揚げフライの黒酢がけのような料理に、油とインド香辛料が加わり食べたことがない風味の旨さ。スープたっぷりジャバジャバ系だ。あまりの旨さにこのソースにつけながらチャパティを食べていたら食が進んで7枚も食べてしまった。大満足。なお、南インドのチャパティは薄く、北のチャパティとはだいぶ違う感じだ。 \n\n** 0.37360645690989364 884\n{'Draft': False, 'Title': '🇮🇳コチでゆっくりした1日 / 世界一周109日目', 'Date': '2020-01-16T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730112703.jpg', 'Slug': '2020/01/16/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n今日はとりわけなにをするでもなく、部屋で本を読んだりゲームしたりとゆっくりしていた。自分の場所を持たない海外旅行では、居るだけで疲れが徐々に溜まっていくので、時々息抜きが必要だ。\n昼飯は南インド料理のミールスを食べる。皿に食べるだけ米や野菜シャバシャバ系カレー(北インドで言うダルスープに近い)を配膳に来る人が盛ってくれる。ローカル店で食べた(80rs)のでおしゃれな感じではないが、おかわりも自由で腹一杯食べることができる。初めてシンガポールのインド料理やでミールスを食べた時はどう食べたらいいのか分からなくて戸惑ったが、何回か食べた今は慣れたなぁ。\n夜は昨日と同じ店で再びフィッシュマンチュリアンを食べる。やはり旨い。この味に出会うのはこれから先、難しい気がするのでもう一度食べておきたかったのだ。\nその後ATMで必要な現金の引き出し。インドのATMは機械に現金が足りてないのか、半分の確率ぐらいうまくキャッシングできない。また高額紙幣である2000rs札が出たのはニューデリーの空港のみで、他は全部500rs(750円相当)でひきだすことになって、札束をぎっしり持つことになる。クレジットカード支払いが少ない、というのもあるのだけど、クレジットカード払いでは何故かやたらと手数料が上乗せされて10%ぐらい高いことがザラだったので、ATMでキャッシングして払ったほうが2%の手数料なのでお得。なお2000rs札はUSにおける100ドル札みたいなもので、一般の店で出すと嫌がられる。500rs札でもお釣りがないお店も結構あるのでインドでは少額紙幣必須だ。\n——\nここケララ州の共通語はマラヤーラム語で、文字が丸っこくて可愛い。ただ、ヒンディ語・英語と並ぶと、文字あたりに対する情報量が少ないのか、同じ内容でも1.5倍ぐらいの表現領域が必要のようだ。またケララ州はインドの平均識字率が75%ほどに対して、ほぼ100%の識字率というから驚き。コチは海に面しているため古くからインド貿易拠点の1つで、ヨーロッパ文化も昔から入り、神学校なども多いのだけど、その辺も識字率に影響してるのだろうか。\nまたコチは一月でも平均最高気温が32度、最低気温が23度と夏という感じ(蚊が多い!)なのだけど、日照時間が年中ほとんど同じで、そのため年間を通してほとんどこの温度に変わりはないみたい。東南アジアやインドなど、四季が無いと温度的には過ごしやすいけど雨季は大変だし、日本の四季の有り難さ、気温というよりはうつり変わる風景、を改めて感じるなぁ。 \n\n** 0.3683284625070319 900\n{'Draft': False, 'Title': '🇮🇳チャール・ミーナール、ハイデラバードからコチへ / 世界一周106日目', 'Date': '2020-01-13T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801154856.jpg', 'Slug': '2020/01/13/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n市街地の南にある、イスラーム建築のチャール・ミーナールへ。周りはマーケット・屋台だらけで平日なのに混雑している。チャイ用の小さなコップもたくさん売っておりかわいい。インドのギラギラした装飾品を何か買いたかったので、妻にバングル(三つで200rs)と髪飾り(50rs)をちょっとしたプレゼントに買う。\nチャール・ミーナールからは東西南北に道が伸びているのだけど、西の道がどこもかしこも、さらに伸びている小道もバングル屋だらけで興味深かった。また、インドでよく見かけるお金を恵んで、という人もたくさんいたのだが、娘の写真を見せながら「娘が結婚するからお金が必要なので恵んでほしい」(英語ではないので分からないのだが、たぶんそのようなことを言っている)という老婆も居て、初めて見かけたタイプだった。インドはカーストによって女性側に多額の結婚資金が必要と聞くので、その足しにしたかったのかもしれない。\nハイデラバードの空港国内線のラウンジは、入場の敷居が低いようで(銀行系カードで入れる?)、空いている椅子を探すのも一苦労のごったがい。食事や飲み物は普通に提供されているのだが、人が多いためかすぐさま無くなって入れ替わり立ち替わり新しいものが運ばれていた。空港自体は羽田空港のように綺麗だ。\nフライト乗り場に行くと、裸足・黒装束・頭に荷物を乗せている方々に出会う。物の移動を楽にするための頭に荷物を乗せる、ではなく、なにか儀式的な感じでで乗せているようだ。調べてみると、どうやらこれから行くケラーラ州のサバリマラ寺院に巡礼に行く人たちのよう。サバリマラ寺院はヒンドゥー教の聖地の一つで、立ち入りが許可される数ヶ月の間に年間300〜400万人の男性(法律的には女性も入れるが、大規模な反対運動が巻き起こり、今でも実質女人禁制のようだ)が、巡礼では先ほどの格好をして訪れるという。sabarimalaで画像検索すると、まるでメッカのような混雑ぶりだ。\n1時間ちょっとのフライトで目的の南インド、ケラーラ州コチに到着。そこからたっぷり1時間タクシーに乗ってホテル(コチではほとんどがゲストハウスな感じで、家族経営の場所が宿泊施設)へ。家も部屋もとても綺麗で、トイレットペーパもバスタオルもシャンプーもドライヤー(今まではどこも無かった)も初めから置いてあり、ホットシャワーも出ることにびっくり。インドのホテルは大体何かが足りてないことがほとんどで、言わないときちんと補充されない、機能しないことばかりだったので、ここがいろいろな人が言っている「南インドは北とは同じインドとは思えないほど違うよ」と言われる南インドかぁ、と思ったのであった。 \n\n"
]
}
],
"source": [
"print_text_similar_results('インド', parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"** 0.18505554136063 891\n{'Draft': False, 'Title': '🇮🇳インド最大のショッピングモール、ルールモールへ / 世界一周110日目', 'Date': '2020-01-17T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801153058.jpg', 'Slug': '2020/01/17/000000', 'Tags': ['life-and-consume', '世界一周']} \n\nちょっと宿泊場所から離れている、コチ市内中心部にあるルール・インターナル・ショッピングモールへ。総面積ではインド最大らしい。\nまずはフェリーで移動のため、フェリー乗り場に行くと、チケット売りのおじさんが「ちょっと待って」と言って、買えたのが40分後。この「ちょっとまって」の意味合いに文化差を感じた待ち時間であった。\nフェリーで島を移動し、鉄道で最寄り駅まで行く。鉄道は最近開通したのか、車内は大変綺麗でクーラー完備、情報も液晶パネルに綺麗に表示される。なお駅名がEdapally Oppoとスポンサー名(Oppo)がついており、車内アナウンスや駅構内の表札もOppoがついていて、企業名が直接駅名につくのは興味深かった。\nショッピングモールはインドらしからぬ綺麗さ。そして高級ブランド以外の店舗はあんまり高くなく、現地の人も楽しめる価格設定。ただ、インド最大の面積とのことでどれだけ広いのだろう、と思っていたのだが、日本の郊外にある広大なイオンより狭い感じで、広さ的にはそこまで広さを感じなかった。\nまた、そこらかしこに制服を着た小学生が先生の引率を伴い居て、モールのアクティビティ、小型遊園地だったり、ゲームセンターだったり、モール内を走る幼児向け電車だったりを楽しんでいた。遠足なのだろうか、不思議な光景。\n昼飯はフードコートのインド中華屋で、ゴビマンチュリアン(カリフラワー唐揚げのマンチュリアン)。マンチュリアンは画像検索すると、スープ系のと酢豚(のような見た目)系のがあり、先日食べたのはスープ系で、酢豚系のものも食べてみたかったのだけど、ここは注文するとスープか酢豚系かを選ぶことができたので、迷わず酢豚系を選ぶ。これはこれでライスが進む味でとても美味い。味の系統も昨日のマンチュリアンと似ている。\nその後は店をいろいろ見つつ(とりわけ地下に広がるスーパーが広く楽しめた)、映画館もあったので、上映時間的にも内容的(ラブコメ)にもよさそうなボリウッドのjai mummy diを観る。ヒンディ語のみ(ここケララ州ではヒンディ語が解る人が少ない、他の映画はマラヤーラム語だったり、英語字幕がついていたりする)だからなのか、600以上ある座席に20人ほどとガラガラで、周りのインドの人の反応が楽しめなかったのは残念だ。\n映画の内容は、家が隣同士の恋人二人なのだが、母親通しが昔から仲がとても悪く結婚できず、一度は険悪になったり、お互い別の人と結婚させられそうになりながら…というストーリー(たぶん)で、これも言葉がわからないながらも映画自体は楽しめた。\n夕食はモールにあるバーガーキング。こちらもマックと同じく、ビーフは取り扱っておらず、チキンとベジ系のバーガーやラッパー等々。ただマックよりも値段が安く(ハンバーガー二つで89rs)、またジャンク系な味のもの各種を取り扱っており、低価格ながらジャンクフードが味わえた。\n最初はショッピングモール、ぐるっと見て3時間ぐらいで満足かなと思っていたのだけど、久しぶりの綺麗なショッピングモールということもあり、8時間以上滞在し満足な1日だった。 \n\n** 0.1751712732491898 897\n{'Draft': False, 'Title': '🇮🇳アーユルヴェーダアビヤンガ・マンチュリアンのインド中華 / 世界一周108日目', 'Date': '2020-01-15T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125733.jpg', 'Slug': '2020/01/15/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n周辺の観光へ。マッタンチェリー宮殿は宮殿と言うより大きな建物、という感じで博物館のようになっていた。すぐ側のユダヤ教教会のパラデシ・シナゴークはかつてユダヤ人街があったことの名残だそう。スタッフの一人のTシャツが「ISRAEL」だったことが印象深かった。両方とも入場料が現地価格の5rs/10rs。インドはたいていの観光地が、外国人は別価格で10倍以上するので大変安く感じる。ただ、両方とも内部写真撮影NGであった。\nその後、アーユルヴェーダという現地の予防医学のマッサージ、アビヤンガを受ける。全身に塗りたくる薬草のオイルマッサージ。カジュアルな所で受けたため、全裸になった後インド人おじさんにもみくちゃにされた。直後は特に効いた、という感じはしないのだけど、明日スッキリしていたら効いたということなのだろうなぁ。\n夜は近所の魚も扱っているお店へ。最近魚を食べておらず、海岸沿いなので新鮮な魚も多そうで食べたくなったのだ。そのお店で、フィッシュカレーとフィッシュマンチュリアン(fish manchurian)なるものがあったので注文する。マンチュリアンは満州の、という意味で、インドで作る満州料理らしい。\nフィッシュカレーはマンゴーの酸味がちょっと効いた味で美味しかったのだが、それよりもフィッシュマンチュリアンが絶妙な旨さ。インド中華というとチョーメンをいくつも食べてきたのだが、うまい、というものに出会ったことがなかったのだが、ここのフィッシュマンチュリアンは、揚げフライの黒酢がけのような料理に、油とインド香辛料が加わり食べたことがない風味の旨さ。スープたっぷりジャバジャバ系だ。あまりの旨さにこのソースにつけながらチャパティを食べていたら食が進んで7枚も食べてしまった。大満足。なお、南インドのチャパティは薄く、北のチャパティとはだいぶ違う感じだ。 \n\n** 0.08322982786518927 882\n{'Draft': False, 'Title': '🇮🇳 アラップーラからティルヴァナンタプラムへ・コヴァーラムビーチ / 世界一周112日目', 'Date': '2020-01-19T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125332.jpg', 'Slug': '2020/01/19/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n日の出直前に目覚め、部屋の窓から外を見ると川の水面が朝焼けを反射して真っ赤。顔を洗って準備をして船の外に出ると、残念ながらあっという間にその時間は終わってしまったのだけど、幻想的な朝焼けだった。\n9時の予定通りにハウスボートはアップーラに戻り、そこからバスでケラーラ州の州都、ティルヴァナンタプラムへ約5時間かけて移動する。通路側の席に座ったのだが、廊下に立っている人が次々と手すりにお尻を乗せてくる。インド人は物理的な距離を近づけることが多く、列に並んでいても、後ろの人がピッタリとつくため、お腹が出ているおじさん(インドでは日本以上にお腹が出ている人を多く見かける)のお腹が背中を押すことが多々ある。\nホテルに荷物を下ろし、南インドで1番綺麗という噂のコヴァーラムビーチへ。きちんと掃除されており、確かにゴミがほとんど落ちていない綺麗なビーチでびっくり。ただ、海水や砂浜がとても綺麗、というよりは十分泳げるよね、ぐらいの綺麗さ。\nこのビーチの見所は、楽しく水遊びするインド人たち。泳ぐというよりは、足がつく深さまで行ったり、砂浜にしゃがんで水を浴びたりしているのだが、何よりみんなメチャクチャに楽しそうなのだ。初めて海に入った!といったようなはしゃぎっぷりは、見ているだけで大変楽しい。また、水着の人はほとんどおらず、老若男女、着の身着のまま海に入っており、普段水浴びを服のままするインドならではの光景。\nあまりにも平和で幸せそうな光景なので、ビーチサイドのパラソルとベンチを借りて、海と楽しそうなインドの人たちを見ながら日の入までをすごす。途中ぱらぱら雨が降ったりしたのだが、傘が必要な雨に出会ったのはカトマンズ以来一ヶ月ぶりだなぁ。\n夜はホテル近くのローカル南インド料理屋でカレー。ゴビ・マンチュリアンがあったので頼んだのだが、出てきたのはゴビ・カレー(なおゴビ・カレーもメニューにあった)で違うじゃん、と思いつつも大変美味しかったので問題なし。チャパティを頼んだらEgg?と聞かれたのでうん、と答えると、今までとは違った風味のチャパティが出てきて、これがデニッシュ生地のような風味豊かな感じで美味しい。妻曰く、卵を使っている(普通チャパティは卵は使わない)からこういう味になっていそう、とのこと。インドの主食、チャパティもいろいろな風味があって面白いなぁ。\n帰り道に、どんな味かと食べたかった赤いバナナを買う。食べるとちょっとサクサクして面白い食感。そして発酵したような香りが広がる。この匂い知ってるぞ、と考えると、納豆の匂いのような気がした。 \n\n** 0.07888857880023883 830\n{'Draft': False, 'Title': '🇴🇲マスカットのマトラの海辺を歩く・マトラフォート / 世界一周138日目', 'Date': '2020-02-14T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200731/20200731062525.jpg', 'Slug': '2020/02/14/000000', 'Tags': ['life-and-consume', '世界一周']} \n\n午前中は部屋でゆっくり過ごし、昼ごはんはホテル側の南インド料理屋へ。ゴビ・マンチュリアンがあったので迷わず頼む。チャパティも一緒に頼み、久しぶりの南インド料理で安心する味。インド人が首を左右に振るyesも懐かしい気分。インドでは注文時に辛さ控えめと毎度言っていたのだけど、中東に来てからアラブ人は暑い場所に住んでいるのに、唐辛子系の辛さがあまり得意でないのか、辛い料理がほとんどなく、普通に普通に注文たらしたら結構ピリ辛な味だった。美味しいけどお腹が心配だ。\nその後はルイから海辺のマトラへバスで移動し海辺を歩く。目の前には海岸線が広がるのだが、すぐ街の裏は岩山がそびえ不思議な街並みだ。カモメも餌おじさん(パンくずなどをばら撒く現地のおじさんが沢山いる)の餌を狙って、やたらと海辺で泳いでいる。\n海岸線を歩いて行くと、砦のようなものがあり、調べるとマトラフォートという砦らしい。登れるようなので裏手から登ると、マトラ地区全体が見渡せる。高台なので風も心地よく、砦に座って本を読みながら過ごす。大きなスークを冷やかした後、海辺で暗くなるのを待っていると、日の入りの時間か、モスクからアザーンの「アッラーアクバル〜」の声がしたのだけど、複数のモスクがあるからか、数箇所からいろいろな呼びかけが鳴り響く。どれも読み上げる表現が異なり、違いが面白い。\n晩ご飯はベジタリアン料理屋に入ったのだけど、ここも南インド料理屋で、マサラドーサを頼む。マサラの中身はジャガイモとコーン、玉ねぎで程よい甘さで好みで美味しい。食後にチャイを頼むと、小さなデザートをつけてくれて嬉しいサービス。これで0.9OMR(250円ほど)でお安い。バーレーンでもオマーンでもインド料理屋はそこら中で見かけ(ドバイはビル立ち並ぶ場所に居たので行く機会がなかったけど、沢山あるはず)、どこも安くて美味しいので助かるなぁ。\nそういえば今日はバレンタインデーだが、同じムスリルが多いインドネシアはバレンタイン反対運動が毎年起こっているのだけど、オマーンではバレンタイン的なものは地元の商業施設に行っても全く何もない感じだった。 \n\n** 0.0 473\n{'Draft': False, 'Title': 'FreshReader', 'Date': '2006-01-25T00:00:00+09:00', 'Image': None, 'Slug': '2006/01/25-subtech', 'Tags': ['subtech']} \n\nFreshReader\n使ってみた。以下雑感。\n\nクローラの二重起動防止(1分ロック?)\nソースの難読化(ioncube利用?)\n設置はp2よりも楽\nphpだからthreadできなくてクローラが遅い。約350フィードの巡回に\n\n```\n$ time php -f crawler.php\nphp -f /home/gorou/public_rails2u/auth_area/freshreader/crawler.php 13.07s user 0.60s system 2% cpu 8:36.88 total\n二回目\n$ time php -f crawler.php\nphp -f /home/gorou/public_rails2u/auth_area/freshreader/crawler.php 4.95s user 0.28s system 2% cpu 4:07.13 total\n```\nぐらいかかる@ftth-Pen4 2.2G 鯖\n\nhelpがrootでcronる!と書いてある。べつにrootじゃなくてOKなケースのほうが多い気もするんだけど。これはftpでとりあえず755に、みたいな説明みたいでいやん。\nlighttpd + fastcgi ( php 5.0.5 ) で問題なく起動\nbloglinesのOPMLのネスト構造を正常にインポートできない\n\nみたいな。高速に動いてサクサクなのはいいし、webインターフェイス+Ajaxで手動更新できるのも良いのだけど、相手先サーバの付加分散のためのフィードデータ共有システムは無いっぽいし、共用レンサバに設置したら結構アレゲぽ。それとインターフェイスがbloglinesを一つも超えてないのでそこらへんが。せめてキーボードショートカットが無いとなぁ。今後に期待。三千円ぐらいだったら結構売れそうな予感。 \n\n"
]
}
],
"source": [
"print_text_similar_results('マンチュリアン', parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Draft': False, 'Title': '🇮🇳インド最終日・妻の一時帰国 / 世界一周116日目', 'Date': '2020-01-23T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730074101.jpg', 'Slug': '2020/01/23/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"インドの実質的な最終日(時間的には明日明け方もインドにいるため)。今日こそはニューデリー観光するぞ、と思ったのだけど、昨日に引き続いて体調が万全ではなく、軽い風邪のような症状で、悪化したら困ることと、それほど行きたい場所があるわけではなかったので今日も部屋でゆっくりの一日。\n",
"妻はエアロシティ近くの病院で黄熱病の注射を打ってきたのだが、値段が300rs(約450円)でイエローカードも貰えたよう。日本で打つとたしか1万円以上かかり、タイで接種したときもたしか二千円ぐらいはした(それでも日本と比較すると激安)と思うのに、安いすぎる。\n",
"夜はこれまたローカルの店で、チョーメンとオムレツ。ここのチョーメンはマギー(インドのインスタントラーメン)をフライパンでうまく調理してチョーメン(焼きそば風)にしていた。またオムレツはパンの枚数を聞かれたので、はじめは付け合わせにパンが出るのかと思ったのだが、オムレツの外ではなく、中にパンを挟んでいる感じの食べ物が出てきた。チャイもスパイスが効いていて美味しい。インドでチャイを頼むと、店によってスパイスあり・無しがある気がするんだけど、違いはなんなのだろうか。マサラチャイと表記されていると確実にスパイス入りなのだが、そうでもない店もそこそこあった。\n",
"夜、妻は今月末に定期的な検査のためのフライトで日本へ飛び立ち、一旦別れる。\n",
"——\n",
"インドは約一ヶ月滞在して、インド全体の半分ぐらいを回ることができた。インドの旅行談を聞くと、大概騙されたとか大変だったとかそういう話が多かったので、最初は一ヶ月もいて大丈夫かなぁと少々不安だったのだが、あっというまの一ヶ月じゃまだまだインド観光不足でもっといろいろな場所に行きたい、と思うぐらい楽しめた。\n",
"出会う人たちは、基本いい人たちばかりだったし、困ってるとおっせかいなほど助けてくれる。値段交渉は面倒だけれど、相場を知っていて慣れればそれほどストレスにならない。とりわけリクシャやタクシーの交渉は相場がUber等ですぐわかるしね。\n",
"インドにいると、いろいろなものが足りてない。「きちんとしたもの」を見つけるのは大変で、だいたい何かが壊れていたり代用されていたり工夫されていたりする。インドの言葉で単純には意図を翻訳できない言葉「ジュガード」がある。知恵と工夫で資源が足りない中どうにかする、というらしいのだが、この「ジュガード」でどうにかしている物が溢れている。こんな適当で良いのか、という物もあれば、足が不自由な物乞いのおじいさんが乗っていた車椅子は、自転車を分解し溶接して作った物で、自転車のペダルを右手で回すと車椅子が動く作りになっていて、誰が作ったのか再利用でよくできてるなぁと感心した物だった。\n",
"また、非常に根深い貧困も至る所で感じることができ、色々と考えさせられる物がある。法律的には無くなったとはいえカーストや不可触民、自由意志で選択できない仕事などなど、昔よりは良くはなったのだろうが、その雰囲気はいまでも十分と感じられる。\n",
"そんな感じで、インドはまだまだ混沌としていて様々な事が興味深く、そういう旅行を楽しめる人にとっては楽しい国だろうし、合わない人は二度と行きたくない国、と評価が二分されることが理解できた。 \n",
"\n",
"** 0.2667401526404482 900\n",
"{'Draft': False, 'Title': '🇮🇳チャール・ミーナール、ハイデラバードからコチへ / 世界一周106日目', 'Date': '2020-01-13T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801154856.jpg', 'Slug': '2020/01/13/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"市街地の南にある、イスラーム建築のチャール・ミーナールへ。周りはマーケット・屋台だらけで平日なのに混雑している。チャイ用の小さなコップもたくさん売っておりかわいい。インドのギラギラした装飾品を何か買いたかったので、妻にバングル(三つで200rs)と髪飾り(50rs)をちょっとしたプレゼントに買う。\n",
"チャール・ミーナールからは東西南北に道が伸びているのだけど、西の道がどこもかしこも、さらに伸びている小道もバングル屋だらけで興味深かった。また、インドでよく見かけるお金を恵んで、という人もたくさんいたのだが、娘の写真を見せながら「娘が結婚するからお金が必要なので恵んでほしい」(英語ではないので分からないのだが、たぶんそのようなことを言っている)という老婆も居て、初めて見かけたタイプだった。インドはカーストによって女性側に多額の結婚資金が必要と聞くので、その足しにしたかったのかもしれない。\n",
"ハイデラバードの空港国内線のラウンジは、入場の敷居が低いようで(銀行系カードで入れる?)、空いている椅子を探すのも一苦労のごったがい。食事や飲み物は普通に提供されているのだが、人が多いためかすぐさま無くなって入れ替わり立ち替わり新しいものが運ばれていた。空港自体は羽田空港のように綺麗だ。\n",
"フライト乗り場に行くと、裸足・黒装束・頭に荷物を乗せている方々に出会う。物の移動を楽にするための頭に荷物を乗せる、ではなく、なにか儀式的な感じでで乗せているようだ。調べてみると、どうやらこれから行くケラーラ州のサバリマラ寺院に巡礼に行く人たちのよう。サバリマラ寺院はヒンドゥー教の聖地の一つで、立ち入りが許可される数ヶ月の間に年間300〜400万人の男性(法律的には女性も入れるが、大規模な反対運動が巻き起こり、今でも実質女人禁制のようだ)が、巡礼では先ほどの格好をして訪れるという。sabarimalaで画像検索すると、まるでメッカのような混雑ぶりだ。\n",
"1時間ちょっとのフライトで目的の南インド、ケラーラ州コチに到着。そこからたっぷり1時間タクシーに乗ってホテル(コチではほとんどがゲストハウスな感じで、家族経営の場所が宿泊施設)へ。家も部屋もとても綺麗で、トイレットペーパもバスタオルもシャンプーもドライヤー(今まではどこも無かった)も初めから置いてあり、ホットシャワーも出ることにびっくり。インドのホテルは大体何かが足りてないことがほとんどで、言わないときちんと補充されない、機能しないことばかりだったので、ここがいろいろな人が言っている「南インドは北とは同じインドとは思えないほど違うよ」と言われる南インドかぁ、と思ったのであった。 \n",
"\n",
"** 0.2572780128900834 884\n",
"{'Draft': False, 'Title': '🇮🇳コチでゆっくりした1日 / 世界一周109日目', 'Date': '2020-01-16T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200730/20200730112703.jpg', 'Slug': '2020/01/16/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"今日はとりわけなにをするでもなく、部屋で本を読んだりゲームしたりとゆっくりしていた。自分の場所を持たない海外旅行では、居るだけで疲れが徐々に溜まっていくので、時々息抜きが必要だ。\n",
"昼飯は南インド料理のミールスを食べる。皿に食べるだけ米や野菜シャバシャバ系カレー(北インドで言うダルスープに近い)を配膳に来る人が盛ってくれる。ローカル店で食べた(80rs)のでおしゃれな感じではないが、おかわりも自由で腹一杯食べることができる。初めてシンガポールのインド料理やでミールスを食べた時はどう食べたらいいのか分からなくて戸惑ったが、何回か食べた今は慣れたなぁ。\n",
"夜は昨日と同じ店で再びフィッシュマンチュリアンを食べる。やはり旨い。この味に出会うのはこれから先、難しい気がするのでもう一度食べておきたかったのだ。\n",
"その後ATMで必要な現金の引き出し。インドのATMは機械に現金が足りてないのか、半分の確率ぐらいうまくキャッシングできない。また高額紙幣である2000rs札が出たのはニューデリーの空港のみで、他は全部500rs(750円相当)でひきだすことになって、札束をぎっしり持つことになる。クレジットカード支払いが少ない、というのもあるのだけど、クレジットカード払いでは何故かやたらと手数料が上乗せされて10%ぐらい高いことがザラだったので、ATMでキャッシングして払ったほうが2%の手数料なのでお得。なお2000rs札はUSにおける100ドル札みたいなもので、一般の店で出すと嫌がられる。500rs札でもお釣りがないお店も結構あるのでインドでは少額紙幣必須だ。\n",
"——\n",
"ここケララ州の共通語はマラヤーラム語で、文字が丸っこくて可愛い。ただ、ヒンディ語・英語と並ぶと、文字あたりに対する情報量が少ないのか、同じ内容でも1.5倍ぐらいの表現領域が必要のようだ。またケララ州はインドの平均識字率が75%ほどに対して、ほぼ100%の識字率というから驚き。コチは海に面しているため古くからインド貿易拠点の1つで、ヨーロッパ文化も昔から入り、神学校なども多いのだけど、その辺も識字率に影響してるのだろうか。\n",
"またコチは一月でも平均最高気温が32度、最低気温が23度と夏という感じ(蚊が多い!)なのだけど、日照時間が年中ほとんど同じで、そのため年間を通してほとんどこの温度に変わりはないみたい。東南アジアやインドなど、四季が無いと温度的には過ごしやすいけど雨季は大変だし、日本の四季の有り難さ、気温というよりはうつり変わる風景、を改めて感じるなぁ。 \n",
"\n",
"** 0.2521848471192742 897\n",
"{'Draft': False, 'Title': '🇮🇳アーユルヴェーダアビヤンガ・マンチュリアンのインド中華 / 世界一周108日目', 'Date': '2020-01-15T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125733.jpg', 'Slug': '2020/01/15/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"周辺の観光へ。マッタンチェリー宮殿は宮殿と言うより大きな建物、という感じで博物館のようになっていた。すぐ側のユダヤ教教会のパラデシ・シナゴークはかつてユダヤ人街があったことの名残だそう。スタッフの一人のTシャツが「ISRAEL」だったことが印象深かった。両方とも入場料が現地価格の5rs/10rs。インドはたいていの観光地が、外国人は別価格で10倍以上するので大変安く感じる。ただ、両方とも内部写真撮影NGであった。\n",
"その後、アーユルヴェーダという現地の予防医学のマッサージ、アビヤンガを受ける。全身に塗りたくる薬草のオイルマッサージ。カジュアルな所で受けたため、全裸になった後インド人おじさんにもみくちゃにされた。直後は特に効いた、という感じはしないのだけど、明日スッキリしていたら効いたということなのだろうなぁ。\n",
"夜は近所の魚も扱っているお店へ。最近魚を食べておらず、海岸沿いなので新鮮な魚も多そうで食べたくなったのだ。そのお店で、フィッシュカレーとフィッシュマンチュリアン(fish manchurian)なるものがあったので注文する。マンチュリアンは満州の、という意味で、インドで作る満州料理らしい。\n",
"フィッシュカレーはマンゴーの酸味がちょっと効いた味で美味しかったのだが、それよりもフィッシュマンチュリアンが絶妙な旨さ。インド中華というとチョーメンをいくつも食べてきたのだが、うまい、というものに出会ったことがなかったのだが、ここのフィッシュマンチュリアンは、揚げフライの黒酢がけのような料理に、油とインド香辛料が加わり食べたことがない風味の旨さ。スープたっぷりジャバジャバ系だ。あまりの旨さにこのソースにつけながらチャパティを食べていたら食が進んで7枚も食べてしまった。大満足。なお、南インドのチャパティは薄く、北のチャパティとはだいぶ違う感じだ。 \n",
"\n",
"** 0.23869959486688896 882\n",
"{'Draft': False, 'Title': '🇮🇳 アラップーラからティルヴァナンタプラムへ・コヴァーラムビーチ / 世界一周112日目', 'Date': '2020-01-19T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801125332.jpg', 'Slug': '2020/01/19/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"日の出直前に目覚め、部屋の窓から外を見ると川の水面が朝焼けを反射して真っ赤。顔を洗って準備をして船の外に出ると、残念ながらあっという間にその時間は終わってしまったのだけど、幻想的な朝焼けだった。\n",
"9時の予定通りにハウスボートはアップーラに戻り、そこからバスでケラーラ州の州都、ティルヴァナンタプラムへ約5時間かけて移動する。通路側の席に座ったのだが、廊下に立っている人が次々と手すりにお尻を乗せてくる。インド人は物理的な距離を近づけることが多く、列に並んでいても、後ろの人がピッタリとつくため、お腹が出ているおじさん(インドでは日本以上にお腹が出ている人を多く見かける)のお腹が背中を押すことが多々ある。\n",
"ホテルに荷物を下ろし、南インドで1番綺麗という噂のコヴァーラムビーチへ。きちんと掃除されており、確かにゴミがほとんど落ちていない綺麗なビーチでびっくり。ただ、海水や砂浜がとても綺麗、というよりは十分泳げるよね、ぐらいの綺麗さ。\n",
"このビーチの見所は、楽しく水遊びするインド人たち。泳ぐというよりは、足がつく深さまで行ったり、砂浜にしゃがんで水を浴びたりしているのだが、何よりみんなメチャクチャに楽しそうなのだ。初めて海に入った!といったようなはしゃぎっぷりは、見ているだけで大変楽しい。また、水着の人はほとんどおらず、老若男女、着の身着のまま海に入っており、普段水浴びを服のままするインドならではの光景。\n",
"あまりにも平和で幸せそうな光景なので、ビーチサイドのパラソルとベンチを借りて、海と楽しそうなインドの人たちを見ながら日の入までをすごす。途中ぱらぱら雨が降ったりしたのだが、傘が必要な雨に出会ったのはカトマンズ以来一ヶ月ぶりだなぁ。\n",
"夜はホテル近くのローカル南インド料理屋でカレー。ゴビ・マンチュリアンがあったので頼んだのだが、出てきたのはゴビ・カレー(なおゴビ・カレーもメニューにあった)で違うじゃん、と思いつつも大変美味しかったので問題なし。チャパティを頼んだらEgg?と聞かれたのでうん、と答えると、今までとは違った風味のチャパティが出てきて、これがデニッシュ生地のような風味豊かな感じで美味しい。妻曰く、卵を使っている(普通チャパティは卵は使わない)からこういう味になっていそう、とのこと。インドの主食、チャパティもいろいろな風味があって面白いなぁ。\n",
"帰り道に、どんな味かと食べたかった赤いバナナを買う。食べるとちょっとサクサクして面白い食感。そして発酵したような香りが広がる。この匂い知ってるぞ、と考えると、納豆の匂いのような気がした。 \n",
"\n",
"** 0.2302787944042146 890\n",
"{'Draft': False, 'Title': '🇮🇳ニューデリーでゆっくりと過ごす / 世界一周115日目', 'Date': '2020-01-22T00:00:00+09:00', 'Image': 'https://cdn-ak.f.st-hatena.com/images/fotolife/s/secondlife/20200801/20200801141658.jpg', 'Slug': '2020/01/22/000000', 'Tags': ['life-and-consume', '世界一周']} \n",
"\n",
"朝起きると、疲労がたまってるなという体調。今日はニューデリー市内観光予定だったが、最近は移動&観光でゆっくり出来てなかったため、一人ホテルでゆっくりとすることにする。昼間は寝て疲れを取ったり、本を読んだり、日記を書いて過ごす。\n",
"朝食はまたパラタを食べる。ゴビパラタやオニオンパラタ、ジンジャーパラタなど、プレーンなパラタの中に様々な具が詰まっていて熱々で美味しい。パラタの美味しさに今さらながら気づいたのだけど、インド来た時からこの美味しさに気付いていれば、もっと注文していたのに残念だ。おやつにコロッケの中身を揚げてスパイスソースをかけた物、夜ご飯はチャーハンとターリー、デザートにホットミルクとインドお菓子。\n",
"ホテルの共用スペースに、紙コップ、ティーパック、粉乳、砂糖、お湯も出るウォーターサーバが置いてあるので、簡単にチャイを作れて便利。チャイは店によって作り方は様々だが、簡単な所だとティーパックと砂糖、そして粉乳を混ぜるだけ。生乳ではないクリープ的な物が今まで苦手だったのだけど、粉乳だと嫌な感じはせず、日本でも生乳代わりに日持ちする粉乳を用意しておくのも良いかもなぁ。\n",
"——\n",
"インドに来て約一ヶ月、ほとんど現金ばかり使っている。インドに来る前はQRコード決済大手のpaytmがどれぐらい使われているのかなぁと興味津々だったのだけど、現地で決済をしている人を未だに見たことがない。paytm対応のシールを貼っているお店やリクシャは時々見かけるのだが、使っている人はおらず、地方都市や観光地はもちろんのこと、ニューデリー、ムンバイといった大都市や、ITでは2位の都市ハイデラバードでも見ていない。なおpaytmは基本インドの銀行口座が必要なため、使えれば使いたかったが、残念ながら使えていない。インドではスマートフォンの普及率がまだ25%ほどだし、銀行口座普及率が70%、識字率が75%ほどなので、QR決済が中国のようになるには長い時間が必要そうだ。\n",
"クレジットカードは手数料を10%以上上乗せしてくる店もあったりするため、高すぎて基本は使わない。なお、マレー半島〜インドでは、クレカ手数料は基本カード利用者側が負担する。Booking.comやAgodaで予約した宿泊費もホテル現金払いがほとんど(資金繰りの関係だろうか、銀行口座に入金があると困るからだろうか?)だし、タクシー配車のUberやOLAは国外発行のクレジットカードでは支払いできず、毎回現金で払っている。\n",
"今まで巡った国では、シンガポールとマレーシアはGrabPayがそこそこつかえ、タイではカード決済がそこそこ使えたが、それ以降は現金がほとんど。中国のどこもかしこもQRコードで支払いが可能、というのはほんと特異な状況なのだなぁ。 \n",
"\n"
]
}
],
"source": [
"print_similar_results(880, parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"** 0.10121002363564444 974\n{'Title': '髪を切る・TENET・川村屋の蕎麦 / 2020年10月14日', 'Date': datetime.datetime(2020, 10, 14, 20, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\nOculus を買ったからか、髪が邪魔に感じるようになり散髪へ。髪は、というか身だしなみ全般、無頓着なのが、コロナで人に合わなくなると拍車がかかり、普通の美容院から最近は短時間で安価なスピードカット店に行くようになった。\nクリストファー・ノーラン最新作の TENET を近くの IMAX シアターで見る。映画館はソーシャルディスタンスで隣の席が必ず開くようになっていて、夕方の時間帯ということもあって割とがらがらで快適。TENET はクリストファー・ノーランらしく時間が絡むSFなのだけど、あれ、どうなってるの、どうなるの、という感じで2時間30分があっという間に過ぎる。最初は「ふむふむ、アレがコレで完全に理解した」という感じで見ていたのだけど、途中から「あれ?」、最後は「ふむふむ、大筋はたぶんわかったけど細部はわからん!」という。ネットにたくさん出ている考察を見てから、もう一度見たい、と思わせる作品だった。\nまた TENET にはいくつかの国が登場するんだけど、ムンバイのインド門とその周辺とか、タリンの旧市街そばの道路とか見たことのある景色が出てきて、その部分も楽しめた。\n\n夜ご飯は一度行ってみたかった、桜木町駅の立ち食いそば屋、川村屋でそばを食べる。出汁がうまい。その後、ちょっと散歩して帰宅する。 \n\n** 0.0934010827972491 518\n{'Draft': False, 'Title': '2006-09-02', 'Date': '2006-09-02T00:00:00+09:00', 'Image': None, 'Slug': '2006/09/02-subtech', 'Tags': ['subtech']} \n\nアニメがお仕事! 5巻 / 石田敦子\nお、帯が谷川史子だ。\n\n同じ景色を見てる気にならないように\n\nう。\n\nアニメがお仕事! 5 (ヤングキングコミックス)\n\n作者: 石田敦子\n出版社/メーカー: 少年画報社\n発売日: 2006/08/28\nメディア: コミック\nクリック: 14回\nこの商品を含むブログ (45件) を見る\n\n散髪行きたい\nめ\n範囲選択内容をごにょる\n\\%V で vim7 からならごにょれるなんて素晴らしすぎる。see :h pattern-overview\ngerry += 1\nけつがいたい…\n数値文字参照に置換\nキタコレ。つか perl の e オプション相当の正規表現置換も \\= と submatch() 使うことによってできるんだーすげー。\n:s/./\\='&#' . char2nr(submatch(0)) . ';'/g\n:echo substitute('あaいi', '.', '\\= \"&#\" . char2nr(submatch(0)) . \";\"', 'g')\n&#12354;&#97;&#12356;&#105;\nvim で UTF-8 の charcode とか調べる\nga g8 しらんかった…。いままで数値文字参照をいちいち調べてたのが馬鹿みたいだ。\nCSS2 Specification順でsortするスクリプト\nhttp://d.hatena.ne.jp/mhrs/20060902/p1\nあ、すいません。ライセンス明記してなかったですね。というわけで MIT ライセンスであることをソースの方に記述しました。\nちょっと改変したり組み込みたいときにライセンスが解らないとめんどくさい!と常日頃から云っている自分ですが、自分の短いコードにはライセンスは書かない、という…。\nデスクトップが\nミニマルな音楽を奏でながらスレーブの HDD のスイッチから異音が…。youpy さんに聴かせたい。2分ぐらいたったらハングアップした。さてどうなる事やら…。\n家での作業\n机が狭い、ってこともさることながら椅子がなぁ。いい椅子ほしいよぅ、でも試座しにいくのがめんどくさくてまだ買えてない、という。。\n終末の過ごし方\n原稿 \n\n** 0.08939505126928748 601\n{'Title': '2021年4月16日', 'Date': datetime.datetime(2021, 4, 16, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': True, 'Image': None, 'Tags': ['diary']} \n\n最近、今日 ヤバイ奴に会ったという、インドの屋台を色々紹介するYouTubeを見ていて、懐かしみとともにコレ系の飯が食べたくなり、また昨日食べた鍋のシメラーメンた美味しかったので、インド屋台風ラーメンを昼食に作る。\n大きいフライパンに大量に油を入れ、卵を揚げ、刻んだキャベツやネギを入れる。キムチと水を追加し、いろいろな調味料を入れる。マサラ、コリアンダー、クミン、チリパウダー、鶏ガラスープの元、オイスターソース、コチュジャン、塩、輪切り唐辛子、にんにく。ゆだった所で、バリバリに砕いた辛ラーメンを入れひと煮立ちしたら、辛ラーメンの粉を入れ、麺が柔らかくまで炒める(煮る?)。\n\n出来上がりの見た目は置いておいて、食べ物の味はかなり辛くて美味しい。何でも調味料を入れるととりあえずコクや深みが出る、はカレーのよう。トマトなんか入れても美味しそう。また作りたい。\nしかしながら、午後は唐辛子取りすぎた感じの少々体調悪目に。もうちょっと辛ラーメンの粉は少なくて良かった。\n\n夕方、散髪に行く。約1.5ヶ月ぶり。\n\nchrome の規定の検索エンジンを duckduckgo の変えてみる。duckduckgo、何が良いかって、プログラミング用語で検索すると(標準では英語ということも有り)オフィシャルのドキュメントがヒットすること。\nGoogle 日本語版は雨後の筍のようなプログラミングまとめサイトにより、しょうもないサイトがたくさん引っかかてしまう。しばらくduckduckgoを使ってみよう。\n\n機械学習学習日記 - 74日目\nAppleのOSS ML Toolkitである、Turi Createを見る。汎用的な機械学習タスク(含むニューラルネットワーク)はあらかと揃っていて、また pandas DataFrameから Turi Create でデータを扱う形式に変換できるので使いやすい。どれも iOS で動く Core ML のモデルに変換できるようなのだけど、それを使わなくても利用しやすいインターフェイスが提供されていて、とりあえずなんかやる、という時に学習コスト低く始められそう。ドキュメントに含まれてるMachine learning essentialsも必要最低限の説明で良いのでは。\nOne-Shot Object Detectionは、いわゆるMRでのマーカを使ったアプリに適してるし、Activity ClassifierはwatchOS等に適してるしで、iOS 向けの汎用機能も実装されてある。 \n\n** 0.0854459782162957 241\n{'Title': 'すき焼きうまい / 2021年3月2日', 'Date': datetime.datetime(2021, 3, 2, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n\nふるさと納税返礼品でもらったおいしいお肉で、晩御飯はすき焼き。久しぶりの脳に直撃する美味しさ!!!!!!!!1。すき焼きは良い肉だと家庭でもめちゃくちゃ美味しくなって偉い。定期的に家ですき焼き食べたい。\n南さつま市の返礼品だったのだけど、今年も機会があれば申し込みたい。\n\n\n散髪へ行く。2ヶ月ぶりのぐらいかなー、と思いきや、1ヶ月ちょいぶりだった。温かいけど強い風と小雨が降ったりやんだりの天気の日。\n\n\n昼は妻作(家の料理はほぼ妻が作っているのだけど)のトマトパスタ。うまい。\n\n機械学習学習日記 - 29日目\nYouTube のNN説明動画、But what is a Neural Networkを観る。おおーわかりやすい。しかしながら、やはりニューラルネットワークについて知識がなさすぎる(雰囲気しか分からない)ことがわかり、 scikit-learnとTensorFlowによる実践機械学習を一旦読むのをやめて、ゼロから作るDeep Learningを読み始める。\n第6章まで(CNNの実装の手前まで)読みすすめて、MLPのニューラルネットワークの実装を行ったのだけど、うろ覚え高校数学レベルの自分にも解りやすくて良い本だ。偏微分も簡単な微分から説明してるので理解できたし、バックプロパゲーション(誤差逆伝播法)も計算グラフから徐々に説明しているので(一部はまだ読みこめてないけど)、だいたい理解が出来た。そして数値微分で計算していた学習と実装の伝達を、バックプロパゲーションに変更したら超速いぞウォォォ~、なども味わえて楽しい。\nこの辺を実装途中で python.exe がシングルコア以上のパフォーマンスが出ているのに気づいて調べてみると、conda で入れた numpy が Intel MKL にリンクされたものを使っていて、行列演算でマルチスレッドが設定無しで動いていた。Python インタプリタレベルでいちいちマルチスレッドにしなくても、余ってるCPUコアの処理能力を使えるの良いね。あと名前が Intel MKL だけど AMD Ryzen 3900 でも最適化はどうあれ問題なく動いていた。 \n\n** 0.084692789817106 862\n{'Title': '2020年11月17日', 'Date': datetime.datetime(2020, 11, 17, 20, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None} \n\n朝、写真散歩のついでにメルカリで売れた商品を発送しようとセブンまで行くと、システム障害(クロネコヤマト側のようだった)で発送できないと。Googleで検索しても最新の情報には引っかからず、障害のお知らせは、アプリ内のお知らせかTwitterでの告知が主なの、たしかに普通のメルカリユーザならそっちを見るよなぁ、と納得。なお「らくらくメルカリ便で発送できないと、普通の宅急便では手数料が高くなって利益が出ません」という話を見て、200円ぐらい差が出ることもあるのでたくさん売っている人は地味に効くよなぁ、と思ったり。\n朝食はポトフ。野菜・肉・ベーコンだけなのだけど、上品な優しい味にまとまっていて美味しい、また食べたい(写真は撮り忘れ)。\n\n夕方、一ヶ月ぶりの散髪スピードカットに行った後に夕食を作る。二郎系ラーメン風野菜炒めというレシピだったのだけど、豚バラの脂とニンニクみじん切りを最後にドバっとかけ、化学調味料は一切使ってないのにガツンとくる風味で美味しかった。なるほど、ニンニクみじん切りを生で使うとあの味に近づくのか。\n\n\n今度の旅行準備にと、こないだは壊れていて使えなかったキャリングケースの伸縮ハンドルを直すべく、分解した。解ったことは、ハンドル内部のプラスチック部が折れていたことと、ハンドル自体の構造がおかしくなってそうだ、ということ。プラスチック折れは交換すれば良さそうなのだけど、ハンドルのプラスチックが壊れたまま(構造的にうまく押して取り出せなくなる)力任せに使っていたからか、たぶんどこか曲がってしまい、構造的におかしくなっていそうだった。\nというわけで素人では直すのが厳しそう。伸縮ハンドルの構造理解ができたのは良かった(何がおかしいのか、これからはなんとなくわかりそう)。あと高いものならしっかりしてそうだ(結構大事な場所で、折れるようなプラスチックを使っているのはいかがなものか…)、という感想。 \n\n"
]
}
],
"source": [
"print_text_similar_results('散髪', parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"** 0.3038179029183584 596\n",
"{'Title': '2021年4月12日', 'Date': datetime.datetime(2021, 4, 12, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Tags': ['diary']} \n",
"\n",
"妻が何かのプロフィール用の写真がほしい、というので撮影する。人物撮影は慣れておらず、ただ数はたくさん撮ったので気にいる写真があればよいのだけど。\n",
"夕方、ちょっとした検査でクリニックへ。その後、クレープを食べたり夕食を食べたり。夕食は久しぶりのAFURI。高いけど美味しい、時々食べたくなる味。\n",
"\n",
"機械学習学習日記 - 70日目\n",
"オライリーの機械学習のための特徴量エンジニアリング――その原理とPythonによる実践を読み出す。データ探索からの特徴量作成その手法、というテーマにまとまってるものの、これ系の機械学習全般の本はそれなりに読んできたので、だいたいかぶっているのでお腹いっぱい気味。理解が薄いから復習にはなるのだけど。\n",
"別に文献を読んでいて、2010年ぐらいの機械学習全般の話で、ニューラルネットワークの話の内容ではニューラルネットワークという言葉は出てこずにMLPを説明していた。時代を感じる。 \n",
"\n",
"** 0.21211927657289886 24\n",
"{'Draft': False, 'Title': '2009-07-04', 'Date': '2009-07-04T00:00:00+09:00', 'Image': None, 'Slug': '2009/07/04-subtech', 'Tags': ['subtech']} \n",
"\n",
"perl 5.8.8 を debian sid にソースから入れる\n",
"perl が 5.10 になってしまったので、仕事用に /usr/local に perl 5.8.8 を入れたい。と思ったらふつうに make できないし困った。\n",
"まず miniperlmain でエラるのは\n",
"\n",
"http://jarp.does.notwork.org/diary/200205c.html#200205281\n",
"\n",
"と同様に gcc -E で余計なものが増えたからで、makedepend.SH に command-line 文字列を取り除くように追加(command line ならあるけど、紛らわしい…)。\n",
"make で\n",
"undefined reference to `floor'\n",
"でこけるのは Makefile の CC のオプションに -lm を追加して対処 ( gccでmath.hの関数を使うソースがコンパイルできない場合の対処法 - ぬいぐるみライフ? が参考になりました)。./Configure 時のオプションに CFLAGS があったかも知れない。\n",
"直接 Makefile 書き換えたら、その後の xs モジュールのコンパイルに影響が出たので、ちゃんと ./Configure の対話型オプション設定でそれっぽいところに -lm を追加する必要がある。\n",
"で、SysV が asm/page.h が無くてコンパイルできないのは…。カーネルのヘッダファイル ( /usr/src/linux-headers-2.6.30-1-686/ ) に無いんだけどどうすれば…。とりあえず static コンパイルのライブラリに入れずに作成…。\n",
"といろいろしてみたけど、XS周りが怪しい感じになってしまったので、5.8.9 にしたら安定した…\n",
"coLinux から VirtualBox 移行ではまったこと\n",
"thinkpad x61 の Windows 7 Beta で使えた coLinux が、Windows 7 RC になったらまたフリーズするようになったので、いよいよ coLinux から VirtualBox (ホストOS は windows) へと移行してはまったよメモ。\n",
"ファイルシステム\n",
"coLinux のイメージは raw 形式らしいので、VBoxManage コマンドで変換できる。\n",
"\n",
"$ VBoxManage convertfromraw --format VDI (coLinuxイメージ名) (変換イメージファイル名).vdi index.rb [nofuture.tv]\n",
"\n",
"10G の変換に 40分ぐらいかかった。じっと待つ。home 用に使っていた reiserfs のイメージは問題無く使えたけど、その他全部用に使っていた reiserfs はなんかおかしかったので利用しないことにした。\n",
"ネットワークを使うとすぐゲストOSがフリーズする\n",
"標準の PCnet-FAST III ではすぐゲストOS (debian lenny) がフリーズした。Intel PRO/100 MT desctop に変更したら安定。2ch の VirtualBox スレにも同様の現象が発生して解決した人がいた。\n",
"coLinux の TAP 接続のようなネットワークで利用したい\n",
"外部ネットワークには実マシンのNIC経由(windows ネットワークの接続の共有)で、ゲストOSにはホストOSとゲストOSのみで形成されるネットワーク経由でアクセスしたい場合。つまり coLinux で TAP 使ってネットワーク使っていたような感じにしたい場合は、ネットワークで、Host-only adapter を利用し、ファイル -> 環境設定 -> ネットワーク で IP と DHCPD(つかいたければ) の設定すれば OK 。\n",
"その Host-only adapter で指定した IP に対してゲスト OS から default gateway を指定すれば外に出て行ける( windows ネットワーク接続の共有の設定は必要 ) し、ホスト OS からゲスト OS へのアクセスには DHCPD が割り振った IP につなげば問題無くいける。\n",
"最初は NAT あって超便利!って思ったけど ssh / http その他いろんなポートの設定が必要だし、samba の設定めんどくさいし、ということで慣れている上記仮想ネットワークの方法で設定した。\n",
"そんな感じで今 debian sid に dist-upgrade しながらちまちまとパッケージインストール中。CPAN から perl ライブラリ入れてどうにかするのが一番めんどくさい。昔はディストリの入れ直し作業が楽しかったのに今はめんどくさいとしか思えないお…。 \n",
"\n",
"** 0.2027011619427269 206\n",
"{'Title': '2021年2月28日', 'Date': datetime.datetime(2021, 2, 28, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"今日はゆっくりするのも、学習するのもなにやら中途半端になってしまった一日。\n",
"\n",
"機械学習学習日記 - 27日目\n",
"scikit-learnとTensorFlowによる実践機械学習を引き続き。\n",
"第I部のscikit-learnを使ったMLについて昨日読み終わる。振り返るとMLへの理解がまだまだ浅いので、違う角度から書いてあるこの本読んでおいてよかった。決定木~ランダムフォレストについて理解深まったしね。ただ、Pythonではじめる機械学習のほうをまず最初に読んでおいてよかったとも。Pythonではじめる~のほうが順を追って説明していて頭に入ってきやすかったのだよなぁ。この本は、色々すっ飛ばして後で説明する、もしくは詳細は論文のリンク、というのが多かった気がする。\n",
"第II部はニューラルネットワークと深層学習。10章は人工ニューラルネットワークとKerasの初歩で、前半はよくある生物学的ニューロンから人工ニューロン(ANN)へ、というわけでANNの論理演算(AND, OR,NOT)、パーセプトロン、TLUとステップ関数について。続いて層になったパーセプトロンでXORが実現でき、これが多層パーセプトロン(MLP)だよ、という説明。\n",
"この辺から、文章でアルゴリズムの説明がされ、徐々にわからなくなる、のでサラッと読む。ちゃんと学ぶには、書籍ゼロから作るDeep Learningを読んだほうが良いのだろうなぁ。目次を見る限りこの辺の実装を1から(0からか)作るようだし。必要が出てきたら読もう。\n",
"10.2 は Keras チュートリアル。Keras と PyTorch の API は似ている、なぜなら sklearn と Chainer API からヒントを得てるからだ、と書いてあってなんだか Chainer かっこいい。10.2.2 までチュートリアルを進める。 \n",
"\n",
"** 0.18728247041725338 241\n",
"{'Title': 'すき焼きうまい / 2021年3月2日', 'Date': datetime.datetime(2021, 3, 2, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"ふるさと納税返礼品でもらったおいしいお肉で、晩御飯はすき焼き。久しぶりの脳に直撃する美味しさ!!!!!!!!1。すき焼きは良い肉だと家庭でもめちゃくちゃ美味しくなって偉い。定期的に家ですき焼き食べたい。\n",
"南さつま市の返礼品だったのだけど、今年も機会があれば申し込みたい。\n",
"\n",
"\n",
"散髪へ行く。2ヶ月ぶりのぐらいかなー、と思いきや、1ヶ月ちょいぶりだった。温かいけど強い風と小雨が降ったりやんだりの天気の日。\n",
"\n",
"\n",
"昼は妻作(家の料理はほぼ妻が作っているのだけど)のトマトパスタ。うまい。\n",
"\n",
"機械学習学習日記 - 29日目\n",
"YouTube のNN説明動画、But what is a Neural Networkを観る。おおーわかりやすい。しかしながら、やはりニューラルネットワークについて知識がなさすぎる(雰囲気しか分からない)ことがわかり、 scikit-learnとTensorFlowによる実践機械学習を一旦読むのをやめて、ゼロから作るDeep Learningを読み始める。\n",
"第6章まで(CNNの実装の手前まで)読みすすめて、MLPのニューラルネットワークの実装を行ったのだけど、うろ覚え高校数学レベルの自分にも解りやすくて良い本だ。偏微分も簡単な微分から説明してるので理解できたし、バックプロパゲーション(誤差逆伝播法)も計算グラフから徐々に説明しているので(一部はまだ読みこめてないけど)、だいたい理解が出来た。そして数値微分で計算していた学習と実装の伝達を、バックプロパゲーションに変更したら超速いぞウォォォ~、なども味わえて楽しい。\n",
"この辺を実装途中で python.exe がシングルコア以上のパフォーマンスが出ているのに気づいて調べてみると、conda で入れた numpy が Intel MKL にリンクされたものを使っていて、行列演算でマルチスレッドが設定無しで動いていた。Python インタプリタレベルでいちいちマルチスレッドにしなくても、余ってるCPUコアの処理能力を使えるの良いね。あと名前が Intel MKL だけど AMD Ryzen 3900 でも最適化はどうあれ問題なく動いていた。 \n",
"\n",
"** 0.16343654152978312 253\n",
"{'Title': '月に一度のスカンディアの日 / 2021年3月1日', 'Date': datetime.datetime(2021, 3, 1, 19, 20, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"月に一度はスカンディアに行こう、と思っていたのだけど2月は行けずじまい。3月に入ってしまったが、妻の通院の帰りに時間が丁度マッチしたので、約1ヶ月ぶりのスカンディア。写真は私のローストビーフ。ホースラディッシュ(西洋わさび)をつけて食べると味に広がりが出て美味しい。\n",
"\n",
"\n",
"女神橋の謎のマーキング、写。工事現場内に二箇所ほどあって、□とか簡単なマーキングなら解るのだけど、わざわざ難しい写としているのが謎だ。\n",
"\n",
"今日はだいぶ暖かく、スカンディアに行く前にgooz いちょう並木通り店でコーヒーを買って、外のベンチで飲みながら本を読む。密でもないし、ゆっくりと外で読書できるし、なかなか良いね。gooz のコーヒー、セルフサービスで自分で作り置きされているコーヒーメーカーから注ぐのだけど、12oz(約350ml)カップで150円という安さ。豆もちゃんとしたの使ってるぽいのにお得感も高い。\n",
"というか、gooz はスリーエフ経営だったのか。\n",
"\n",
"機械学習学習日記 - 28日目\n",
"scikit-learnとTensorFlowによる実践機械学習を引き続き。\n",
"10章の残りの Keras チュートリアルを一通り。入力層、重み、バイアス、隠れ層、出力層、活性化関数、損失関数等々の使い方など。Keras API を使う部分はプログラミングなので難しくないのだけど、ニューラルネットワーク(NN)についての知識が無いのでよくわからないまま進めていく。\n",
"最後の演習課題の一つで、playground.tensorflow.orgを使っていろいろやってみよう、というのでこのサイトを知ったのだけど、ビジュアライズしつつ様々なパラメータをいじれるので大変わかりやすい。\n",
"あれこれ調べていると、第1回 初めてのニューラルネットワーク実装、まずは準備をしよう ― 仕組み理解×初実装(前編)の連載記事では、playground.tensorflow を日本語化 + もうちょっと機能追加をしたplaygroundを使いつつ日本語で解説しているので、こちらでも一通り学ぶ。10章だけだと理解不足だったNNの部分の理解がだいぶ深まる。このへんで、やっとパラメータ各種の意味をある程度理解する。\n",
"なお、playground.tensorflow.org は tensorflow と名前がついているけど、TF 関係なく NNの実装は素の TypeScript で書かれているので、PureJS(TS)のNNの小さな実装セットとしても参考になりそうだった。 \n",
"\n"
]
}
],
"source": [
"print_text_similar_results('ニューラルネットワーク', parsed_mds, vect_texts, k=5)\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"{'Title': 'すき焼きうまい / 2021年3月2日', 'Date': datetime.datetime(2021, 3, 2, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"ふるさと納税返礼品でもらったおいしいお肉で、晩御飯はすき焼き。久しぶりの脳に直撃する美味しさ!!!!!!!!1。すき焼きは良い肉だと家庭でもめちゃくちゃ美味しくなって偉い。定期的に家ですき焼き食べたい。\n",
"南さつま市の返礼品だったのだけど、今年も機会があれば申し込みたい。\n",
"\n",
"\n",
"散髪へ行く。2ヶ月ぶりのぐらいかなー、と思いきや、1ヶ月ちょいぶりだった。温かいけど強い風と小雨が降ったりやんだりの天気の日。\n",
"\n",
"\n",
"昼は妻作(家の料理はほぼ妻が作っているのだけど)のトマトパスタ。うまい。\n",
"\n",
"機械学習学習日記 - 29日目\n",
"YouTube のNN説明動画、But what is a Neural Networkを観る。おおーわかりやすい。しかしながら、やはりニューラルネットワークについて知識がなさすぎる(雰囲気しか分からない)ことがわかり、 scikit-learnとTensorFlowによる実践機械学習を一旦読むのをやめて、ゼロから作るDeep Learningを読み始める。\n",
"第6章まで(CNNの実装の手前まで)読みすすめて、MLPのニューラルネットワークの実装を行ったのだけど、うろ覚え高校数学レベルの自分にも解りやすくて良い本だ。偏微分も簡単な微分から説明してるので理解できたし、バックプロパゲーション(誤差逆伝播法)も計算グラフから徐々に説明しているので(一部はまだ読みこめてないけど)、だいたい理解が出来た。そして数値微分で計算していた学習と実装の伝達を、バックプロパゲーションに変更したら超速いぞウォォォ~、なども味わえて楽しい。\n",
"この辺を実装途中で python.exe がシングルコア以上のパフォーマンスが出ているのに気づいて調べてみると、conda で入れた numpy が Intel MKL にリンクされたものを使っていて、行列演算でマルチスレッドが設定無しで動いていた。Python インタプリタレベルでいちいちマルチスレッドにしなくても、余ってるCPUコアの処理能力を使えるの良いね。あと名前が Intel MKL だけど AMD Ryzen 3900 でも最適化はどうあれ問題なく動いていた。 \n",
"\n",
"** 0.24894540376075666 206\n",
"{'Title': '2021年2月28日', 'Date': datetime.datetime(2021, 2, 28, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"今日はゆっくりするのも、学習するのもなにやら中途半端になってしまった一日。\n",
"\n",
"機械学習学習日記 - 27日目\n",
"scikit-learnとTensorFlowによる実践機械学習を引き続き。\n",
"第I部のscikit-learnを使ったMLについて昨日読み終わる。振り返るとMLへの理解がまだまだ浅いので、違う角度から書いてあるこの本読んでおいてよかった。決定木~ランダムフォレストについて理解深まったしね。ただ、Pythonではじめる機械学習のほうをまず最初に読んでおいてよかったとも。Pythonではじめる~のほうが順を追って説明していて頭に入ってきやすかったのだよなぁ。この本は、色々すっ飛ばして後で説明する、もしくは詳細は論文のリンク、というのが多かった気がする。\n",
"第II部はニューラルネットワークと深層学習。10章は人工ニューラルネットワークとKerasの初歩で、前半はよくある生物学的ニューロンから人工ニューロン(ANN)へ、というわけでANNの論理演算(AND, OR,NOT)、パーセプトロン、TLUとステップ関数について。続いて層になったパーセプトロンでXORが実現でき、これが多層パーセプトロン(MLP)だよ、という説明。\n",
"この辺から、文章でアルゴリズムの説明がされ、徐々にわからなくなる、のでサラッと読む。ちゃんと学ぶには、書籍ゼロから作るDeep Learningを読んだほうが良いのだろうなぁ。目次を見る限りこの辺の実装を1から(0からか)作るようだし。必要が出てきたら読もう。\n",
"10.2 は Keras チュートリアル。Keras と PyTorch の API は似ている、なぜなら sklearn と Chainer API からヒントを得てるからだ、と書いてあってなんだか Chainer かっこいい。10.2.2 までチュートリアルを進める。 \n",
"\n",
"** 0.23046848954614887 596\n",
"{'Title': '2021年4月12日', 'Date': datetime.datetime(2021, 4, 12, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Tags': ['diary']} \n",
"\n",
"妻が何かのプロフィール用の写真がほしい、というので撮影する。人物撮影は慣れておらず、ただ数はたくさん撮ったので気にいる写真があればよいのだけど。\n",
"夕方、ちょっとした検査でクリニックへ。その後、クレープを食べたり夕食を食べたり。夕食は久しぶりのAFURI。高いけど美味しい、時々食べたくなる味。\n",
"\n",
"機械学習学習日記 - 70日目\n",
"オライリーの機械学習のための特徴量エンジニアリング――その原理とPythonによる実践を読み出す。データ探索からの特徴量作成その手法、というテーマにまとまってるものの、これ系の機械学習全般の本はそれなりに読んできたので、だいたいかぶっているのでお腹いっぱい気味。理解が薄いから復習にはなるのだけど。\n",
"別に文献を読んでいて、2010年ぐらいの機械学習全般の話で、ニューラルネットワークの話の内容ではニューラルネットワークという言葉は出てこずにMLPを説明していた。時代を感じる。 \n",
"\n",
"** 0.18381555779394984 592\n",
"{'Title': '2021年4月1日', 'Date': datetime.datetime(2021, 4, 1, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Tags': ['diary']} \n",
"\n",
"今まで関わっていたベンチャーのプロダクトが、組織の方向性をITではない別軸に置くために3月末でクローズ。思い入れもあって残念ではあるけど、色々やった上で別軸へ進む腹落ちができたようで、それはそれで喜ばしい。組織作り含めて、実験的かつ面白いことにトライできたと思う。\n",
"4月、というか今日からは新しい機械学習のプロジェクトにジョインする。2月辺りから勉強し始めて、面白くなってきた所で、たまたま自分のスキルでも参加OK(ありがたい)なプロジェクトに出会えたので参加させてもらう。機械学習はまぁ初心者の部類なのだけど、他のエンジニアリングスキルとソフトスキルでカバーしつつ、足を引っ張らないようにせねば。\n",
"写真はベランダで生い茂るハーブ、の一部。\n",
"\n",
"機械学習学習日記 - 59日目\n",
"この機械学習学習日記の立ち位置も、仕事で機械学習をすると微妙な感じもする。当初の目的は「ソフトウェアエンジニアのたしなみとして最低限の理解をしないとまずいよなー、ということで、できる限り毎日少しでも学習して日記に記す」だったので、仕事でほぼ毎日触れるとすると、はからずしも目的は達成できてしまうが、まぁせっかくなので続けてみる。仕事のメインは多分NNではないから、機会学習学習日記では主にNN系のことをやろうかな。\n",
"waifu2d のNN以外の処理をすすめる。画像拡大→画像分割→パッディング→NN→パディング削除→統合、という処理をTFで書いて8割ぐらい終わる。tf.imageでNNに必要とされそうな画像前処理はほぼできるのね。 \n",
"\n",
"** 0.1714233320843933 183\n",
"{'Title': '数十年ぶりのシルベーヌ / 2021年2月25日', 'Date': datetime.datetime(2021, 2, 25, 21, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"近所のスーパーでシルベーヌを見かけて食べたくなり、数十年ぶりに食べたシルベーヌ。チョコレートケーキのような見た目、上にちょこっとのっているチョコレーズン、子供の頃は高級なお菓子、と認識していた。今食べると味はチョコパイだね。\n",
"\n",
"朝食。人参と新玉ねぎのスープが美味しい。\n",
"\n",
"\n",
"昨日サウナに行ったので、朝からシャキっと目覚めるかと思いきや、何故か朝から一日中眠く、午前中昼寝して、午後も昼寝するという体たらく。体温を測ったら微熱があったので、そのせいということにしたい。\n",
"\n",
"昨晩 \"[Firebase] Hosting ドメインの所有権を再確認してください\" というメールが。えっ、なにかやったっけと Firebase Console 開くも、該当のところでは何も詳細がわからずエラーが出るだけ。仕事プロジェクトのドメイン各所にも同等のメールが来てたので、たぶん Firebase 側のミスなのだろうなぁと放置する。\n",
"今日、ごめん何もやるべきこと無いから大丈夫だよ、とのメールが来る。ちゃんと謝りメールには責任者の名前が入っていたのは偉いな、少なくとも日本のインシデント謝りメールでは(よっぽどの物では社長の名前があるが)ほぼ見ない気がする。\n",
"\n",
"iijmio の新プラン、MVNOにしては頑張っているなぁ。iijmio ユーザから見たら純粋な値下がり(今までは音声通話付きだとミニマム税抜1600円)。今の所モバイルインターネットほぼ使ってない(最近数ヶ月の実績は毎月1GB弱)ので2GBプランでも問題ないけど一応余裕を持って4GBプランにしよう。\n",
"楽天モバイルの月額1GBで音声通話付き0円も凄いのだけど、海外ローミングの対応国がいまいち。iijmio はプランD(ドコモ回線)なら、かなりの海外地域で電話&SMSが使えるのが良い。\n",
"\n",
"機械学習学習日記 - 24日目\n",
"Pythonではじめる機械学習を読み終わり、scikit-learn を中心としたML全般は広く浅く学べたが、いわゆるディープラーニング(DL)の話はさわりしか載ってなかったので、こちらもある程度学びたい。\n",
"DL本は、基礎原理から学ぶゼロから作る Deep Learningが有名だけど、ちょっとレイヤーが低すぎて途中で学習の迷子に入って飽きてしまう気もする。かといって、高レイヤーなものだと雰囲気しかつかめない。\n",
"ちょうどよい本は無いかなぁといろいろ調べていると、karino2さんによるscikit-learnとTensorFlowによる実践機械学習のレビュー記事を見つけ、最初の scikit-learn (ML部)は微妙、後半の TensorFlow の部分は良い、ただ理論の解説は不十分なので別の本も読むと良い、とのこと。\n",
"DLのツールとしては PyTorch か TensorFlow どちらかをまず学んでおきたかったし、丁度TF2対応になり内容もだいぶ改定されたscikit-learnとTensorFlowによる実践機械学習は第2判も2020年10月に出たばかりで、この本前半MLの部分はさらりと復習も兼ねて読んで、DL(TL2)の部分はじっくりと読んでいきたい。\n",
"というわけで、今日は1章 機械学習の現状、2章 エンドツーエンドの機械学習プロジェクトを読む。2章では、仮想的なロールプレイということで不動産データのゴール設定からデータを見て前処理してモデル作って評価する一連の流れで、これは以前読んだPythonではじめる機械学習で学んだことがだいたい書いてあって、すんなりと読める。が、この本から読みだしたらなんだろう?とよく分からず雰囲気だけで読むことになりそう。Pythonではじめる~は、なぜ?という項目がほぼ出ずに読み進めらた。\n",
"ただこちらの本は、自分で作る前処理などもsklearnのインターフェイスに合わせて抽象化する、作ったモデルは状態保存して復元もできるから比較も簡単、などといったプログラマが知るべき事も載っていて、そのへんのテクニックがより知れたので良かった。 \n",
"\n",
"** 0.1692500079349638 236\n",
"{'Title': '2021年3月15日', 'Date': datetime.datetime(2021, 3, 15, 20, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'Draft': False, 'Image': None, 'Lens': None} \n",
"\n",
"昼食のホタルイカの炊き込みご飯。ホタルイカの味がきちんとご飯にうつって、優しい味でなかなかの美味しさ。\n",
"\n",
"\n",
"午後、また近くの公園で椅子を持っていきゆっくりと読書したり、フリスビーしたり。平日にもかかわらず、高校~大学生ぐらいの年代がレジャーシートを敷いてのんびりしていて、もう春休みなのかぁ。\n",
"\n",
"夕飯はホットプレートで焼き肉。こないだのすき焼きが美味しすぎて、同じところの牛肉だったので期待値が高くなりすぎてしまい、想像の美味しさには至らず。ホットプレートの焼き肉も油が落ちないからなかなか難しいね。\n",
"\n",
"\n",
"ひと月ほど前から、NHK連続テレビ小説おちょやんの土曜日のダイジェスト版を見ている。一週間分、75分の物語が再編集され15分になり、ストーリの中心的なハイライトが短時間で見れて面白さが集約されている。毎週のように起承転結があるのだなぁ。ちょうどよい長さなので、過去のNHK連続テレビ小説も2011年からダイジェスト版を放映していたようだし、見れるなら見たいのだけど、NHKオンデマンドではダイジェスト版は配信していないようで残念。需要があると思うのだけどなぁ。\n",
"\n",
"YouTube で英語での技術的な説明の動画を見たいな、そとで椅子にでも座りながら、と思いオフラインダウンロードができる YouTube プレミアムを契約する。Galaxy ユーザは4ヶ月無料らしい、と PC ブラウザで知る。ユーザの属性情報に合わせたマーケティング、ときたまぎょっとするのでありがたいのだけどやめてほしい気持ちもある。\n",
"と、早速オフラインにダウンロードして観るか、と思うもネットワークに繋がってるにも関わらず iPad では日本語字幕選択できないじゃん!\n",
"\n",
"Which GPU(s) to Get for Deep Learning: My Experience and Advice for Using GPUs in Deep Learningを読む。ディープラーニングでのGPU選定について、非常に詳しいエントリー。そうそう、こういうのが読みたかったのだ。NNではGPUコアそのものより、メモリ帯域幅がボトルネックなっていてたいていGPUコアは100%使ってないよね、というのもなるほど。Ampereアーキテクチャ(RTX3080など)はメモリ帯域幅が一つ前のアーキテクチャより1.7倍ぐらい速いから、それだけで1.7倍速で、実際にNNのFP16ベンチマークでRTX2080に比べ1.9倍前後(これはコア周辺のの性能向上もあるのだろう)速くなっていてすごい。\n",
"そして何買えばよいのかまとめでは、費用対効果ではRTX3080が1GPUならとても良い、というわけでまたも売っていないRTX3080が欲しくなるのであった。\n",
"\n",
"機械学習学習日記 - 42日目\n",
"ちょっとTensorFlow.jsを触ってみた後、PyTorchチュートリアル(日本語翻訳版)を一通り眺める。有志で翻訳されてるようでありがたいし、訳注もちょこちょこ入り分かりやすい。PyTorch チュートリアルは、NNの基本的なことを知っている前提なので、PyTorch の使い方についてざっくりと知ることができた。PyTorchオフィシャルチュートリアルにマリオブラザーズを強化学習で学習してAIつくるなんてあるんだなぁ。\n",
"TF は Keras のインターフェイスを通した高レベルな所から始まり、もちろん TF API を使った細かい書き方もできるのだけど、きちんと抽象化されてるので、1からモデルを書こうとすると TF 自体をちゃんと理解しなくてはならない。反面、PyTorch は1からモデルを書こうとしたときにも書きやすさがあるように思える。これは PyTorch のチュートリアルがテンソル、自動微分、NNのトレーニング、という順序のためそう感じるだけかも知れないけど。もちろん PyTorch も keras のような高レベルAPIもある。 \n",
"\n"
]
}
],
"source": [
"print_similar_results(241, parsed_mds, vect_texts, k=5)\n"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment