<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>俺より凄いやつしかいない。 –</title><link>https://www.cyamax.com/</link><description>Recent content on 俺より凄いやつしかいない。</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sun, 14 Sep 2025 22:37:01 +0900</lastBuildDate><atom:link href="https://www.cyamax.com/index.xml" rel="self" type="application/rss+xml"/><item><title>【Chrome拡張機能】Notion Recent URL を公開しました</title><link>https://www.cyamax.com/entry/2025/09/14/223701/</link><pubDate>Sun, 14 Sep 2025 22:37:01 +0900</pubDate><guid>https://www.cyamax.com/entry/2025/09/14/223701/</guid><description>
Notionの最近アクセスしたページとデータベースを効率的に管理するChrome拡張機能「Notion Recent URL」を公開しました。
概要 この拡張機能は、Chromeの履歴からNotionのページとデータベースを抽出し、検索・フィルタリング・お気に入り機能を提供します。
機能 基本機能 最近アクセスしたNotionページ・データベースの表示 リアルタイム検索（タイトル・URL対応） ピン留め機能 コンテンツタイプフィルター（All/Pages/Databases） ソート機能 Recent（最新順） Access Frequency（アクセス頻度順） Alphabetical（アルファベット順） Pinned Priority（ピン留め優先） その他 ファビコン表示 タイトル自動整理（「| Notion」サフィックス除去） 使用頻度表示 レスポンシブデザイン キーボードナビゲーション対応 インストール Chrome Web Store 拡張機能ページからインストール
開発版 git clone https://github.com/cyamax/notion-recent-url cd notion-recent-url npm install npm run build Chromeの拡張機能ページで「パッケージ化されていない拡張機能を読み込む」からbuildフォルダを選択
使用方法 拡張機能アイコンをクリック タブ選択（ALL/Pages/Databases） アイテムクリックで新規タブで開く 検索ボックスでフィルタリング ピンアイコンでお気に入り登録 技術仕様 Chrome Extension Manifest V3 Webpack + TailwindCSS ES6+ JavaScript Chrome History API / Storage API Google Favicon Service 開発コマンド npm run build # プロダクションビルド npm run watch # 開発用ウォッチモード npm run format # コードフォーマット ライセンス MIT License
リンク GitHub Repository Chrome Web Store</description></item><item><title>【振り返り】Gemini at Work 登壇</title><link>https://www.cyamax.com/entry/2024/11/29/000045/</link><pubDate>Fri, 29 Nov 2024 00:00:45 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/11/29/000045/</guid><description>
イベント概要 イベント名・日時・場所 Gemini at Work 開催日時：11月27日（水）10:00 - 12:00 渋谷ストリーム（Google 渋谷オフィス） https://cloudonair.withgoogle.com/events/gemini-at-work-24-jp-gws 主催者側の意図/目的（推測） Gemini for Google Workspace の最新アップデート情報の共有 導入事例を通じたユーザ獲得 参加者層（推測） 情報システム部門 メディア企業 コンサルティング会社 ITライセンスベンダー 現地250名、オンライン1500名以上が参加した大規模イベントとなり、非常に活気に満ちた場となりました。
登壇内容 会社名が含まれるため本ブログでは割愛 詳細は下記から確認可能 https://cloudonair.withgoogle.com/events/gemini-at-work-24-jp-gws/watch?talk=t1-ession4 聴衆（SNS）の反応 Xでの反応は限定的でしたが、同じく登壇したコンサル会社のプレゼンが内容・話し方ともに素晴らしく、学びの多い機会となりました。
得られた学び 反省点 事前準備は目標の3割程度しか達成できず 具体的には、体力作り、姿勢、所作、発声練習などを実施予定だったが、業務の繁忙と前週の体調不良、そして資料作成の遅れにより実現できなかった。
資料準備に予想以上の時間を要した 過去の登壇経験から安易に考えていたことが原因。文章作成に時間がかかる自身の特性を軽視していた。
資料の作成は５０時間以上かかっている。土日や夜の時間を使って作成したが、仕事が終わった後に作成しているので、負担は小さくはなかった。 改めて考えると時間をかけすぎなので、もう少し短縮できるようにしたい。 ゼロから資料を作ってしまったのがよくない。使いまわせる資料をもっと探すべきだった。（やっていたつもりだが、足りなかった）
視聴者ニーズと登壇内容に若干のズレがあった。 活用事例や教育・展開方法により重点を置くべきだった。もう少し自分から情報を取りに行くべきだった。簡単にわかる与えられた情報から答えを出そうとするのは、データ分析でもNGパターンである。
精神面での発見 本番直前の謎の精神的な余裕 不思議なことに2000名ほどの視聴者がいても緊張はまったくしなかった。通常は脈が速くなったりすると思うが、それを感じることもなかった。
これはおそらく直近の経営陣への定期報告が良い練習になっていたと考えられる。 自分のプレゼンが始まる直前も、他の登壇者のプレゼンをちゃんと聞きながら、「話すの上手だな」と感心していた。
なんなら、プレゼンが終わった後の仕事のことについてちょっと考えていた。それくらい何故か精神的に余裕があった。
準備に対する不安 本番直前の精神的な余裕とは裏腹に、準備に対する不安は予想以上に大きかった。 これは私の性格をよく表していて、準備のときにさまざまなネガティブ要素を考えてしまい、不安が無駄に大きくなるという傾向がある。 今回も資料ができていないことに対する不安が収束するのに時間がかかった。なんなら、本番前よりも資料ができないことに対する不安を感じている時の方が脈が早かったと思う。
プレゼンスキルの振り返り 今回は視聴者1000人を超えるイベントという性質上、カンペを用意した。カンペを一字一句ちゃんと用意した登壇は初めてかもしれない。
過去にオンサイト500人規模のCybozu kintone hack登壇時はカンペを用意したことがあるが、その時も大枠しか書かなかった。 今回カンペを用意した理由の一つに【3分要約】話し方の戦略 千葉佳織を読んだからというのもある。
この本を読んで、本当に相手にちゃんと伝えたいのであれば、文章の構成や言葉の単語の選び方までちゃんと検討をする必要がある（＝思いつきで話すのではなく、きちんと準備をして話す）ということを実感したからである。 カンペを丁寧に作るのに時間はかかったが、話忘れによる後悔はせずに済んだ。
最後に 今回の登壇は精神面・キャリア面で非常に有意義な経験となった。成長には一定のストレスが必要だと改めて感じた出来事であり、次回もこの経験を活かしてさらなる成長を目指したい。</description></item><item><title>【振り返り】2024年10月の振り返りと11月の目標</title><link>https://www.cyamax.com/entry/2024/11/01/005626/</link><pubDate>Fri, 01 Nov 2024 00:56:26 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/11/01/005626/</guid><description>
2024年10月の振り返り アウトプットをしようと決めた そう思ったきっかけは、仕事で出会ったインフルエンサーの影響だろう。
偶然一緒に仕事をすることになり、間近でそのアウトプットの量とスピードに驚かされた。
息をするようにアウトプットをし、いろんな人を巻き込んで私が数年に一回やるようなイベントを毎月以上のペースでやっている。
短い間にいろんなことを経験して人生が色濃くなっていく生き方を目の当たりにして、自分もちょっと頑張らなければと良い刺激を貰った。
アウトプットの一つとしてブログを復活させた もともと はてなブログ で2016年ごろからブログを書いていた。
過去にちょっとだけ記事が話題になったことがあり、1日で数万アクセスきたり、その後も平均100アクセス/日ほどあったので、Google AdSense や Amazon アソシエイトで運用費ぐらいはカバーする程度の収益があった。 2020年以降はほとんど記事を書かず、アクセス数がみるみる減った。 その後 Hugo にブログを移したことでさらにアクセス数が減り、先月まで アクセス数 0 が続いていた。
ブログを書かなくなった理由は、子どもが生まれたことや仕事の変化で余裕がなくなり、モチベーションが全くわかなかったから。
ブログを書く意味が自分の中で見出せなかった。 同じ時間を費やすのならお金になることをやった方が ROI(費用対効果)が良いと思ったし、まさに2020 ~ 2024/8 までお金になることを実践していた。
最近になりブログを書き出したモチベーションの理由は上記に書いたとおりだが、アウトプットの方法としてブログを選んだのは下記が理由である。
アウトプットの手段として一番手軽であり、数をこなせること 他の候補として、サービス開発や楽曲作成、動画作成などがあったが、どれも出来上がるのに時間がかかる。
仕事をしながら並行して作成を行うと1日では終わらないため、完成までに時間がかかってしまいモチベーションの維持がしづらい。
また、慣れてくればブログをしながらアプリ開発などもできる。 自分のモチベーションを維持しながら効率よくアウトプットをしていくために、ブログを選んだ。
言語化スキルを伸ばすことは仕事でも相乗効果がある Youtube の動画を作成しても、なかなか今の仕事に直結するスキルはつきづらい。
楽曲作成も同じでやりたいことではあるのだけれども、誰からも望まれていないことなので、仕事に直結しづらくこれも ROI (費用対効果)が悪いと考えた。 ただ、個人の趣味でやりたいことの一つなので、ブログのアウトプットがある程度慣れてきたら、短い楽曲を作って動画に上げていきたいと考えている。
自分のなかで上記のように整理がついたので、ブログという手段でアウトプットを始めた。
英語学習を今月はサボった 一年半続けていた英語のトレーニングを今月はやらなかった。
ここ最近はただこなしているだけで何も成長していなかった。やり方を変える必要がある。
同じタイミングで英語学習をやり始めた同期に最近英語スキルを抜かされた。やり始めた当初は私の方が頑張っていたが、差が縮まりついに追い抜かれた。まさにウサギとカメのような感じだ。
自分の中で英語に対するモチベーションが減ってしまっていたのも問題。
最初は英語ミーティングどうしようみたいな感じだったが、最近では英語話者ばかりの会議があっても、自分だけ日本語で話すという悪い太々しさを身につけてしまい、成長が止まってしまった。 あと Google Meet の リアルタイム翻訳が優秀なので、英語学習の緊急性が減ってしまった。
2024年11月の目標 数年に一度くらいのちょっと大きめの外部登壇があるため、後悔しないためにそこに向けた準備を行う。
12km 走る 目的は体力を付けること。今月は合計12km走る。
体力をつけて、1日の活動時間できる時間を伸ばす。
体重を +2kg 増やす 2024/4 ~ 2024/9 まで実験的に昼食を食べない生活をしていたら、みるみる細くなってしまい、最終的に -4kg の不健康そうな見た目になってしまった。
ガリガリな見た目は説得力がない。中身が大切だが、外見にも説得力を持たせていく。
ブログの投稿を 10 件する 目的はアウトプットを癖づけること。ただし、内容と品質の基準は、自分の娘に見せれる内容であること。 自分の親の思考が浅かったらきっと悲しむだろうと思い、この基準で書いていく。
中期的な目標: EQ の向上 EQ（感情指数） の向上が今後の課題。どうやれば EQ が上がるのか。
最近頭の良さ（IQ:知能指数）は人生においてそこまで関係ないと感じることが増えてきた。 仕事をする上では、一定以上の IQ があればよく、難しい問題を解いたり話を一発で理解することよりも、自分や周囲の感情をうまくコントロールする方がはるかに仕事では大事だと考える。</description></item><item><title>【Hugo】OGP を設定する</title><link>https://www.cyamax.com/entry/2024/10/31/235123/</link><pubDate>Thu, 31 Oct 2024 23:51:23 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/31/235123/</guid><description>
結論 画像生成には tcardgen を使う VSCODE の 拡張機能 VSNotes で自動でOGPフロントマターを記載 Githook で コミット時に tcardgen を実行して自動で画像生成を行う 経緯 ブログ記事のSNS共有時に目を引く画像（OGP画像）を自動生成したい。
手動で各記事に画像を作成するのは時間がかかるため、自動化プロセスを構築することにした。
Go 製の tcardgen というツールを発見し、これを使用して OGP 画像の自動生成を実現する。
下記のように OGP 用の画像を作成する。 OGP とは OGP（Open Graph Protocol） は、ウェブページがSNSで共有された際に、タイトル、説明文、画像などのメタデータを指定するためのプロトコル。OGP 情報は HTML の タグ内に記述され、以下のような形式で設定される。
今回は og:image の話である。
1 2 3 4 5 6 &lt;head> &lt;meta property="og:title" content="ページタイトル" /> &lt;meta property="og:description" content="ページの説明文" /> &lt;meta property="og:image" content="https://example.com/path/to/image.jpg" /> &lt;meta property="og:url" content="https://example.com/page-url" /> &lt;/head> 設定詳細 tcardgen の設定 インストール方法 tcargen のリポジトリやインストール方法はこちら。
使うためには事前に go のインストールなどが必要だが、 Hugo ユーザは問題ないはず。
go install github.com/Ladicle/tcardgen@latest また、フォントファイルも必要。KintoSansフォントを使用する場合は、以下のようにフォントファイルを配置する。
assets/ └── font/ └── KintoSans/ ├── KintoSans-Bold.ttf # 太字フォント ├── KintoSans-Medium.ttf # 中太フォント └── KintoSans-Regular.ttf # 標準フォント filename.md 1 2 3 4 5 6 --- title: "記事タイトル" date: 2024-11-01 images : - /entry/2024_10_31_235123.png --- Hugo 側の設定 私が使っている Hugo の テーマ Hextra では、フロントマターで images に設定すればよいのでそれに従う。
背景画像の準備 canva で作成した。
tcardgen の設定 背景側で作成済みだった著者名については、座標を-400などにして表示しないようにした。 それ以外はデフォルトの設定。
tcardgen.yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 template: example/template.png title: start: px: 123 py: 165 fgHexColor: "#000000" fontSize: 72 fontStyle: Bold maxWidth: 946 lineSpacing: 10 category: start: px: 126 py: 119 fgHexColor: "#8D8D8D" fontSize: 42 fontStyle: Regular info: start: px: -100 py: -400 fgHexColor: "#8D8D8D" fontSize: 0 fontStyle: Regular separator: "・" timeFormat: "Jan 2" tags: start: px: 1025 py: 451 fgHexColor: "#FFFFFF" bgHexColor: "#7F7776" fontSize: 22 fontStyle: Medium boxAlign: Right boxSpacing: 6 boxPadding: top: 6 right: 10 bottom: 6 left: 10 VSCODE の 拡張機能 VSNotes で自動でOGPのフロントマターを記載 VSCode の拡張機能 VSNotes を使用して、新規記事作成時に自動的に OGP 用のフロントマターを挿入するように設定する。 これにより、毎回 OGP のファイル名を自動的に設定するようにした。 私は、VSNotes の設定ファイルに以下のようなテンプレートを追加した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { "vsnote_template_blog": { "prefix": "vsnote_template_blog", "body": [ "---", "title: \"\"", "date: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}T${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}${CURRENT_TIMEZONE_OFFSET}", "draft : false", "author: [\"yama.sh\"]", "categories: [\"\"]", "tags: [\"\"]", "archives: [\"$CURRENT_YEAR\", \"$CURRENT_YEAR-$CURRENT_MONTH\"]", "description: \"\"", "url : \"/entry/$CURRENT_YEAR/$CURRENT_MONTH/$CURRENT_DATE/$CURRENT_HOUR$CURRENT_MINUTE$CURRENT_SECOND\"", "images :", " - \/entry/${CURRENT_YEAR}_${CURRENT_MONTH}_${CURRENT_DATE}_${CURRENT_HOUR}${CURRENT_MINUTE}${CURRENT_SECOND}.png", "comments: true", "---", "$2", ], } } Githook で コミット時に tcardgen を実行して自動で画像生成を行う Git hookを使用して、コミット時に自動的に tcardgen を実行し、 OGP 画像を生成します。以下の手順で設定します プロジェクトのルートディレクトリに .git/hooks/pre-commit ファイルを作成し、以下の内容を記述します
.githook の場所変更と pre-commit ファイルの作成 $ git config --local core.hooksPath .githooks $ mkdir -p .githooks &amp;&amp; touch .githooks/pre-commit 本来 .git/hooks にあるフォルダをプロジェクトのルートディレクトに見るようにする。 これにより、この後に作成する pre-commit のファイルを git 管理下に置く。
mkdir -p オプションは、親ディレクトリが存在しない場合に、それも一緒に作成することを指示します。 作成した pre-commit ファイルの中身は下記のようにする。
pre-commit のスクリプト 下記の内容を設定することで、コミット時に更新された記事に対してのみ画像を生成する。
.git/hooks/pre-commit#!/bin/bash git diff --name-only HEAD content/post |\ xargs tcardgen -f assets/fonts/KintoSans/ \ -o content/images/ \ -t assets/img/ogp.png \ -c tcardgen.yaml content/posts/20*/*.md</description></item><item><title>【Windows】限りなく実機に近いWindowsの仮想検証環境を作る</title><link>https://www.cyamax.com/entry/2024/10/28/232716/</link><pubDate>Mon, 28 Oct 2024 23:27:16 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/28/232716/</guid><description>
目的 検証 OS やクラウド環境上ではなく、可能な限り本番環境と同じ環境で検証を行いたい。クラウド環境や検証用OSでは、物理端末にプリインストールされたアプリケーションやドライバが異なるため、検証環境としては懸念が残る。同じ物理端末を用意しても良いが、環境を初期化したりスナップショットを取ったりと変更前の状態にすぐに戻せるようにしたい。
方法 Microsoft Sysinternals の Disk2vhd を利用して、物理端末のイメージを作成します。その後、同じ端末で Hyper-V を起動し、Disk2vhd で作成した vhdx イメージを読み込んで VM を起動する。
手順 下記は全て検証端末上（Windows）で行う。
事前準備 事前に Windows の初期化や不要ファイルの削除などクリーニングしておくことが重要。
このステップにより、仮想マシンがクリーンな状態から始まる。
また、ディスクを分割して100GBほどのDドライブを作成し、Disk2vhd のイメージの保存先として利用する。
vhdx の作成 Disk2vhd をダウンロードし、解凍後 disk2vhd64.exe を起動。 イメージに必要なボリューム（OS, ESP, WINRETOOLS）を選択。これにより、仮想マシンが正しく機能するために必要なデータが含まれる。 Prepare for use in Virtual PC を選択。仮想環境で使用するための設定。 USE vhdx を選択。新しい形式の仮想ハードディスクを使用するためのオプション。 Create を押下しイメージが作成（保存先は上で作成したDドライブ）。 vhdxの設定 Windows の機能の有効化または無効化 で Hyper-V を有効化にする。Hyper-VはWindowsに組み込まれた仮想化機能であり、これを有効にすることで仮想マシンを作成できる。※方法はこちらを参照。 新規でVMを作成。 仮想マシン（第２世代）を選択。第2世代はUEFIブートをサポート。 メモリ 4096MB 〜（お好みで）を設定。仮想マシンが使用するRAMの量。 ネットワーク接続（用途に合わせて設定）。インターネット接続やローカルネットワークへのアクセス方法を指定。 仮想ハードディスクの接続： 既存の仮想ハードディスクを使用する で Disk2vhd で作成したイメージを指定。 起動画面 Windows のコピーを生成し、Hyper-V の中でコピーしたイメージを起動する。この手順によって、本番環境と同様の状態で検証が行えるようになる。</description></item><item><title>【Hugo】RSSの自動画像設定を作ったけどやめた</title><link>https://www.cyamax.com/entry/2024/10/27/160817/</link><pubDate>Sun, 27 Oct 2024 16:08:17 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/27/160817/</guid><description>
概要 全ての記事で毎回サムネイル画像を用意するのが面倒だったので、記事内に画像が無い場合は、Zenn のような自動でタイトルが書かれたサムネイル画像生成するようにした。
自動サムネイルの出力イメージ 最初は満足していたのだが、RSS の xml をみたときに、サムネイルのリンクが含まれていないことに気づいた。 最初は簡単に追加できると思ったが、実装してみると無理やりな実装が多くなってしまい、一応実装できたが美しく無いのでやめた。
この記事では、実際には実装しなかった RSS への画像追加コードをメモとして残す。
サムネイル画像を自動で生成する 作成方法は下記のサイトを参考にさせていただいた。
チラシの表の反対側
下記の方法のすごいところは、Go Template にコードを記載するだけで勝手にサムネイル画像が生成とOGPの設定がされる点である。
※ Hugo の images.Text の機能を利用しており、 {{ images }} で public/img 配下に画像が生成される。
layouts/partials/ogp-card.html{{/* もし ogp.png というファイルがあれば、それを使う */}} {{- $image := .Resources.Get "ogp.png" }} {{- if not $image -}} {{/* ogp.png がないので、生成する */}} {{/* 文字のレンダリングに使うフォントをダウンロードする */}} {{- $font := resources.Get "fonts/NotoSansJP-Bold.ttf" }} {{- if .IsPage -}} {{/* 記事ページの場合。記事タイトルの画像を生成する */}} {{/* タイトルの 18 文字ごとに改行を入れる */}} {{- $maxLen := 18 }} {{- $len := strings.RuneCount .Title -}} {{- $titleText := "" -}} {{- range $i := seq 0 (div $len $maxLen) }} {{- $line := substr $.Title (mul $i $maxLen) $maxLen }} {{- $titleText = printf "%s%s\n" $titleText $line }} {{- end -}} {{/* 記事とサイトのタイトルをベースの画像の上にレンダリングする */}} {{- $articleTitle := images.Text $titleText (dict "font" $font "color" "#333" "size" 60 "x" 100 "y" 100) }} {{- $image = (resources.Get "img/ogp.png" | images.Filter $articleTitle) }} {{- else }} {{/* 記事以外のページの場合。サイトのタイトルの画像を生成する */}} {{- $title := images.Text site.Title (dict "font" $font "color" "#333" "size" 100 "x" 140 "y" 220) }} {{- $image = (resources.Get "img/ogp_title.png") }} {{- end -}} {{- end -}} &lt;meta property="og:image" content="{{ $image.Permalink }}" /> 下記のコードを head.html などに記載し、どのページでもサムネイル画像が生成されるようにする。
layouts/partials/head.html&lt;head> &lt;!-- もともとのコード --> {{ partial "ogp-card.html" . }} &lt;/head> 問題点：サムネイル画像の再利用（RSSへの反映）ができない サムネイル画像だけを生成するだけであれば、上記の方法で十分満足だった。
しかし、RSS の xml にもサムネイル情報を追加したいという気持ちが出てきた。 簡単に RSS にサムネイルの画像情報を追加できると思ったら、これが沼だった。
実装上の主な問題点は下記の２つ。
生成された画像を Go Template から利用できない この方法で生成された画像は Public 配下に保存されるため、 Go Template からアクセスができない。 正確には別の方法でアクセスができるのだが、それは解決策に書く。
生成された画像のパスがわからない 生成される画像のファイル名を指定することができない。
ogp_huae1e778bbe54732beded77b6d19b26b7_50070_filter_508557149237022477.png といった感じでランダムな文字列が生成される。
そのためサムネイルとして設定されている画像の URL を知りたい場合は、Public 配下の該当記事の html ファイルの meta og:image の src を見る必要がある。
解決策（非推奨） サムネイルの URL を resources.GetRemote で抜き出す Go Template からサムネイル画像の情報を取得するために、リモートからアクセスする方法を行った。
具体的には、{{ resources.GetRemote $url }} で記事の html を読み込み、meta og:image の src を抜き取ることで、サムネイル画像の URL を特定することができる。
list.rss.xml に サムネリンクを入れ込む RSS に画像リンクを埋め込むために、下記のコードで xml 内に &lt;enclosure /> タグを入れ込み、画像情報を付与した。
layouts/_default/list.rss.xml{{ $u := urls.Parse .Permalink }} {{ $url := printf "%s%s" "https://www.cyamax.com" $u.RequestURI }} {{ with $result := resources.GetRemote $url }} {{- $image := "" -}} {{- with $head := index (findRE `&lt;head>(.|\n)*?&lt;/head>` $result.Content) 0 -}} {{- range $meta := findRE `&lt;meta.*?>` $head -}} {{- $name := replaceRE `&lt;.*name=\"(.*?)\".*>` "$1" $meta -}} {{- $property := replaceRE `&lt;.*property=\"(.*?)\".*>` "$1" $meta -}} {{- $content := replaceRE `&lt;.*content=\"(.*?)\".*>` "$1" $meta -}} {{- if eq $property "og:image" -}} {{- $image = $content -}} &lt;enclosure url="{{ $image }}" length="0" type="image/png"/> {{- end -}} {{- end -}} {{- end -}} {{- end -}} 追加の問題点 上記の方法で動くのだが、色々と問題点が残る。
hugo server -D の起動が遅くなる Hugo 起動時に rss で記載されているリンクすべてに対して {{ resources.GetRemote $url }} を行うので、起動が遅くなってしまった。
鶏と卵問題 Hugo を起動すると、list.rss.xml が読み込まれ、 {{ resources.GetRemote $url }} で html の情報を取りに行くが、そのアクセス先の Hugo がまだ起動していない。起動するためには Hugo が起動している必要があるので、矛盾してしまっている。
今回は、ローカルでの Hugo 起動時は本番サーバ向けに Request を投げるようにしたが、仕様としてはかなりイケていない。
また、コード内に https://www.cyamax.com がハードコーディングされているのもイケてない。 イケてないとわかっているのに実装している理由は、本来利用できる.Site.baseURL の値が機能しないためである。
ローカルで起動するとデフォルトでは http://local:1313 になってしまい、現在起動中の URL にアクセスしてしまうからである。
.Site.Params などで別で設定すれば良いかもしれないが、この機能のためだけに考慮が増えること自体が良くない。
仕様が美しくない こんなにおかしなことになってしまう理由はわかっている。 それは、 Public 配下の画像の情報を取得しようという発想自体がナンセンスだからだ。 本来は生成された public 配下の html を再利用することはない。 今回は、それを再利用しようとしたからおかしなことになってしまった。
通常：本来の Hugo の使い方 flowchart LR; md,GoTemplate-->public/html; 今回の問題：本来は一方通行な仕様なのに、戻りが発生している flowchart LR; md,GoTemplate-->public/html-->md,GoTemplate;</description></item><item><title>【Chrome拡張機能】Google Drive Recent Files を公開しました</title><link>https://www.cyamax.com/entry/2024/10/27/022121/</link><pubDate>Sun, 27 Oct 2024 02:21:21 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/27/022121/</guid><description>
Google Workspace のヘビーユーザ向けに Chrome 拡張機能を作成しました。
機能 Google ドライブのアクセス履歴をポップアップに表示し、最近アクセスしたファイルをすばやく見つけて開くことができます。 タブを切り替えることで、種類別に見ることができます。 利用頻度が高いファイルは ↗ のマークが表示されます。 効果 「さっき開いていたあのファイルどこだっけ？」 「このファイル毎日開くけど、ブックマークするほどでもないんだよな」 上記のような煩わしさから解放されます。ブックマークをしたり、ファイルを探す手間がなくなります。 ダウンロード Chrome Web Store からダウンロードできます。</description></item><item><title>【Hugo】Custom Domain が Sitemap.xml に適用されない</title><link>https://www.cyamax.com/entry/2024/10/26/165205/</link><pubDate>Sat, 26 Oct 2024 16:52:05 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/26/165205/</guid><description>
結論 デプロイ時のコマンド hugo --gc --minify -b ${DEPLOY_PRIME_URL}" が原因。
きっかけ sitemap.xml をみたときに、URL が 自身のカスタムドメインではなく Netlify.app のドメインになっていた。
また、私のサイトを Google で検索しても、Netlify.app 側のドメインが検索で引っかかってしまう。
内容が同じでドメインが重複しているため SEO としても良くないため対応をした。
原因 netlify.toml 内に記載されたデプロイ時のコマンドオプション -b ${DEPLOY_PRIME_URL}" が原因だった。
{DEPLOY_PRIME_URL} は Netlify の環境変数であり、簡単に言えば https://feature-branch--petsof.netlify.app といった Netlify 側の URL が入る。
-b オプションをつけることで、 baseURL が設定されるため、 Netlify の URL が baseURL として設定されてしまった（本来は Custom Domain を入れたい）
このオプションは、 Hugo のテーマを適用したときに付いてきたもの（GitHub の Use this template）だった。
解決 -b ${DEPLOY_PRIME_URL} のオプションを削除することで、 カスタムドメインが正しく反映され、 sitemap.xml も正常な値に戻った。
修正後 netlify.toml[build] publish = "public" command = "hugo --gc --minify" [build.environment] HUGO_VERSION = "0.132.2" 参照 DEPLOY_PRIME_URL について</description></item><item><title>【Chrome拡張機能】Chrome Web Store 公開に必要な zip ファイルを Githook で楽にする</title><link>https://www.cyamax.com/entry/2024/10/20/202743/</link><pubDate>Sun, 20 Oct 2024 20:27:43 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/20/202743/</guid><description>
結論 Chrome 拡張機能を公開する時に、 Chrome Web Store に拡張機能のソースコードが入った zip ファイルをアップロードする必要がある。
手動で zip 化をしてもよいが、今回は Githook を使って commit 時に自動で zip ファイルを作成する。
課題 ローカルにある zip ファイルが最新かわからなくなる。 常に最新の zip ファイルを自動的に生成していれば、悩まなくて済む。 やり方 Githook の pre-commit を使い、 commit が発生したら、都度 zip 化する。 Chrome 拡張機能は軽量なコードになることが多いので、都度 zip を生成しても負担は少ない。 リスト .githook の場所を変更 pre-commit ファイルを作成 pre-commit ファイルに実行権限を付与 （好み）.gitignore で zip ファイルを除外 .githook の場所を変更 本来 .git/hooks にあるフォルダをプロジェクトのルートディレクトに見るようにする。
これにより、この後に作成する pre-commit のファイルを git 管理下に置く。
git config --local core.hooksPath .githooks 2. pre-commit ファイルを作成 mkdir -p .githooks &amp;&amp; touch .githooks/pre-commit -p オプションは、親ディレクトリが存在しない場合に、それも一緒に作成することを指示します。
作成した pre-commit ファイルの中身は下記のようにする。
#!/bin/bash # 圧縮するフォルダ名 EXTENSION_FOLDER="extension" # zipファイル名 ZIP_FILE="extension.zip" # 圧縮コマンド zip -r "$ZIP_FILE" "$EXTENSION_FOLDER" 3.pre-commit ファイルに実行権限を付与 忘れがちですが、実行権限を付与しないとコミット時に動いてくれない。
chmod +x .githooks/pre-commit 4. （好み）.gitignore で zip ファイルを除外 zip ファイルは commit したくないので、除外しておく。
echo "extension.zip" >> .gitignore 実際のコード Github: google-drive-recent-files
まとめ Chrome 拡張機能の開発を少し楽にするために、今回は zip ファイルの自動生成を Githook の pre-commit を用いて実施した。
発展系 下記も Githook や github Actions を使うことで自動化ができそう。ただ、拡張機能のアップデートは頻度高くないので、 Githook ぐらいがちょうど良いのかもしれない。
manifest.json 内のバージョンを Github の tag と同じにする Chrome Web Store への アップロード自体を自動化する</description></item><item><title>【３分要約】話し方の戦略 千葉佳織</title><link>https://www.cyamax.com/entry/2024/10/13/234223/</link><pubDate>Sun, 13 Oct 2024 23:42:23 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/13/234223/</guid><description>
ひとこと 人生を色濃く生きるために、個々人の小さな願いから大きな野望も含めて「目的を達成する」ために、わたしたちは話すのです。
「話す」ということに関してロジカルに言語化された本。少しでも話すことに関して苦手意識を持っていたり、向上させたいと思っている方にお勧めしたい。 話し方の戦略――「結果を出せる人」が身につけている一生ものの思考と技術 Amazonで購入 著者紹介 ［著］千葉 佳織（ちば・かおり）
株式会社カエカ代表／スピーチライター
1994年生まれ、北海道札幌市出身。
15歳から日本語のスピーチ競技である「弁論」を始め、2011年から2014年までに内閣総理大臣賞椎尾弁匡記念杯全国高等学校弁論大会など3度の優勝経験を持つ。
慶應義塾大学卒業後、新卒でDeNAに入社。人事部にてスピーチライティング・トレーニング業務を立ち上げ、代表取締役のスピーチ執筆や登壇者の育成に携わる。
2019年、株式会社カエカを設立。AIによる話し方の課題分析とトレーナーによる指導を組み合わせた話し方トレーニングサービス「kaeka」の運営を行う。経営者や政治家、ビジネスパーソンを対象としてこれまで5,000名以上にトレーニングを提供している。2023年、週刊東洋経済「すごいベンチャー100」、Forbes「2024年注目の日本発スタートアップ100選」選出。本書が初の著書。
３分要約 話し方の戦略とは 話し方改善は、闇雲にトレーニングするのではなく、 「話す目的」「対象者」「話し言葉」 の３つの原則を意識し、 自分にとっての優先順位 をつけて取り組むことが重要。 話し方スキルは単なるテクニックではなく、 マインドを成長させるためのツール 。スキルを学ぶことを通じて、自信や共感力など、より良いコミュニケーションに必要なマインドを育むことができる。 話すことは、プレゼンや会議など特別な場面だけでなく、日常のあらゆる場面で 「目的を達成する」ための手段 。個々人が抱く小さな願いから大きな野望まで、それを実現するために、私たちは話す。 ３つの原則 目的: なぜ話すのか？目的を明確化することで、 聞き手に響くメッセージ を伝えることができる。目的が曖昧なままだと、話すことが作業化し、相手に伝わらない。目的は具体的でも抽象的でも良い。 対象者: 相手の知識・経験・立場などを考慮し、 言葉を受け取った後、相手がどう考えるか、どう行動するか を想像する。伝わらなかったとしても、相手のせいにせず、 自分の責任 として捉え、表現方法を工夫する。自分と相手、 双方にとって心地よいコミュニケーション を目指す。 話し言葉: 相手は一字一句覚えていない。一文を短くして理解を促す。準備は大事。準備した言葉が「準備したように聞こえる」のは、話し言葉としての技術不足。 言葉の戦略 記憶に残りやすい コアメッセージ は、 20モーラ以内 を目安とする。 コアメッセージを作成する際は、まず 目的設定と対象者分析 を行う。 その中から、一番伝えたい コアメッセージを一つ に絞り込む。 コアメッセージが絞りきれない場合は、 目的が明確になっていない 可能性が高い。 話の構成において、 論理の飛躍や主張のすり替え は、話し手の信頼を損なうため注意する。 ハサミメソッドを用いて、段落ごとに内容をカットし、紙を入れ替えながら 最適な構成 を探る。 無意識にいつもの構成に頼るのではなく、 目的意識 を持って構成を組み立て、 自己選択 する。 ストーリー 自分の経験談などを語る際は、単に弱みをさらけ出すだけでなく、 「決意」と「成果」 を合わせて語ることで、聞き手の共感を呼ぶ。 ストーリーを効果的に伝えるには、 時間軸、五感（視覚、聴覚など）、感情 などを意識して描写する。 ファクト（客観的な事実） に基づいた話に、 ストーリー（物語） を組み合わせることで、説得力と共感力を高める。 例：データや統計などのファクトを提示し、それを裏付ける具体的なエピソードをストーリーとして語る。 発声・ジェスチャー 音声（声の大きさ、高さ、速さなど）と動作（ジェスチャー、表情など）は、 自分が思っている以上にオーバー に表現する必要がある。 聞き手には、自分が意識している３倍以上の表現でやっと普通に伝わる。 抑揚 をつけるためには、 声の大小、スピード、高低、間の確保、フィラー（えー、あのー）の削減 などを意識する。 沈黙を効果的に活用することで、聞き手の注意を引きつけ、言葉を印象づけることができる。 大人数の前で話す場合は、句点の後に ２秒程度 の間を取る。 フィラーをなくすためには、まず自分が フィラーを使っていることを認識 することが重要。 手の指は、 自分の目の高さ程度 まで上げるように意識する。</description></item><item><title>【自己向上】３０代で歯列矯正をしたら滑舌も良くなった</title><link>https://www.cyamax.com/entry/2024/10/07/220609/</link><pubDate>Mon, 07 Oct 2024 22:06:09 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/07/220609/</guid><description>
「サ行」と「タ行」に苦戦する日々 昔から、自分の歯並びと滑舌にコンプレックスがあった。「サ行」と「タ行」の発音が苦手で、大人になるにつれてそれが仕事にも影響するようになってきた。重要なプレゼンでめちゃくちゃ噛む。そんな自分にストレスを感じていた。
試してみないと答えはでない 「もしかして、滑舌が悪いのは歯並びのせい？」
そんな仮説がずっと頭の中にあった。そして30代になった時、歯列矯正をするなら今が最後のチャンスだと感じた。
遅くなればなるほど、投資に対する効果が小さくなってしまう。
「今やらなきゃ、一生後悔するかもしれない」
歯並びのせいで滑舌が悪いのかわからないけれども、試してみないと答えはでない。
死ぬ時に「あの時、歯列矯正してれば」なんて思いたくなかった。滑舌が改善されなくても、試して心理的にスッキリしておきたい。
インビザライン 矯正方法を調べていく中で、インビザラインを知った。透明なマウスピース型の矯正装置で、目立たないし取り外しもできる。
これなら仕事にも支障がない。金属のワイヤーを使った矯正は、見た目が気になってしまうし、食事や歯磨きの時に面倒くさそうだったから、インビザラインはまさに理想的だった。
医療費控除で治療費が戻ってくる 歯列矯正は、医療費控除の対象になる。高額な治療費の一部が戻ってくるのは、本当に助かる。
私が通った医院は、治療費が80万円だった。年収600万円の場合、歯列矯正で医療費控除で21万円も税金が安くなる。
つまり、80-21=59万円で歯列矯正が実質できる。
医療費控除金額のカンタン計算ツール
このサイトで簡単に計算できるから、チェックしてみてほしい。
そして、滑舌が改善される 歯列矯正を始めて1年が過ぎた頃、ついに変化が訪れた。
「あれ？滑舌が良くなってる…！」
気づいたら滑舌が良くなっていた。日々滑舌が良くなっていることを実感したというよりは、滑舌でイライラすることがなくなり滑舌について考えることが自然と減っていっていた。
デメリットも正直に もちろん、良いことばかりじゃない。歯列矯正を始めてから歯茎が下がってしまった。食べ物が詰まりやすくなって、毎食後に糸ようじが必需品になった。最初は面倒でサボっていたら、小学生以来の虫歯になってしまった。歯列矯正中は、口腔ケアを今まで以上に念入りにする必要がある。
まとめ 歯列矯正によって滑舌改善をすることができた。高額な費用や歯茎が下がるといったデメリットもあるが、それを上回るメリットを感じている。
もし、歯並びや滑舌に悩んでいるなら、歯列矯正を検討してみてはどうだろうか。長い目で見れば費用以上に効果があると思う。</description></item><item><title>【Hugo】GoogleAnalytics 4 を設定する</title><link>https://www.cyamax.com/entry/2024/10/05/235845/</link><pubDate>Sat, 05 Oct 2024 23:58:45 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/10/05/235845/</guid><description>
前提 使用テーマ： hello-friend-ng
config.toml [params.author] name = "yama.sh" description = "&lt;p>If you like a water, you already like 72% of me. &lt;/p>&lt;p>フルリモートコーポレートエンジニア, 情シス @Kyoto&lt;/p>" googleAnalytics = "G-1459LE635K" Google tag(載せたいコード) 直接 head.html に記載してもよいが、今回は config.toml から値を持ってこれるようにする。
&lt;!-- Google tag (gtag.js) --> &lt;script async src="https://www.googletagmanager.com/gtag/js?id=G-xxxxxxx">&lt;/script> &lt;script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-xxxxxxx'); &lt;/script> 実装 head.htmlをlayoutsにコピーする head.html に Google tag を記載したいので、Hugo のお作法に則りhead.htmlをlayoutsにコピーする
themes/hello-friend-ng/layouts/partials/head.html > layouts/partials/head.html へ head.html をコピーする。
head.html の中身に下記を追加
&lt;!-- Google Analytics template --> {{ with .Site.Params.Author.googleAnalytics }} &lt;!-- Google tag (gtag.js) --> &lt;script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}">&lt;/script> &lt;script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '{{ . }}'); &lt;/script> {{ end }} with で .Site.Params.Author.googleAnalytics の値が存在すれば実行するようにし、値は {{ . }} で持ってくる。</description></item><item><title>【Hugo】Amazon アソシエイトの画像リンクを作成する</title><link>https://www.cyamax.com/entry/2024/07/19/231724/</link><pubDate>Fri, 19 Jul 2024 23:17:24 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/07/19/231724/</guid><description>
出力例 事前準備 Amazon の アソシエイト ID やり方 Amazon アソシエイト Shortcode を作る config.toml に amazonJpAffiliate の ID を追加する 記事に Shortcode を記載する 1. Amazon アソシエイト Shortcode を作る 保存場所： layouts/shortcodes/product_card_amazon.html
{{- $tag := .Site.Params.amazonJpAffiliate }} {{- $product_id := .Get "asin" -}} {{- $product_image := .Get "image" -}} {{- $product_title := .Get "title" -}} &lt;style type="text/css"> .amazon-widget { display: flex; align-items: center; justify-content: space-between; /* 子要素を左右に配置 */ border: 1px solid #ccc; padding: 20px; border-radius: 10px; max-width: 600px; margin: 20px auto; box-shadow: 0 0 10px rgba(0,0,0,0.1); text-decoration: none; color: inherit; } .amazon-widget a { align-items: center; text-decoration: none; width: 80%; } .amazon-widget-img { flex: 0 0 auto; margin-right: 20px; } .amazon-widget-img img { max-width: 150px; max-height: 150px; border-radius: 10px; } .amazon-widget-info { flex: 1; display: flex; flex-direction: column; justify-content: center; /* 子要素を縦の中央に配置 */ } .amazon-widget-title { font-size: 16px; font-weight: bold; margin: 0 0 10px 0; display: block; text-align: center; /* テキストを中央揃え */ } .amazon-widget-synopsis { font-size: 14px; margin: 0 0 10px 0; display: block; text-align: center; /* テキストを中央揃え */ } .amazon-button { display: inline-block; padding: 10px 20px; background-color: #ff9900; color: white; text-align: center; border-radius: 5px; text-decoration: none; font-weight: bold; cursor: pointer; margin-top: 10px; align-self: center; /* ボタンを中央に配置 */ } .amazon-button:hover { background-color: #e68a00; } &lt;/style> &lt;div class="amazon-widget"> &lt;div class="amazon-widget-img"> &lt;img src="https://m.media-amazon.com/images/I/{{ $product_image }}._AC_SX522_.jpg" /> &lt;/div> &lt;div class="amazon-widget-info"> &lt;span class="amazon-widget-title"> {{ $product_title }} &lt;/span> &lt;a href="https://www.amazon.co.jp/gp/product/{{ $product_id }}/?tag={{ $tag }}" class="amazon-button">Amazonで購入&lt;/a> &lt;/div> &lt;/div> 2. config.toml に amazonJpAffiliate の ID を追加する 編集場所： config.toml
[params] amazonJpAffiliate = "Your Affiliate ID" 3. 記事に Shortcode を記載する {{&lt; product_card_amazon asin="4844339648" title="(PDF版付)徹底攻略LPIC Level1問題集[Version 4.0]対応" image="91+IeF0u9eL" >}} 実際の出力例 (PDF版付)徹底攻略LPIC Level1問題集[Version 4.0]対応 Amazonで購入 ラクに商品ページの Shortcode を作成するツール 使い方 ブラウザのお気に入りに下記コードを登録（名前はなんでも良い） Amazon の商品ページを開く 登録したお気に入り（下記コード）を実行すると、ブログ記事に貼る用の Shortcode が生成される javascript:(function(){try{var title=document.getElementById("productTitle").textContent.trim();var asin=document.URL.match("(dp|product)/([0-9a-zA-Z]{10})")[2];var imageURL=document.querySelector("#landingImage, #imgTagWrapperId img").src;var image=imageURL.match(/images\/I\/([0-9A-Za-z+]+)\./)[1];var markdownText=%60{{&lt; product_card_amazon asin="${asin}" title="${title}" image="${image}" >}}%60;function copyToClipboard(text){var textarea=document.createElement("textarea");textarea.value=text;document.body.appendChild(textarea);textarea.select();document.execCommand("copy");document.body.removeChild(textarea);}copyToClipboard(markdownText);window.alert("Markdown形式のテキストがクリップボードにコピーされました:\n"+markdownText);}catch(e){window.alert("エラーが発生しました: "+e.message);}})(); 参考にさせていただいたサイト https://yusukebe.com/posts/2020/amazon-shortcode/</description></item><item><title>【Hugo】Error: &lt;.Page.Store.Get> Netlify への Deploy 失敗時の対処</title><link>https://www.cyamax.com/entry/2024/07/17/230529/</link><pubDate>Wed, 17 Jul 2024 23:05:29 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/07/17/230529/</guid><description>
結論 Netlify 側の HUGO の バージョンが古かった（指定していなかった）のが原因。
netlify.toml でローカルの環境と同じ HUGO のバージョンにすることで問題なく Deploy ができた。
Netlify 側の Deploy log (失敗時) 1:37:09 AM: hugo v0.85.0-724D5DB5+extended linux/amd64 BuildDate=2021-07-05T10:46:28Z VendorInfo=gohugoio 1:37:09 AM: ERROR 2024/07/16 16:37:09 render of "page" failed: execute of template failed: template: posts/single.html:23:11: executing "posts/single.html" at &lt;partial "javascript.html" .>: error calling partial: "/opt/build/repo/themes/hello-friend-ng/layouts/partials/javascript.html:13:11": execute of template failed: template: partials/javascript.html:13:11: executing "partials/javascript.html" at &lt;.Page.Store.Get>: can't evaluate field Store in type page.Page ERROR 2024/07/16 16:37:09 render of "page" failed: execute of template failed: template: posts/single.html:23:11: executing "posts/single.html" at &lt;partial "javascript.html" .>: error calling partial: "/opt/build/repo/themes/hello-friend-ng/layouts/partials/javascript.html:13:11": execute of template failed: template: partials/javascript.html:13:11: executing "partials/javascript.html" at &lt;.Page.Store.Get>: can't evaluate field Store in type page.Page ERROR 2024/07/16 16:37:09 render of "page" failed: execute of template failed: template: posts/single.html:23:11: executing "posts/single.html" at &lt;partial "javascript.html" .>: error calling partial: "/opt/build/repo/themes/hello-friend-ng/layouts/partials/javascript.html:13:11": execute of template failed: template: partials/javascript.html:13:11: executing "partials/javascript.html" at &lt;.Page.Store.Get>: can't evaluate field Store in type page.Page ERROR 2024/07/16 16:37:09 render of "page" failed: execute of template failed: template: posts/single.html:23:11: executing "posts/single.html" at &lt;partial "javascript.html" .>: error calling partial: "/opt/build/repo/themes/hello-friend-ng/layouts/partials/javascript.html:13:11": execute of template failed: template: partials/javascript.html:13:11: executing "partials/javascript.html" at &lt;.Page.Store.Get>: can't evaluate field Store in type page.Page Error: Error building site: failed to render pages: render of "page" failed: execute of template failed: template: posts/single.html:23:11: executing "posts/single.html" at &lt;partial "javascript.html" .>: error calling partial: "/opt/build/repo/themes/hello-friend-ng/layouts/partials/javascript.html:13:11": execute of template failed: template: partials/javascript.html:13:11: executing "partials/javascript.html" at &lt;.Page.Store.Get>: can't evaluate field Store in type page.Page Total in 292 ms netlify.toml の設定値 [build] command = "hugo" publish = "public" [build.environment] HUGO_VERSION = "YOUR_HUGO_VERSION" 参照： https://docs.netlify.com/frameworks/hugo/</description></item><item><title>【Hugo】記事をVSCodeで書く</title><link>https://www.cyamax.com/entry/2024/07/15/155527/</link><pubDate>Mon, 15 Jul 2024 15:55:27 +0900</pubDate><guid>https://www.cyamax.com/entry/2024/07/15/155527/</guid><description>
Hugo用 VSCode設定準備 VSNote Snippet { "vsnote_template_blog": { "prefix": "vsnote_template_blog", "body": [ "---", "title: \"\"", "date: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}T${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}${CURRENT_TIMEZONE_OFFSET}", "draft : false", "author: [\"cyamax\"]", "tags: [\"\"]", "archives: [\"$CURRENT_YEAR\", \"$CURRENT_YEAR-$CURRENT_MONTH\"]", "description: \"\"", "url : \"/entry/$CURRENT_YEAR/$CURRENT_MONTH/$CURRENT_DATE/$CURRENT_HOUR$CURRENT_MINUTE$CURRENT_SECOND\"", "---", "$2", ], } } 出力例 --- title: "" date: 2024-07-15T15:59:44+09:00 draft : false author: ["yama.sh"] tags: [""] archives: ["2024", "2024-07"] description: "" url : "/entry/2024/07/15/155944" comments: true --- setting.json { "vsnotes.defaultNotePath": "/Users/b0ffa/project/oresugo/.vscode", "vsnotes.noteTitleConvertSpaces": " ", "vsnotes.defaultNoteTitle": "entry_{dt}.{ext}", "vsnotes.tokens": [ { "type": "datetime", "token": "{dt}", "format": "YYYY_MM_DD_HHmmss", "description": "Insert formatted datetime." }, { "type": "title", "token": "{title}", "description": "Insert note title from input box.", "format": "Untitled" }, { "type": "extension", "token": "{ext}", "description": "Insert file extension.", "format": "md" } ], "vsnotes.templates": [ "blog", ], } 使い方 コマンドパレットから「VSNotes: Creat a New Note」したとき「blog」が一覧から選ぶ。</description></item><item><title>Google Docsのショートカット集</title><link>https://www.cyamax.com/entry/2022/08/15/070000/</link><pubDate>Mon, 15 Aug 2022 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2022/08/15/070000/</guid><description>
Google Docsのショートカット集Google Docs（ドキュメント）のショートカット集を作成しました。
チートシート（Cheats Sheet）とも呼ばれています。
ダウンロード PDFファイルのダウンロードはこちらからできます。
GoogleDocs_CheatsSheet.pdf
リポジトリ 間違いなどがあれば、Githubからプルリクをお願いします。
[https://github.com/cyamax/cheats-sheets]
更に速度を上げたい 仕事のスピードを上げたい方向け
すべての仕事を2分の1の時間で終わらせる ガチ速仕事術 Amazonで購入 参照元 https://support.google.com/docs/answer/179738?hl=ja&co=GENIE.Platform%3DDesktop&oco=1#zippy=%2C%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88</description></item><item><title>PythonでTorを使用する（基本）</title><link>https://www.cyamax.com/entry/2022/04/13/082220/</link><pubDate>Wed, 13 Apr 2022 08:22:20 +0900</pubDate><guid>https://www.cyamax.com/entry/2022/04/13/082220/</guid><description>
基本設定 実行環境 Ubuntu 20.04LTS Tor version 0.4.2.7. Python 3.8.10 Torのインストール＆実行 $ sudo apt install tor Torを一時的に使う（起動する）場合 $ tor ```bash 止めたい場合は、Ctrl + c - Torを常時動かす場合 ```bash $ sudo service tor start Torを止める場合 $ sudo service tor stop Pythonモジュールのインストール $ pip install pysocks pysocksを入れないと下記のエラーが出る。 pythonコード内ではimportしていないのでハマりポイント。
requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support. PythonからTor経由あり・なしでアクセスする import requests # importは不要だがpysocksのモジュールを事前にインストールしておく必要あり proxies = { "http": "socks5://127.0.0.1:9050", "https": "socks5://127.0.0.1:9050" } # Torを使用した場合 print("Torあり") print(requests.get("http://httpbin.org/ip",proxies=proxies).text) # Torを使用していない場合 print("Torなし") print(requests.get("http://httpbin.org/ip").text)</description></item><item><title>【Chrome拡張機能】chrome.storage を async/await で簡潔に書く方法</title><link>https://www.cyamax.com/entry/2021/06/01/070000/</link><pubDate>Tue, 01 Jun 2021 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2021/06/01/070000/</guid><description>
はじめに Chrome拡張機能を作っていると、chrome.storage.sync か chrome.storage.localを使うことが良くある。
chrome.local.sync.get( date => { console.log(date) }) 値取得時に簡単な処理なら良いが、複雑な処理を書くとネストが深くなりコールバック地獄になってしまうので、
Promise(async/await)を使って使いやすくする。
いつも使うので、自分用にテンプレートとして記載
書き方 準備 const getStorage = (key = null) => new Promise(resolve => { chrome.storage.local.get(key, (data) => {resolve(data)}); }); // 省略形 const getStorage = (key = null) => new Promise(resolve => { chrome.storage.local.get(key, resolve)}) }); 取得時 thenの場合 getStorage().then((data) => {console.log(data)}) async/awaitの場合 (async () => { let a = await getStorage(); console.log(a); // })();</description></item><item><title>【Chrome拡張機能】local.storage の容量制限解除と確認方法</title><link>https://www.cyamax.com/entry/2021/05/29/222210/</link><pubDate>Sat, 29 May 2021 22:22:10 +0900</pubDate><guid>https://www.cyamax.com/entry/2021/05/29/222210/</guid><description>
ストレージを増やす Chrome拡張機能を開発中に、急にデータの保存が効かなくなり以下のエラーが出ていた。 Unchecked runtime.lastError: QUOTA_BYTES quota exceeded
もともとchrom.storage.sync.setで保存していたのだが、どうやら一つのキーに対して保存できるのは8KBまでらしく、 それ以上の保存をしたい場合、保存先の変更と拡張が必要らしい。
拡張方法 作成しているchrome拡張機能のmanifest.jsonのpermissionsにunlimitedStorageを追加する。
"permissions": [ "storage", "unlimitedStorage" ], そして、chrome.storage.sync→chrome.storage.localに変更
//chrome.storage.sync.set({ key: value}) chrome.storage.local.set({ key: value}) これで同期機能は使えなくなったが、8KB上限はなくなった。
ストレージを確認する拡張機能を使う 今まで保存した内容を確認するのに以下のようなコードを打っていたが、
毎回打つのは面倒だし、使い勝手は良くなかった。
chrome.storage.sync.get(null, ((data) => {console.log(data)})); 調べてみるとchrome.storageを確認する拡張機能を見つけた。
コンソール画面から遷移して確認するが、コードを打たなくて良いのでかなり楽である。</description></item><item><title>テスト駆動Python：環境構築~Chapter1：技術書メモ</title><link>https://www.cyamax.com/entry/2020/10/01/070000/</link><pubDate>Thu, 01 Oct 2020 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2020/10/01/070000/</guid><description>
読み進めた本 テスト駆動Python
テスト駆動Python Amazonで購入 pytest とは何か ソフトウェアテストフレームワーク。 既存の unittest/nose などと比較して、テストが読みやすい。 単純なテストを書くのが簡単。 複雑なテストを書くのも簡単。 unittest/nose のテストを pytest でも実行できる。 サンプルソース 本書のコードは公開されている。 ※もちろんこれだけでは意味が分からないので、本の購入は必要。 [https://pragprog.com/titles/bopytest]
本書のサンプルコードを実行するにあたり作成した環境 私個人の実行環境であり、本の内容とは関係ない。 Windows の WSL2 環境で検証。 WSL2 の中身は Ubuntu。
$ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.1 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.1 LTS" VERSION_ID="20.04" $ python -V;pipenv --version;pytest --version Python 3.8.2 pipenv, version 2020.8.13 pytest 6.1.0 pipenv を利用した仮想環境の場合 各個人の環境に依存。 私の場合は、今回はpipenvを利用して仮想環境を構築した。
$ pip3 install pipenv --user $ pipenv install pytest ##### pipenv の設定 ##### #.bashrc/.zshrcなどに追記する ## pipをユーザ権限でインストールしたときのライブラリの保存先にPathを通す export PATH="$PATH:$HOME/.local/bin" ## pipenvで仮想環境を作るときにproject配下に.venvを作成 export PIPENV_VENV_IN_PROJECT=1 VSCode の設定 本書ではpytestのコマンドでテストを実行させていたが、VSCode の GUI でも実行できるためそちらを試した。
pytest を VSCode から実行できるようにする。 コマンドパレット(ctrl+shift+p)からpython configure testsを入力して設定を開く。
どのテストライブラリを利用するか選択。今回は本と同じ pytest を選択。
どこに test ファイルがあるのかを選択。
Chapter1 はじめての pytest 左側にフラスコのアイコンが現れるので、そこをクリックし、Run All Testsボタンを押下するとテストが実行される。
ターミナル(ctrl+shift+@)のPROGRAMSのタブにより具体的な結果が表示される。
show test output からtest_failingを確認することができる。
※test_failingはなぜ失敗したのかの詳細セクション
assertについて assertの後にbool値を返す式を書く。
def test_check(): t = 1 assert 1 == t assert (1, 2, 3) == (t, 2, 3) サンプルコードの"namedtuple"について 例としてnamedtupleを使っていたが、知らない関数だったので調べた。
https://qiita.com/Seny/items/add4d03876f505442136
## こんな風に使う >>> from collections import namedtuple >>> Car = namedtuple('Car' , 'color mileage') ## 出力 >>> my_car = Car('red', 3812.4) >>> my_car.color 'red' >>> my_car.mileage 3812.4 ※qiita から抜粋
雰囲気だけ理解して、本質ではないので次に進む。
サンプルコードでやっていること Task オブジェクトを作成して、その挙動を test 関数を使って検証している。
from collections import namedtuple # Taskというデータ型のフィールド'summary', 'owner', 'done', 'id'を定義 Task = namedtuple('Task', ['summary', 'owner', 'done', 'id']) # デフォルト値を定義 Task.__new__.__defaults__ = (None, None, False, None) # パラメータを指定しないときのデフォルト値(t1)がt2と一致するかのテスト def test_defaults(): t1 = Task() t2 = Task(None, None, False, None) assert t1 == t2 # namedtupleの.フィールド名が一致しているかテスト def test_member_access(): t = Task('buy milk', 'brian') assert t.summary == 'buy milk' assert t.owner == 'brian' assert (t.done, t.id) == (False, None) pytest のオプション（紹介があったものだけ） -v, &ndash;verbose &ndash;collect-only -k EXPRESSION -m MARKERXPR -x, &ndash;exitfirst &ndash;maxfail=num -s, &ndash;capture=method &ndash;lf, &ndash;last-failed &ndash;ff, &ndash;failed-first -q, &ndash;quite -l, &ndash;showlocals &ndash;tb=style &ndash;durations=N &ndash;version -h, &ndash;help ディスカバリルール（実行するテストとして認識させるためのルール） テストファイルは test_~~~ .py か ~~~_test.py 名前でないといけない。 テストメソッド、関数は test_~~~ でないといけない。( ~~テストはダメ？) テストクラスは Test~~~ でないといけない。（ ~~テストはダメ？） pytestを引数なしで実行すると、上記のルールで書かれたファイル、関数、メソッド、クラスを探索されてテストコードが実行される。
感想 TDD がどんな感じなのか、雰囲気を理解した。続きは読み次第追記。
書籍 テスト駆動Python Amazonで購入</description></item><item><title>MacbookProに４Kモニタを２台繋いで在宅環境を強化する</title><link>https://www.cyamax.com/entry/2020/06/08/070000/</link><pubDate>Mon, 08 Jun 2020 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2020/06/08/070000/</guid><description>
はじめに 結論 ２７インチ２画面運用はやめとけ。
２枚のディスプレイは視界に入りきらないし、首が痛くなる。
もくじ この記事を書いている人 製造業のデータサイエンティスト。 コロナの影響で在宅勤務になり、今は家で仕事をしています。
仕事と個人の作業効率が上がりそうと思い、ディスプレイを購入しました。決して社畜だから買ったわけではありません。
PCの用途 仕事では大量のデータを眺めたり、コーディングを行っています。なので、Excelなどデータを見るときは表示できる列数が多い方が助かるし、 データを観ながらコーディングをするので、広い画面の方が捗ります。
今まではSlackやTeamsのようなコミュニケーションツールとメール/カレンダーも開きつつ、データもみて、webサイト調べながらコーディングして、、テストの結果見て・・・と都度画面を切り替えて使っていました。
モニターを買う大義名分 きっかけはコロナによる在宅勤務ですが、価値観の変化によるものもあります。 自宅の環境をよくすれば仕事も趣味の開発も効率を上げることができる。 仕事の効率が上がれば、家族や趣味に使える時間が増え、開発もより短い時間で効果が出せるので、投資効果が高いと判断しました。
自宅環境への投資効果が高いことにはすぐ気づけましたが、その後どのディスプレイを買うかにかなりの時間を使ってしまいました。
買うまでの話 これまでの環境 デスクトップPCは持っておらず、仕事ではThinkpad X1 carbon、個人ではMacbook Pro 13inch (2016Late)を利用。
ノートPCスタンドを利用していましたが、外部モニターとノートPCの画面サイズが違いすぎて違和感がありました。
Bestand ノートパソコンスタンド PCスタンド 滑り止めパッド付き アルミ合金製 放熱性 Macbook/Macbook Air/Macbook Pro対応 -グレー Amazonで購入 既に４Kモニターは持っていたが、疲れるので買い替えたい。 ノートPCスタンドと併用して４K24インチモニターをこんな感じに３年間使っていましたが、安物のせいか長時間の作業をすると非常に疲れました。
普通に考えれば、４K２画面にしたいのであればこれと同じ４Kを買うのが一番安上がりなんですが、上記の理由からもう一台買おうという気にはなりませんでした。
損をしたくないからかなり迷ったけど、長い時間迷っている方が損だった 新しいモニターを買おうと思ったのですが、ここからが非常に迷いました。
ノートPCで使うし、デスクをスッキリさせたいからtype-cによるPowerDelivery付きの方がよい？ USBハブ機能はあったほうがよい？ ４K２枚ではなくウルトラワイドモニタという選択肢はどうか？ 湾曲ディスプレイも良さそう というか、デスクトップPCを買ったほうが処理スピード上がって効果的では？ そもそもノートPCで8K出力はできるのか？ トータル３週間ぐらい迷ったと思います。しかも結構な時間をかけて調べていました。
そして気づきました。
この悩んでいる時間を自分の時間単価で計算すると、すでに４Kモニターを変えるくらいの時間を使っている・・・。
しかも私生活や仕事中にモニターのことを考えてしまって集中力や能率にも悪影響を及ぼしている。
考える時間が増えるほど、自分にマイナスと判断したので、以下のように必要機能を絞り込み、４Kの購入に踏み切りました。
購入の目的：作業の効率を上げたい。身体への負担を軽減したい 検討事項
ノートPCで使うし、デスクをスッキリさせたいからtype-cによる電源供給付き＆USBハブ付きの方がよい？ ケーブルの抜き差しの頻度は多くない。電源供給付きは２万ほど高くなるが、ケーブルが一本減ることで差額の２万円分の投資効果がでるとは考えられない。→不要と判断。 ４K２枚ではなくウルトラワイドモニタという選択肢はどうか？ 解像度で考えたときに、表示できる情報量がフルHD２枚よりも少ない→却下。 湾曲ディスプレイも良さそう 湾曲ディスプレイの高解像度ディスプレイは種類が少なくコスパが悪い。また、画面が湾曲していることにより直線が歪むため、資料作りやWEBサイトのデザインなどに悪影響が出ると判断→却下。 買ったあとの話 実際に買った４Kディスプレイ 色々考えた結果、以下のディスプレイを買いました。2020年6月時点では４万５千円ぐらいだったと思います。
LG モニター ディスプレイ 27UL650-W 27イン Amazonで購入 ベゼルはかなり狭い
見えないところですが、背面は白色です。
GPUの負荷はそこまで高くなかった GPUの負荷率をWindwos,MacBookProの両方でみてみましたが、逼迫するほど使用率が高いというわけではありませんでした（もちろんPCのスペックによると思います）。
MacBookProで4K２画面接続＆Youtubeを再生したときのGPU使用率
24インチ→27インチにして良かった 24インチ4Kと27インチ4Kの違いですが使用感はかなり違いました。 一番感じたのは画面の３分の１分割でも辛くないという点です。 横方向に３分割したとき、実用的なのは２７インチです。 ２４インチでも３分割利用はできますが、文字が小さすぎので身体への負担は大きかったです。
画面が広くなった 当たり前過ぎるので書かなくても良いかもしれませんが、広くなりました。意味がわからないかもしれませんが、１ルームから２LDKに引っ越して部屋が少し余る感覚と近いかもしれません。
すべて画面上に表示されているので、通知が来る度に画面を切り替えたり最小化や最大化をする頻度が減りました。作業に集中できるようになりました。
２４インチと２７インチの構成でも多分問題なかった ここまで書いてあれですが、２７インチで２枚揃えたのはやりすぎだった感はあります。 元々持っていた２４インチを補助的なモニターにして２７インチをメインとして使っても全然良かったと思います。 左右に同じディスプレイを並べたいという非合理的な感情で買い揃えてしまった感はありますが 「やっぱり２枚買い揃えておけばよかったかな」と後々後悔したくなかったので、バシッと買い揃えました。 あと、同じ型番のディスプレイでも工場や時期によって色合いが異なることがあるらしいので同時購入しました。
27インチの縦置きはおすすめしない 人間の目は縦方向の視野角は狭いので、どうしても視界から外れます。また、メガネをかけているとメガネのフレームとも被ってより見づらい気がしました。 以前、24インチの縦置きで使用していましたが、ぎりぎり使用範囲内でした。
気づいた点 ノートPCで8K出力しても意外といける 今から四年前ほどMacbook Pro2016 Lateのスペックでも8K出力できました。 今のところ不具合は無いです。
HDMIとDisplayPortの違い デジタル信号なんだから同じだろうと思っていたのですが、HDMIとDisplayPortで色味が違うことに気づきました。 PC側の対応状況やプロファイルの設定、HDMIケーブルの条件等が揃わないとHDMI出力は１００％の機能を発揮できないようです。 DisplayPortで出力した場合は、問題なくキレイに描写されていました。
MacbookProはType-cポートしかないので 以下のようなType-c to DisplayPortのケーブルを購入しました。
関係ないですが、布ケーブルって少し高級感があるので好きです。
リフレッシュレートの違い 上と同じようにHDMIとDisplayPortでリフレッシュレートが異なる場合があります。 私のMacbookProではHDMIでの4K@60Hzに対応していないので、HDMI接続したモニタ側のみ30Hzになっていました。 （DisplayPort接続では4K@60Hzに対応）
ディスプレイ購入前はDisplayPortの存在意義をよく分かっていませんでしたが、４K出力をする際はDisplayPort接続の方が無難なようです。 このあたりは同じディスプレイを並べて使わないと気づけない点だったので収穫でした。
購入時の注意点など モニターアーム（VESA）の対応有無 低価格帯のディスプレイは値段を下げるためにVESA非対応なものが多いです。後々アームを付けたくなったときに困るので、アームを付けたい人は要チェック。 また、モニターアームのピンきりで２画面対応で３千円台のものもあれば、３万円（エルゴトロンなど）の高級品もあります。個人的にはモニターアームを毎日調節することはないので、安いモニターアームを購入して差額分をPCや椅子に回したほうが費用対高価が高いと思います。 HUANUO PCモニターアーム デュアル 液晶ディスプレイアーム 2画面 13～27インチ対応 耐荷重1～10kg グロメット式＆クランプ式 VESA100*100 多角度調節 ケーブル収納 Amazonで購入 HUANUO PCモニターアーム デュアル 液晶ディスプレイアーム 2画面 13～30インチ対応 耐荷重2～9kg ガススプリング式 グロメット式＆クランプ式 VESA100*100 多角度調節 ケーブル収納 Amazonで購入 液晶の種類 液晶の種類にはTN/VA/IPS/有機ELなどがあります。デザインや写真など視野角や発色重視ならIPS、ゲームなどの反応速度重視ならTN/VA などそれぞれ長所短所を 理解して選ぶ必要があります。私は作業用途なのでIPSにしました。 type-cによる電力供給機（PowerDelivery)とUSBハブ機能 モニターに付いたUSBポートにキーボードや外付けドライブを付けてtype-c経由でケーブルをまとめる事もできますが、動作が不安定なようです。また、上記の通りコスパの悪さから私は選びませんでした。USBハブ付きデュスプレイを２枚にして使うよりも以下のようなドッキングステーションの方が安い＆機能も豊富＆応用が効きやすいので良いと思います。 CalDigit TS3 Plus/Thunderbolt Station 3 Plus/Thunderbolt 3 ドッキングステーション（スペースグレイ・0.7mケーブル付き）［TS3Plus-JP07-SG-AMZ］ Amazonで購入 32インチの４Kのデュアルディスプレイはやめておいたほうが良い
27インチを２枚並べると視野角ギリギリです。これ以上大きい画面を並べると視界に収まらないので首を左右に振る事になり逆に使いづらいと思います。 ノートPCのファンがうるさいかも
8K出力でPCへの負荷が高い&amp;クラムシェル利用なので、PCの温度は以前よりも上がり気味です。以前よりもファンが動いている時間が長くなったような気もします（部屋の温度にもよるかもしれませんが）。 まとめと感想 ４Kのデュアルモニターはやってみて満足でしたが、結局首が痛くなってモニター一台＋ノートPC運用に戻りました。 これは実際に買ってみない限りはわからないことだと思います、ロマン溢れる画面２つは実は使いづらいということは。</description></item><item><title>Macbook Proは一年間で価値がいくら下がるのか。</title><link>https://www.cyamax.com/entry/2019/12/24/070000/</link><pubDate>Tue, 24 Dec 2019 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2019/12/24/070000/</guid><description>
MacBookの値段が下がりづらいという話 Macbookは他のPCと比べて値段が落ちにくい（中古で売っても高く売れる）と言われていますが、
実際のところ年間いくら価値が下がるのかを中古市場の価格推移から計算したいと思います。
集計条件 情報源 Yahooオークションの取引履歴 集計機器 MacBookPro 2016 Late 以降のモデル（Type-C搭載モデルから） 集計期間 2015年6月 ~ 2019年11月までの取引 抽出条件 取引価格20,000円以上 データ収集後のフィルタ条件 ジャンク除外 出品タイトルに型番、CPU、メモリ、SSD容量を含むもののみ 取得した取引数は約64,000件となり、 上記フィルタに合致したのは、約2,000件となりました。
今回はこの2,000件を集計しています。
ばらつきについて 同じ型番の取引でも「オプションガジェット付き」だったり、傷の有無など価格に影響する要素が多数あり取引が同一条件ではありません。
傾向を分析するという意味で簡単なクレンジングはしていますが、プロットにばらつきがあるのは許容しています。
取引回数 各スペックと取引回数の表になります。2016年モデルはメモリ8G,SSD256GB、2017年モデルはメモリ16GBSSD128GBモデルの取引が多いことがわかります。
どちらもその年のモデルの中で最安値モデルなので、安いモデルが一番市場に出回っている事がわかります。
価格推移 価格推移については長期的な視点で確認するために、 十分な期間が経っているMacBookPro2016 Late モデル（集計時点で発売から３年経過）で分析しました。
一言にMacBookPro2016 Late モデルといっても、
13/15インチ、TouchBarあり/なし、メモリ、SSD、CPUなど様々な違いがあります。
ここでは一番大きな違い（公式のモデル区分）である、３タイプで分類しています。
13インチ2Port(TouchBarなし) TouchBarが無く、CPU,GPUがTocuhBarモデルよりもグレードが低い。 13インチ4Port(TouchBarあり) 15インチ4Port ※15インチにはTouchBarなしモデルは存在しない モデル別取引価格推移 取引日と取引価格をプロットすると、予想通り発売日から日が経つにつれて取引価格が徐々に下がっていることが確認できました。
下がり方が直線的（１次関数）のように見えるので、さらに近似式（直線）を書いています。
線を引くとモデルによって傾きが違うことがわかります。この傾きが大きいほど、値段の下がる速度が早いことを表します。
以下の図では、13インチ2Port(TouchBarなし)が一番傾きが小さく、15インチ4Port が他と比べて値下がる速度が早いことがわかります。
値下がりの速度（傾きの大きさ）ですが、MacBookPro 2016 Late の場合は
13インチ2Port(TouchBarなし) 45円/日（16,425円/年) 13インチ4Port(TouchBarあり) 77円/日（28,105円/年) 15インチ 90円/日（32,850円/年） という結果になりました。 これは、一日後には価値が45円下がっているという意味であり、
家にあるPCを売ろうとしたとき、一ヶ月待つと価値が1500円〜3000円ほど下がっているということになります。
モデル/メモリ別取引価格推移 同様にメモリ、SSDのスペックの違いによる価格推移を見てみます。
メモリ別価格推移 メモリを増設すると傾きが大きくなる（値下がる速度が上がる）ことがわかりました。
これはメモリだけではなく、SSDやCPUでも同様の傾向が確認できました。
取引の傾向 「新モデルが発表されると旧モデルが売りに出される」という仮設を検証するため、各モデルの取引数をグラフにしました。
2017年モデルが発売される直前に、2016年モデルの取引数が増えていることがわかりますが、他の年ではそこまで顕著な増加はないように見えます。
相関など出してみるとなにか傾向が見えてくる可能性があります。
まとめ MacBookProの中古市場の値下がり傾向を調査しました。毎年一番安いモデルが多く市場に出回り、高スペックモデルになればなるほど、値下がる速度は早くなることがわかりました。 MacBookPro 2016 Lateの場合、値下がる速度は下記に示す値であり、2019年モデルなどでも同じような傾向になることが予想されます。
MacBookPro 2016 Lateの中古市場の値下がりスピード
13インチ2Port(TouchBarなし) 45円/日（16,425円/年) 13インチ4Port(TouchBarあり) 77円/日（28,105円/年) 15インチ 90円/日（32,850円/年） この結果から、「MacBookは一番価値が下がりづらい最安値モデルを買えばいいんだ」と思うのは早合点です。
低スペックモデル（最安値モデル）と高スペックモデルでは値下がる速度が年間16,500円ほどの差がありますが、PCの処理スピードが違うので仕事の速さも変わってきます。 「毎日PCを触る人 or 重い処理をする人なら年間16,500円の違いで効率が変わるので、高スペックを買ったほうが良い」、 逆に「ほとんど触らない or ブラウジングしかしないという人であれば、最安値モデルが良い」ということが自分の時間単価と比較して数値から判断できそうです。
おまけ：テキストマイニング オークションに出品されている出品タイトルをテキストマイニングしてみました。 いままでのフィルタ条件をなくし、&ldquo;MacBook Pro"というタイトルを含む20,000円以上のオークションの取引をランダムでサンプリングしています。
以下サイトで簡単なテキストマイニングは無料でできます。
https://textmining.userlocal.jp/results/po6BjaLStAW6TDi1txdDpNpFpJAcQDwu
ワードクラウド スコアが高い単語を複数選び出し、その値に応じた大きさで図示しています。 単語の色は品詞の種類で異なっており、青色が名詞、赤色が動詞、緑色が形容詞、灰色が感動詞を表しています。
単語出現頻度 文章中に出現する単語の頻出度を表にしています。単語ごとに表示されている「スコア」の大きさは、 与えられた文書の中でその単語がどれだけ特徴的であるかを表しています。 通常はその単語の出現回数が多いほどスコアが高くなりますが、 「言う」や「思う」など、どの文書にもよく現れる単語についてはスコアが低めになります。
共起キーワード 文章中に出現する単語の出現パターンが似たものを線で結んだ図です。出現数が多い語ほど大きく、また共起の程度が強いほど太い線で描画されます。
2次元マップ 文章中での出現傾向が似た単語ほど近く、似ていない単語ほど遠く配置されています。距離が近い単語はグループにまとめ、色分けしています。
階層的クラスタリング 文章中での出現傾向が似た単語をまとまりとしてとらえられるよう樹形図で表したものです。グループは色分けして表示しています。
Apple 2023 MacBook Pro 12 コアCPU、18 コアGPU のM3 Proチップ搭載ノートパ ソコン:14.2 インチ Liquid Retina XDR ディスプレイ、18GB ユニファイドメモリ、 1TBの SSD ストレージ、iPhone や iPad との連係機能 - シルバー Amazonで購入</description></item><item><title>あいつ、セキュリティエンジニアやめるってよ</title><link>https://www.cyamax.com/entry/2019/10/15/080000/</link><pubDate>Tue, 15 Oct 2019 08:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2019/10/15/080000/</guid><description>
「やめるってよ」というか、2019年9月からセキュリティエンジニアをやめてデータサイエンティストになりました。
振り返りとセキュリティ対する成仏の意味を含めたポエムになります。
いままでのキャリア 大手携帯通信会社（非IT業務）
↓
IT系中小企業（情シス→社内セキュリティ担当:SIRT/SOC）
↓
大手製造業（社内セキュリティ担当→データサイエンティスト）
セキュリティエンジニアをやめた理由 一言にセキュリティエンジニアと言っても様々な職種※があります。
私は世間一般的に情報セキュリティ部やCSIRT/SOCのような自社の社内向けセキュリティ業務全般を担当してました。
※参考
https://www.liber.co.jp/knowhow/careerlab/se/002.html
昔セキュリティエンジニアをめざしたわけ セキュリティエンジニアになりたいと思っていた一番大きな要素は、
技術的な興味と知識欲を満たしてくれるということでした。
自分が普段触っているPCやサーバがどのように動いているのか（CPUやメモリの動きや、プログラムがコンパイルされて動くまでの流れ、プロセスやネットワークのやり取りなど）、 知れば知るほど上手に使えるようになることに面白さを感じました。
今後様々なものがネットワークに繋がり便利になる一方で、セキュリティの問題が露呈し、 セキュリティエンジニアの需要が高まるだろうという市場の拡大にともなう人材不足（需要上昇）を視野に入れていました。
セキュリティエンジニアを辞めた理由 辞めた理由はいくつかありますが自分にとって大きいものは以下になります。
面白い（興味がある）部分と企業が求める部分とのギャップ 目指した理由に書いたとおり、技術的な面白さが好きでセキュリティエンジニアになったわけですが、 実際になってみると、認識が甘かったと痛感しました。 セキュリティエンジニアへの需要が増えることは予想通りだったのですが、 増えた需要は「企業内の情報セキュリティの事故が起きないようにする・起きても対応できる（最小化）ようにする」ことであり、 社内のセキュリティのIT技術力を上げることは「手段の一つかもしれないが目的ではない」というところです。
もっと言うと、日本の普通の企業はサービスや製品の脆弱性を見つけるエンジニアは不要であって、
会社全体のセキュリティを高めれるような、何かあっても対応できるような人材を欲しているというところです。 実際、社内セキュリティエンジニア（SIRT)をしているときに、転職サイトに自身のプロフィールを公開したところ、 誰もが知っている大企業や、ビットコイン系やら、昔働いていた会社やら、複数の会社からオファーやメッセージが届きました。
ただ、上に書いたように私がもともとやりたい方向に近かった脆弱性を見つけるようなことは、 今の日本では自社でやっているところは非常に少なく、基本的にはセキュリティベンダでないと業務としてやるのは難しいです。
心理的安全性がない Googleの言うチーム間のコミュニケーションや雰囲気という意味ではなく、
いつセキュリティ事故が起きるかわからない（起きているけど気づいていない）というストレスに常に襲われていました。 そのため、事故の発覚が起きやすい連休明け前になると無意識にピリピリしていたように感じます。 事故も会社の規模や業態によって受ける被害は様々ですが、個人情報が流出したときの慰謝料や機会損失だけではなく、 工場などの古いPCが感染して生産ラインがストップすると日単位で数億円の損害が出るので、 事故発生時にはそれを自分がどうにかしないといけないという無意識が常時発生していました。
社員との対話が大変 セキュリティをやってみて一番以外だったのは、非常にコミュニケーション能力を求められるということです。
もちろんセキュリティ内の職種にもよりますが、社内セキュリティ担当は分業化されていることは少なく、複数の役柄を掛け持ちで少数人で回していることが多いのではないでしょうか。
そうなるとフォレンジックや侵入テストだけやれば良いなどはなく、社内ルールを決めたり、周知したり、どのように対策すれば良いか社員側と議論したり、
インシデントが起きたら正しく事象を把握するヒアリング能力などコミュニケーション能力がかなり求められる印象でした。
「今まで大丈夫だったし、なんの問題もないんだけど。」
「またセキュリティソフトが誤検知しているんですけど。」
こんな感じで仕事中は対話に時間と精神力が奪われていきます。
結局セキュリティは二の次 車の安全性を考えたときに、一番簡単な方法は"車を運転しないこと"ですが、 ただそれは不便で生活できません。 会社の運営も似ていてセキュリティを考えてあれこれ禁止にすると業務にならないので、なんとかするのも社内セキュリティエンジニアの仕事と思います。
ただPCを操作するのは社員なので、自分から安全装置を切ってスピード出して壁に突っ込んでも、その後処理や対策をこちらで考えないといけないのが辛いところです。
&ldquo;運転しても事故にならないようになんとかしてよ。ただし運転するのは俺な。&rdquo;
こんなイメージです。
正直無理ゲー プロキシ入れようが、EDR入れようが、MSSを導入しようが、管理できない端末はたくさん出てきます。 業務や案件を盾に抜け道はいくらでもあります。 限りある予算と人員の中で可能な限りセキュリティを高めているのが現状だと思います。
社内のネットワークに勝手にRaspberryPiを繋がれたり、家のUSB,SDカードを悪気もなくPCに挿したり、 情シスに勝手に管理ソフトを入れられたくないからと故意にPCを登録しない＆セキュリティソフトを入れない。 訳のわからないソフトをインストールしてセキュリティソフトがブロックするも誤検知でブロックされたんだけど！と怒る。 PCの管理者権限を渡さないなどシステム的に禁止にもできますが、
会社全体の生産性を下げ、こちらも運用負荷が発生し、なによりも誰からも感謝されないのが辛いところです。
けれど何か問題が起きたら社内セキュリティ担当者が対応しないといけない。 技術的な部分よりも人間力が非常に求められる職種だったと思います。
データサイエンティストになりました そんなこんなで地方でセキュリティエンジニアを続けていくのはモチベーションとして難しいと判断し、 色々あってデータサイエンティストになりました。
なぜデータサイエンティストなのか/どうやってなったのかはここでは省きますが、 今は売上予測や、データの可視化などを行なっています。
社会人になってから今まで、運用という守りの仕事でしたが、
やっと0から1にするような仕事ができ満足度は上がりました。
最後に 私はもうセキュリティの仕事をしない決心をしていますが、 データサイエンティストの仕事をしていても、セキュリティエンジニア時代に身に着けたスキルが役立つことが多いです。 というかどんな仕事していてもセキュリティの知識は汎用性が高いので持っていて損はないと感じました。 ※現データサイエンティストの必要能力にセキュリティも含まれている
私の性格と社内情報セキュリティ担当という職種の相性が悪かっただけで、 上に書いた内容が全然平気、むしろやる気出るという人もいると思います。
社内情報セキュリティ担当の業務範囲は広くなりがちで大変なことが多いですが、その分比例して自身の技術スキルと社会的需要は爆上りなので、 自分のスキルや市場価値を上げたい！、社内セキュリティに興味がある！という人は是非やってみると良いと思います。</description></item><item><title>fluentdのプラグインを入れるときにエラーが出る</title><link>https://www.cyamax.com/entry/2019/03/12/070000/</link><pubDate>Tue, 12 Mar 2019 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2019/03/12/070000/</guid><description>
経緯 logz.ioの無料ELKサービスを試したかった。
ログを転送するためにfluentdのプラグインをAWSのサーバにインストールしようとしたときに、エラーが出たのでメモ。
環境 AWSのインスタンス：Ubuntu16.04 以下の手順でfluentdをインストール
エラー内容 ubuntu:/opt/td-agent/usr/sbin$ sudo td-agent-gem install fluent-plugin-logzio Fetching: net-http-persistent-2.9.4.gem (100%) Successfully installed net-http-persistent-2.9.4 Fetching: serverengine-2.1.0.gem (100%) Successfully installed serverengine-2.1.0 Fetching: strptime-0.2.3.gem (100%) Building native extensions. This could take a while... ERROR: Error installing fluent-plugin-logzio: ERROR: Failed to build gem native extension. current directory: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/strptime-0.2.3/ext/strptime /opt/td-agent/embedded/bin/ruby -r ./siteconf20190311-4307-65kdm.rb extconf.rb checking for rb_timespec_now()... *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:467:in `try_do': The compiler failed to generate an executable file. (RuntimeError) You have to install development tools first. from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:552:in `try_link0' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:567:in `try_link' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:747:in `try_func' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1032:in `block in have_func' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:923:in `block in checking_for' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block (2 levels) in postpone' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block in postpone' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:347:in `postpone' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:922:in `checking_for' from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1031:in `have_func' from extconf.rb:3:in `&lt;main>' To see why this extension failed to compile, please check the mkmf.log which can be found here: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0/strptime-0.2.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/strptime-0.2.3 for inspection. Results logged to /opt/td-agent/embedded/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0/strptime-0.2.3/gem_make.out 対応方法 $ sudo apt install gcc make gccとmakeをインストールすることでエラーが出なくなった。
上記エラーにはgccやmakeなどの文言が出てこないので、分かりづらい。</description></item><item><title>WindowsServerのDHCPログをローテーションしたい</title><link>https://www.cyamax.com/entry/2019/02/06/211411/</link><pubDate>Wed, 06 Feb 2019 21:14:11 +0900</pubDate><guid>https://www.cyamax.com/entry/2019/02/06/211411/</guid><description>
目的WindowsServerのDHCPログは一週間分しか保持されない。
仕様により曜日ごとにログが生成され、一週間経つと上書きされてしまう。
そのため一日一回前日のログを別フォルダに日付名で保存させることでログを保全する。
使い方 ログの保全先フォルダを作成（以下スクリプトではC:\Windows\System32\dhcp\を指定）
WindowsServerのタスクスケジューラで一日一回実行してください。
コード Powershellで実装。
# 機能 # WindowsServerのDHCPログを別フォルダに一日一回コピーする # # 目的 # WindowsServerのDHCPログは一週間分しか保持されない。 # 曜日ごとにログが生成され、一週間経つと上書きされてしまう。 # そのため一日一回前日のログを別フォルダに日付名で保存させることでログを保全する。 # # 使い方 # タスクスケジューラにこのバッチを一日一回セットする ## 参照先・保全先 $src_file_def = "C:\Windows\System32\dhcp\" # DHCPのデフォルトログの保存先 $dst_file_def = "C:\Windows\System32\dhcp\log\" # コピー先(保全先)のディレクトリ ## 前日の日付取得 $date = (Get-Date).AddDays(-1).ToString("yyyyMMdd"); ## コピー先(保全先)のファイル名を生成 $dst_file = $dst_file_def + "$date" + ".log" ## コピー元のファイル名 $youbi = (Get-Date).AddDays(-1).DayOfWeek # 前日の曜日を取得 $youbi_3 = "$youbi".Substring(0,3) # 前日の曜日から頭３文字を抜き出す（Sunday→Sun） $src_file = $filename_def + "DhcpSrvLog-" + $youbi_3 +".log" #echo $src_file #echo $dst_file ## コピーを作成 Copy-Item -Path $src_file -Destination $dst_file -Force その他 急遽必要になったのでさっと作ったが、結局自分では使わなかったので、これが本当に使えるのか未検証です。
多分DNSログにも使えると思う。
WindowsのDHCPログで調べると「仕様がクソ」みたいな記事が出てくるけど、確かにそう思う。なんでこんな仕様なんだろうか。</description></item><item><title>佐川急便の偽サイト(フィッシングサイト)を調査した</title><link>https://www.cyamax.com/entry/2018/08/12/004523/</link><pubDate>Sun, 12 Aug 2018 00:45:23 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/08/12/004523/</guid><description>
概要 2018/07末頃から、佐川急便からの不在通知を偽ったフィッシングメール（迷惑メール）が送られ、メールを受け取った一部の人が、
メール内の偽サイト(フィッシングサイト)にアクセスし、自分の電話番号を入力してしまうという事例が発生しているらしいので、調査してみた。
偽の「佐川急便」SMSに新たな手口か&ndash;携帯電話番号を窃取 - ZDNet Japan
ドメイン情報 まずドメイン（登録された偽アドレス）を調べて驚きだったのが、佐川急便のフィッシングサイトのドメインは一つだけではなく、他にも200弱のフィッシング用と思われるドメインが存在していた。
さらに驚きだったのが、このドメイン登録者は全部で300近くのドメインを登録しており、その中にはsoftbankやdocomo、auを装ったフィッシングサイトも登録されていた。 このサイトは2018年4月頃に話題になったsoftbankを装ったフィッシングサイトと同じ手法のサイトだった。 当時流行ったサイトの持ち主と同一人物かは不明だが、フィッシングサイトを複数持っていることはわかった。
IPとの結びつきを調べると、ドメイン数300弱に対して、IPは40弱ほど結びついていた。
佐川急便のドメインに絞ると、200弱のドメイン数に対してIPアドレスは20弱だった。
フィッシングサイトとして登録されたアドレスの殆どが●●●.comのドメインだった。
.comのドメイン料金は安くはなく、一つのドメインを登録するのに1000円弱かかるので、この登録者はこのフィッシングサイトのドメイン登録料に最低30万円ほど払っている計算になる。
また登録されていたIPアドレスはHiNetとという中国のホスティング会社のものであり、IP自体は台湾を示していた。
ドメインの登録頻度 この登録者名で登録されているドメインを集計してみました（左の数字がその日に登録されたドメイン数）。 一日に何十件も追加しているのがわかります。
# 2018/07/01から2018/08/10までの情報 32 2018-08-10 9 2018-08-09 10 2018-08-08 34 2018-08-07 23 2018-08-06 21 2018-08-05 1 2018-08-04 21 2018-08-03 20 2018-08-01 21 2018-07-31 18 2018-07-28 34 2018-07-27 1 2018-07-18 1 2018-07-17 2 2018-07-16 1 2018-07-13 1 2018-07-12 1 2018-07-11 3 2018-07-09 サイトの中身 トップページ(index.html) 偽サイトのトップページは本物のSAGAWAのトップページと見た目はほぼ同じ。 異なる部分としては問い合わせフォームの部分が微妙に異なるが、並べてみないとわからない。
本物のサイトとコードを比較
偽サイトは本物のサイトをそのままコピーして作成したようで、id名やclass名、コメントなどもそのままだった。
またサイト内の画像やcssファイルは本物のサイトを参照するようになっていた。
サイト内の一部リンクは、なぜか#(トップページ)に飛ばすようにしていたので、一部修正を加えている模様。
apkファイルのコメントアウト 本物のサイトとは異なり、apkファイル(アプリファイル)をダウンロードさせるようなコードがコメントアウト（動かない）されて記載されていた。これについては後で言及。
アクセス集計 中国のアクセス解析系のサイト。 これで訪問者のアクセス情報を解析していると思われる。
携帯電話の認証(pp.html) 電話番号を入力して「認証コード送信」を押すと次のページに遷移する。 適当に「123」したら弾かれたので、コードをみると入力された値が11桁より小さいか判定していました。なので適当に0を11桁並べたら次のページにいける。
「認証コード送信」を押すと、この時点で/servlet/SvNumにデータを送信(POST)している。 送信している内容は入力した電話番号だけの模様。
そして3秒後に認証コード入力画面(pp2.html)に移動する。
認証コード(pp2.html) ここで認証コードを入力する画面だが、偽サイトに電話番号を入力して検証していないので、本当に認証コードが届くのか不明。
また、認証コードが届いたとしても偽サイトに認証機能などはなく、ここに何の数字をいれてもすべてロード中の画面が表示されて、その後はなにも表示されない。
「確認する」を押すとロード画面が出て、そのあとなにも変わらない。
もともとは認証コードは4桁以上のバリデーションを入れていたようだが、意味が無いので外した模様。
このページで「確認する」のボタンを押すと、前のページで入力した電話番号と確認コードを送っている。
rotpwdとしてkkという変数を送っているが、この値(kk=0)がなにを意味するかは不明。
cookie 一応cookieも見てみたが、特に気になる項目はなかった。
その他 偽サイトドメインの存在しないページすると以下のように中国語で表示された。
Iサーバの言語も中国語。
Googleトレンド 佐川急便の偽サイトは2018年の1月に一度出回って、そのあと音沙汰がなかったが、7-8月に入り再度活動した模様。
apkファイル 2018年の1月の時点では偽サイトにアクセスした際に、上記で調べた内容以外にapkファイル（android向けアプリ）がダウンロードされ、端末にインストールすると様々な情報が取得されてしまうという被害があったが、今回私がアクセスした時点(2018/08/04)では、上記に記載したとおりindex.htmlのコード上ではダウンロードさせる部分はコメントアウトされており、 直接URLからダウンロードを試みたが、apkファイルはすでに存在しなかった。　※ もしかしたらURLによってはダウンロードできるのかもしれない
まとめ 今回の場合の被害範囲は個人の電話番号を入力して認証コード送信ボタンを押した場合に、相手（偽サイトの作成者）に電話番号が送られてしまうことによる情報流出。
悪意のあるapkファイルが配布されていれば要注意だが、今回は確認できなかった。
また、Softbankなどの別会社のフィッシングサイトもあったので、今後このサイトを利用したフィッシングメールが送られるかもしれない。
所感 もう少し深いところまで調べても良かったかも。
複数のサーバとドメインを扱っているので、このフィッシング詐欺にお金をかけている印象。
クレジットカードのフィッシングとは異なり、取得されるのは電話番号だけなので、すぐに被害がでるわけではなさそう（迷惑メールが増えるぐらい？）。
SMS（ショートメッセージ）でもフィッシングメールが届くようなので、それって既に相手に電話番号がばれているのでは？と思ったけど、総当たりでメッセージを送って、有効な電話番号（SMSを見てフィッシングに引っかかってくれる）を取得するのが狙いなのかもしれない。</description></item><item><title>Linuxのログファイル早見表</title><link>https://www.cyamax.com/entry/2018/07/29/005217/</link><pubDate>Sun, 29 Jul 2018 00:52:17 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/07/29/005217/</guid><description>
目的 ログファイルの意味を理解する。 インシデント発生時の参考用に作成。
環境 $ cat /etc/os-release PRETTY_NAME="Ubuntu 14.04.2 LTS" ログの一覧 /var/log/# tree . ├── alternatives.log ├── apt │ ├── history.log │ └── term.log ├── auth.log ├── boot.log ├── bootstrap.log ├── btmp ├── dmesg ├── dmesg.0 ├── dmesg.1.gz ├── dmesg.2.gz ├── dmesg.3.gz ├── dmesg.4.gz ├── dpkg.log ├── faillog ├── fontconfig.log ├── fsck │ ├── checkfs │ └── checkroot ├── kern.log ├── lastlog ├── monit.log ├── syslog ├── udev ├── ufw.log ├── upstart └── wtmp ファイルごとの意味 ファイル名 説明 alternatives.log alternativesシステムのログ apt apt関連 ── history.log aptコマンドの操作履歴 ── term.log aptコマンドの出力履歴 auth.log 認証関連のログ。sudo系のログも残る boot.log システムブート時のコンソールに流れるメッセージ bootstrap.log Ubuntuのシステムを構築するシステムのログ btmp ログイン失敗ログ（バイナリ）。存在しないアカウントでのログインやパスワードの入力ミスなど失敗にした際の情報が記録される。中身を確認する場合はlastbコマンドを使用 dmesg
dmesg.0
dmesg.1.gz
dmesg.2.gz
dmesg.3.gz
dmesg.4.gz システム起動時などのカーネルログ dpkg.log パッケージ管理関連のログ faillog ログインの失敗ログ(バイナリ)。btmpが不正なログインすべてを記録するのに対し、fiallogはユーザごとにログイン失敗回数を記録する。中身を確認する場合はfaillogコマンドを使用 fontconfig.log ?? fsck ファイルシステムの不整合をチェック＆修正するツール ── checkfs ?? ── checkroot ?? kern.log カーネルのログ lastlog ユーザごとの最後のログイン情報(バイナリ)。中身を確認する場合はlastlogコマンドを使用 monit.log Monit(プロセスやログの監視をしてくれる軽量ないツール)のログ syslog システムの汎用のログ udev デバイス周りのログ ufw.log ファイヤーウォールのログ upstart 自動起動系 wtmp 最近ログインしたアカウント情報（バイナリ）。中身を確認する場合はlastコマンドを使用 その他 今回はOSがUbuntuなのでCentOS版も作成したい。
OSバージョンも古いので最新版も適宜追加したい。
??は情報のソースが無かった。誰か教えてほしい。
参考 必読！ログファイルとディレクトリ | Think IT（シンクイット）</description></item><item><title>BacklogからSlackへの更新通知を超簡単に実現する</title><link>https://www.cyamax.com/entry/2018/06/27/235909/</link><pubDate>Wed, 27 Jun 2018 23:59:09 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/06/27/235909/</guid><description>
はじめに タイトル通りBacklogの更新を超簡単にSlackに通知する方法です。
「Backlog Slack」で検索すると、サーバー使ったりIFTTTやlambdaやzapierなどの記事が出てきますが、 サーバー使うほどでもないし、lambdaで作るのもだるいし、IFTTTやzapierとかに大事な情報を垂れ流すリスクもあるので、一番シンプルな方法を考えました。
多分全部で５分ぐらいでできるんじゃないかな。
実際のキャプチャ スマホでみるとこんな感じ。
手順 手順は簡単３ステップ。
1. Backlogのビューアーアカウントを作成してプロジェクトに追加 BacklogにSlack側からBacklogの情報を見るためのビューアーアカウントを作成します。
Baclogの権限にはビューアー以外にゲストビューアーもありますが、 ゲストビューアーではチケットの詳細な変更内容が見れないため、それでも良ければそちらを選択してください。
https://backlog.com/ja/getting-started/others/others5.html
2. BacklogのRSSのURLをコピー 更新情報を取りたいプロジェクトを開き、URLをコピーします。
3. Slackにfeedを登録 SlackにはデフォルトでRSSを読む機能があるので、それを有効活用します。
更新情報を流したいチャンネルで
/feed subscribe コピーしたURLを入力します。
ただし、これだとBacklogのアカウント情報がないので、URL内にログイン情報を入力します。
/feed subscribe https://ビューアーアカウント:パスワード@自分のスペース名.backlog.com/rss/プロジェクト名
入力例：
/feed subscribe https://hoge:password@pepepe.backlog.com/rss/test ちなみにfeedのリスト確認は/feed list。
削除は /feed remove [IDナンバー]でできます。
参考 注意 feedのところにユーザ名とパスワードがそのまま書かれているので、
Slackで/feed listを打つと他人もアカウントの情報が見えてしまいます。
なので、この設定をするときは鍵付きのチャンネルにするか、信頼できる人だけのメンバーで同意を取ってやりましょう。</description></item><item><title>自分のIPアドレスがブラックリストに載ったらメールを送る</title><link>https://www.cyamax.com/entry/2018/06/26/224606/</link><pubDate>Tue, 26 Jun 2018 22:46:06 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/06/26/224606/</guid><description>
![](/images/20180626224322.jpg)spamhaus 経緯自身のグローバルIPがSPAMHAUSのブラックリストに載ってメールが送れなくなった。 今後すぐに気づけるようにcronを作成。
コード [https://gist.github.com/aa6d9b7937415a29332f393aaa4362d6:embed#指定したipがブラックリスト(SPAMHAUS)に載ったらメールを送る]
指定したipがブラックリスト(SPAMHAUS)に載ったらメールを送る
環境 Linux系サーバを想定 。 mailコマンドでメールが送れること。
クーロン設定（定期実行） 以下コマンドで編集。
crontab -e # 30分ごとに確認 */30 * * * * /home/hoge/blacklist_ip_check.sh 注意 IPアドレスがブラックリストに載ったとき、それがcronを動かしているサーバ自体だとメールが迷惑メール扱いになって届かないかもしれない。 なのでサーバを分けるか、受信サーバ側で強制的に受け取る設定にする必要がある。</description></item><item><title>Backlogで大きくなりがちな画像を自動で小さくする</title><link>https://www.cyamax.com/entry/2018/06/25/231901/</link><pubDate>Mon, 25 Jun 2018 23:19:01 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/06/25/231901/</guid><description>
概要Backlogのwikiに貼った画像が、横幅いっぱいに表示されてとても見にくいので、 自動で画像を縮小してくれる仕組みを作りました。
やり方1. ChromeにScriptAutoRunnerをインストール 任意のドメインで任意のJavascriptを実行できる。 本当に重宝する。便利。
2. ScriptをScriptAutoRunnerにペースト [https://gist.github.com/0d4467755d11ada196a4097c1f8dab89:embed#Backlogのwikiの画像はでかすぎるから良い感じにする]
Backlogのwikiの画像はでかすぎるから良い感じにする
ドメインの設定も忘れずに。
設定するとこんな感じになります。
これで設定完了です。
あとはBacklogで大きい画像が表示されると、自動でリサイズされます。
その他一番良いのはBacklogのサービス側でwidthを整えてくれることですね。
あと、この方法は自分の表示が見やすくなっても、他の人は見にくいままなので、無闇に大きい画像を貼るのはやっぱりやめたほうが良い。</description></item><item><title>Backlogのチケット登録時に自動でテンプレートを入れる</title><link>https://www.cyamax.com/entry/2018/06/24/070000/</link><pubDate>Sun, 24 Jun 2018 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/06/24/070000/</guid><description>
仕様 Backlogのカテゴリーを選択時に、予め設定したテンプレートを挿入する。
動作 動きを見たらどんなものかわかるはず。 ここが便利 チームで同じテンプレートが使え、自動で更新される
テンプレートはURLで読み込んで都度表示させるので、 BacklogのGitで管理して、テンプレートを更新（プッシュ）すれば、自動で全員更新される。
導入方法 1. Chromeの拡張機能（ScriptAutoRunner）をインストール 特定のページで設定したJavascriptを実行してくれる拡張機能。 とっても重宝しています。
2. BacklogのGitにテンプレートをpush ## テスト 実際にインサートされる文章 ### その他 Gitに保存されたテンプレートの例 もしもGitがわからなければ、直接テンプレートをコードに書いてもOK
3. ScriptAutoRunnerに登録 ScriptAutoRunnerにコードを記入します
このとき、どのURLで発火するかURLをAutoScriptRunnerに記入する。 上の図ではpepope.backlog.comの部分。
コード [https://gist.github.com/60ff5872b0820e744ac79ecfced3c0f6:embed#backlogのチケット作成時にカテゴリを選択すると自動でテンプレートが入る] 4. JavaScriptを環境に合わせて変更 サンプルではプロジェクトの追加時のパスを記載しています。
var projectName="TEST" // backlogのプロジェクト名を記入。大文字注意。 // テンプレートをbacklogのリポジトリにmarkdown形式で保存。 var template = [ ["カテゴリ１", "https://pepope.backlog.com/git/TEST/repo/raw/master/template1.md"], ["自分で設定しているカテゴリ名を記載", "https://pepope.backlog.com/git/TEST/repo/raw/master/template2.md"] ]; その他 スクリプトを作るよりも、ブログの記事にするほうが時間がかかる。 Backlogはとっても便利だけど、不便なところもあって、そこはアイディアで解決できる。
その他backlog関連で作ったもの</description></item><item><title>Docker上でgdbを動かす</title><link>https://www.cyamax.com/entry/2018/02/09/070000/</link><pubDate>Fri, 09 Feb 2018 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/02/09/070000/</guid><description>
Docker上のcentosでgdbを動かそうとしたら、以下のようなエラーが出たので対応策のメモを書きます。
エラー内容 warning: Error disabling address space randomization: Operation not permitted Cannot create process: Operation not permitted During startup program exited with code 127. 原因 Dockerのコンテナ上で動くプロセスはそのままではptraceが使えないらしいです。
ptraceシステムコールは実行中の他のプロセスの動作をみたり、メモリーを書き換えたりできます。
straceやgdbはptraceシステムコールを使ってデバッグ機能を実装しているみたいです。
対応 コマンド 以下コマンドでdockerを起動します。
docker run -i -t --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" [CONTAINER_NAME] /bin/bash —cap-add=SYS_PTRACE と —security-opt="seccomp=unconfined”を追加しています。
注意 セキュリティレベルが低下するので、外部に公開された環境などで実施する際は注意しましょう。
その他 これでやっとCTF用の環境ができた。
参考 https://qiita.com/koemu/items/547e6e8d0043b815279e https://stackoverflow.com/questions/35860527/warning-error-disabling-address-space-randomization-operation-not-permitted/35860616 http://itchyny.hatenablog.com/entry/2017/07/31/090000</description></item><item><title>ブラウザに保存されたパスワードを簡単に表示する</title><link>https://www.cyamax.com/entry/2018/01/16/231010/</link><pubDate>Tue, 16 Jan 2018 23:10:10 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/01/16/231010/</guid><description>
サイトにログインするときに、いつもブラウザがで自動で入力してくれていたので、
いざというときにパスワードがわからないということがよくありました。
「ブラウザには保存されているんだけどパスワードが●になって見えない。。。試しにコピーしても●になってしまう」ということを経験したことがある人は少なくないのではないでしょうか。
●のパスワードを表示させる 環境 Chrome
やり方 1. デベロッパモードを開く Windowsの場合：ctrl+shift+I
Macの場合:cmd+opt+I
2. 選択モードにして●を選択 パスワードが入力されているフォームを選択
3. htmlからtype=&ldquo;password"を探しtype=&ldquo;text"に変更 typeをpasswordを探す typeをtextに変更 入力フォームのパスワードが見えるようになっている 感想 思いついて実際にやってみたらできた。
まさかこんなに簡単に見れるとは。
パソコンを人に貸したりしたときに 同じ方法でパスワードを超簡単に覗き見たりできてしまうので注意が必要ですね。
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践 Amazonで購入</description></item><item><title>Reveal.jsのテーマ一覧</title><link>https://www.cyamax.com/entry/2018/01/12/002044/</link><pubDate>Fri, 12 Jan 2018 00:20:44 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/01/12/002044/</guid><description>
Reveal.jsReveal.jsとは HTMLでスライドを作成できるJavascriptです。
設定方法 HTML内でCSSを指定すればOK
&lt;link rel="stylesheet" href="css/theme/white.css"> カラーテーマ一覧（プリインストール設定） 初めから用意されているCSSの一覧。
CSSによってフォントやデザインの印象が大きく変わります。 好みのものがない場合は、自分で作成もできます。
自分で作成する場合は↓
[https://github.com/hakimel/reveal.js/blob/master/css/theme/README.md]
Black(default) white league Sky Beige Simple Serif Blood Night Moon Solarized サイトで確認 サイトでも直接確認できます。
その他 Reveal.jsをこれに使っています。</description></item><item><title>「ameba/UGG」を装った迷惑メールを調査してみた</title><link>https://www.cyamax.com/entry/2018/01/03/001131/</link><pubDate>Wed, 03 Jan 2018 00:11:31 +0900</pubDate><guid>https://www.cyamax.com/entry/2018/01/03/001131/</guid><description>
正月に暇をしていたら迷惑メールが届いた。
時間があったので前回と同じく調査してみた。
今回届いたメール AmebaからUGGの広告メールという謎の組合せ。 Amebaドメインの信頼を利用してリンクをクリックさせる手口だろうが、逆効果だと思う。
毎回だけど「貴族の品質」が気になる。
メールヘッダ X-Mailer:⁨Foxmail 6, 13, 102, 15 [cn] Date: Tue, 2 Jan 2018 14:00:28 +0800 Raybanのなりすまし時と同じメーラ（「Foxmail」という中国産のソフト）が使われていた。 タイムゾーンも+0800なので、 今回も中国人の可能性がでてきました。
偽サイト アクセスする前に bit.lyの短縮URLにアクセスする前に、URLに「+」を追加してアクセス情報をみてみる。
私が調査したのがメールが送られてから４時間後であり、
その時点でこのURLにアクセスしたのが1400人弱ということがわかります。
サイトにアクセス アクセスすると、UGGのようなサイトが表示されました。
いくつかページを確認してみましたが、
Raybanのときのような日本語の違和感は感じませんでした。
注文を試みる 試しに注文の機能が使えるのか少し確認してみます。
注文する前にアカウントの登録が必要のようでしたので、
アカウントを登録してみました。
アカウント登録後、名前と住所・クレジットカード情報を入れて購入できるようだったので、 試しに適当なクレジットカードの番号（クレジットカードの広告に使われる無効な番号）を入力したところ、使えないクレジットカードということで登録できませんでした。
また、住所も適当な文字を入力しても文字数制限でNG。
予想と反して意外としっかりとした作りになっています。
マイページで購入履歴を確認できる機能があり、カードが無効だったので「declined（利用停止カード）」になっていました。
もう少し深く見てみる ページのhtmlコードを眺めていたら以下のような記述を見つけました。
display:noneでページ上には表示させていませんが、謎のリンクと画像ファイルの記述がありました。
网站流量统计系统 https://www.51.la 上記URLと中国語を調べたら、サイトへのアクセスを調べる中国のサービスでした。
このサービス自体は特に問題ないと思いますが、 偽サイト関係者が中国語を使う可能性が高まりました。
phpinfo 見えてしまった。
ここは偽Raybanのサイトも同じでした。 これ以上はやめておきます。
本当に危ないサイトなのか 見分けるポイント ①メールが怪しい amebaからUGGのセール情報が送られてくる時点で「？」となりました。 ※普通はUGGのセール情報はUGGドメインから直接送られてくるかと思います
また、偽サイトの日本語は違和感がありませんが、肝心のメールの日本語が変でした。
②SSLではない アカウント作成やクレジットカード情報入力時など常にhttpでした(httpsでない)。 この手のサイトはしばらくするとブラックリストにドメインが登録されてしまうため、ドメインやIPがコロコロ変わるためドメイン登録が難しいのだと思います（手間や費用やリスク？）。
③診断サイトを使う サイトのURLを入力すると、危険なサイトか診断してくれるサイト。
これが一番手っ取り早いと思います。
今回のサイトを診断したら、「フィッシングサイト」の結果になりました。
最後 上記にも書きましたが、今回のUGGの偽サイトはRaybanの偽サイトよりも日本語の完成度が高く、ぱっと見で偽サイトかわからなくなっていた。
アカウント情報やクレジットカード情報の取得を目的としたサイトだと思いますが、注文機能はしっかりしているので、注文するともしかしたら商品がちゃんと届くかもしれないです。
Rayban偽サイトと手法やメールの文章、メールヘッダ、サイト構成が似ているため同じグループ・もしくは何かしらの関係がある者の犯行の可能性が高いと推察しました。
ハッカーの学校 Amazonで購入 ハッカーの学校 ハッキング実験室 Amazonで購入</description></item><item><title>【Javascript】サイトのファビコンURLを取得する</title><link>https://www.cyamax.com/entry/2017/12/03/070000/</link><pubDate>Sun, 03 Dec 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/12/03/070000/</guid><description>
概要ファビコン(favicon）とは やり方想定環境 javascript favicon画像のurlは&lt;HEAD>配下に&lt;link rel="shortcut icon" href="アイコンのURI" >として書かれている 以下コードを取得したいサイトで実行するとファビコンを取得できる コード //ファビコンURL取得 function favi() { //favicon画像のurlはhtml内のhead->linkタグの属性relがshortcut iconのhref値に記載されている for (var i = 0;i &lt; document.head.getElementsByTagName('link').length ;i++){ if (document.head.getElementsByTagName('link')[i].getAttribute('rel') === "shortcut icon"){ var favicon_url = document.head.getElementsByTagName('link')[i].getAttribute('href'); break; } else { var favicon_url = ''; console.log("取得NG"); } }; console.log(favicon_url); }; その他URLが相対パスの場合は少し工夫する必要あり。
chrome extensionなどjavascriptを後から挿入する場合に使える。
chrome apiでもっと簡単に取れる方法があるなら教えて欲しい。</description></item><item><title>ログインシェルで遊ぶ</title><link>https://www.cyamax.com/entry/2017/11/17/070000/</link><pubDate>Fri, 17 Nov 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/11/17/070000/</guid><description>
FTPの設定をしたときに、
/usr/sbin/nologinについて調べたら色々面白かったので簡単に実験してみた。
/usr/sbin/nologinは/etc/nologin.txtを読み込むらしい。読み込んで表示した後はexitされる。
しかし/etc/nologin.txtなどというファイルは存在しなかった。
なので試しに、自分でファイルを作成してみた。
そしてログインしてみる。
期待した通りのことができた。
これでサーバに不正にログインしようとした人を「ドキッ！」とさせることができる。
ログインシェルを別のコマンドに変えるログインシェルは/etc/passwdに書かれたものが実行される特性を利用して、
別のコマンドを起動してみた。
ログインシェルを /usr/bin/wに変更(ログインユーザをみるコマンド)。
/usr/bin/wが実行され、ログインユーザが表示された。
ログインシェルを空白にする本来は記載されているログインシェルを空白にしてみた。
するとshが起動した。これは意外。
なのでログインシェルを起動させたくない場合は、/usr/sbin/nologinか/usr/bin/falseをちゃんと明記した方が良いということがわかった。
感想ログインシェル面白い。
自分でコンパイルした実行ファイルなどを指定したらもっと面白いことができそう。</description></item><item><title>ksnctf #35 Simple Auth II</title><link>https://www.cyamax.com/entry/2017/09/17/181253/</link><pubDate>Sun, 17 Sep 2017 18:12:53 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/09/17/181253/</guid><description>
問題 解き方ソースコードが見れるので確認する。
PHPのソースコードはよくわからないが、以下のような記載があった。
$db = new PDO('sqlite:database.db'); DBの場所が記載されているので、URLから直接ダウンロードしてみる。
ttp://ctfq.sweetduet.info:10080/~q35/database.db
DBの中身を確認 SQLiteのDBのようなので接続してみる。
# Macの場合 ~ ❯❯❯ sqlite3 Downloads/database.db ⏎ SQLite version 3.16.0 2016-11-04 19:09:39 Enter ".help" for usage hints. sqlite> .tables user user2 sqlite> select * from user; root|FLAG_*****************←ここにFLAG sqlite> select * from user2; root|GLDmNFJimveAAxyg_wSNp sqlite> その他SQLインジェクションの問題だと思ったら違った。
参考 セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方- Amazonで購入 セキュリティコンテストのためのCTF問題集 Amazonで購入 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版［固定版］　脆弱性が生まれる原理と対策の実践 Amazonで購入</description></item><item><title>闇のゲームを攻略した</title><link>https://www.cyamax.com/entry/2017/09/11/070000/</link><pubDate>Mon, 11 Sep 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/09/11/070000/</guid><description>
序章帰宅すると嫁がテレビに向かって無表情でリモコンの"決定"ボタンを連打してた。
何事かと思ったら、期間限定でABC朝日放送※のデータ放送(dボタン)を見ると、ABCeeiSLOTとというミニゲームができるようだった。
※関西のテレビ局
ミニゲームでコインを1000枚集めるとQUOカード一年分ゲットに応募できるチャンスがもらえるらしい。
嫁はスロットが当たるたびに、「やった」と小さくつぶやくと、また無表情でボタンを連打した。
嫁はテレビ番組を見ていなかった。 テレビ局の狙いはゲームをやりながら番組を見てもらい、視聴率やファンを増やすことだったと思うが、私や嫁はもともとABC朝日放送は好きなのでミニゲームがなくても見ている。今の嫁は番組を見ていないのでマイナス効果である。
妻は長時間ボタンを連打したため少し疲れていた。
私は妻の精神的な負担と、全国のリモコンの決定ボタンの塗装が心配になった。
おそらく他のご家庭でも同じ問題が発生しているだろう。
1000コインという頑張れば到達できそうな数字は実は最低でも3時間以上は連打しないといけないゲームだなんて…
これは闇のゲームだ…。
私はエンジニアの端くれとして、この闇のゲームを攻略し、関西の家庭の平和を守るべく立ち上がった。
技術章リモコンから出ている赤外線を別の装置から連続して送信し続ける装置
=全自動「決定ボタン」連打機を作ることにした。
キャプチャ編 テレビの｢決定ボタン｣の赤外線信号がどんなものを送っているかわからないため、赤外線受光器を使ってキャプチャし、その信号を送信に使う。
赤外線受光器はこんなこともあろうかと半年前に秋月で20円で購入したものを使った。
電気回路の制御にはArduinoを使った。
Arduinoをはじめよう 第4版 (Make: PROJECTS) Amazonで購入 これも5年前に自由研究用に買ったもの。 いまだにたまに使うので重宝する。
赤外線の受信方法は以下サイトを参考にした。
しかし以下のようなコンパイルエラーが出る。
receve:49: error: 'class decode_results' has no member named 'panasonicAddress' Serial.print(results->panasonicAddress,HEX); ^ exit status 1 'class decode_results' has no member named 'panasonicAddress' panasonicAddress関数が見つからないと怒られるので、 以下のように書き換えてその場を凌ぐ。
//IRremoteライブラリのサンプルプログラム //// ~~~~ 47行目から else if (results->decode_type == PANASONIC) { Serial.print("Decoded PANASONIC - Address: "); //Serial.print(results->panasonicAddress,HEX); ←エラーがでるのでコメントアウト Serial.print(HEX); //←受信結果を16進数でとりあえず表示 Serial.print(" Value: "); ////~~~~ 送信編 赤外線は赤外線用LEDから送る。 電気回路の制御もArduinoを使う。
詰まったところ ###①回路がわからない 送信サンプルコードを見ると、Arduinoのどのピンから電流を流すのか指定していなかった。
上部で指定しているライブラリ（IRremote.h）の中に記載されていると思い、 ライブラリコードの中を３０分は迷走したがよくわからない。
こんな簡単なこともできないのかと自分に絶望していると、サンプルコードに
* An IR LED must be connected to Arduino PWM pin 3.
と書いてあった。あほすぎる。。。
②IRsend関数がわからない Arduinoには赤外線用のライブラリ(IRremote.h)があり、それを使うと簡単に送信できるようだが、
中で定義されてる関数の意味がわからずエラー連発だった。
最終的には Sonyのリモコンでの電源オフ信号を送信するサンプルを参考にPanasonic用の関数(irsend.sendPanasonic)を見つける
Panasonic用の関数が含まれるサンプルコードを漁る。
サンプルコードからPanasonic共通のPanasonicAddress値を見つける。
上記値とサンプリングした受信信号(HEX)を関数に入れる。 これでようやく動いた。
完成品 コード #include &lt;IRremote.h> IRsend irsend; void setup() { } void loop() { irsend.sendPanasonic(0x4004, 0x1009293); //決定ボタン delay(2000); } 今回はわざわざ赤外線を物理的にキャプチャしたけれども、
ボタンの情報はここに載っていた。
http://mementomorisince2013.blogspot.jp/2013/06/arduinoledpanasonic.html
回路 やっていることはLチカとかわらない。
回路はすごくシンプル。
終章仕事から帰って作業に取りかかり3時間かけて完成した。 時計は深夜の1時を回っていた。
装置を使う直前は２９３コインであり、３時間ほど妻が連打した成果がそこにあった。
1000コインまでどんだけ道のりは長いんだ、、、。
もしかしたらこの装置を使っても時間内に1000コイン貯まらないかもしれない。
そう思いながら完成した回路をテレビの前にセットし、私は疲れて寝てしまった。 そして次の日テレビを見ると… やりすぎた。
余談どんだけポイントをゲットしても応募できるチャンスは各賞一人一回まででだった。
しかしこれで関西の家庭からボタンの連打音をなくし、笑顔と会話を取り戻せたのならよしとする。</description></item><item><title>ksnctf #12 Hypertext Preprocessor</title><link>https://www.cyamax.com/entry/2017/09/05/070000/</link><pubDate>Tue, 05 Sep 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/09/05/070000/</guid><description>
問題 ページを開いただけではよくわからない。
解き方とりあえずグーグル先生に出てきた数字を聞いてみる。
すると徳丸先生の脆弱性情報が出てきた。
なるほど。数字の先頭の2012:1823はCVE（脆弱性番号）で、 phpの脆弱性らしい。
試しに、URLのクエリ文字列に「?-s」をつけるとソースコードが出てきた。 [http://ctfq.sweetduet.info:10080/~q12/?-s]
ソースコードを見ると丁寧に「// Flag is in this directory.」と書かれているので、 次はOSインジェクションを試してみる。
「-d」をつけると任意のPHPコードが実行できるようなので、 参考サイトみながらちょろっとコードを書いて実行してみたらフラグをゲットできた。
# bash echo "&lt;?php system('ls -al'); exit(); ?>" | POST "http://ctfq.sweetduet.info:10080/~q12/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" その他初めはBurpを使ってクエリを書き換えていたが、bashから実行する方法がネットに載っていたので最終的にbashで答えを見つけた。
burpの使い方は慣れていないので練習が必要。
PHPの知識がなくても簡単にOSインジェクションができてしまったが、 PHPの勉強もしたい。
参考https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html
https://blog.tokumaru.org/2013/11/apache-magica-attack.html
[https://pentesterlab.com/exercises/cve-2012-1823/course]
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版［リフロー版］　脆弱性が生まれる原理と対策の実践 Amazonで購入</description></item><item><title>ksnctf #17 Math II</title><link>https://www.cyamax.com/entry/2017/09/03/004419/</link><pubDate>Sun, 03 Sep 2017 00:44:19 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/09/03/004419/</guid><description>
問題 xを満たすyがFLAGらしい。
解き方問題を見たときはモジュロ演算なんて言葉は知らなかったけど、取りあえず累乗根を単純に計算するだけだと思った。
ささっと計算してみたらオーバーフローしてうまく動かない。
多分これは私の書き方とかそもそも論で何か間違っているのだろう。
y = pow (x,(1.00/101.00)) OverflowError: long int too large to convert to float どうすればいいのか調べていたら二分探索で解を得るのがベターらしい。
二分探索をやってみる 二分探索はここを参考にした。
二分探索と聞いたときは「基本情報でなんか見たかも」ぐらいな感じで、使ったことは一回もなかった。
# python3 import math x = ここに問題文の値を入れる y_min = 0 y_max = 10 ** 300 #ここは適当 y_jou = 101 for num in range(0,2000): # 2000も適当 mid = ( y_min + y_max ) // 2 dy = pow (mid , y_jou) if dy == x: print (mid) break elif dy > x: y_max = mid print ("大きすぎ") elif dy &lt; x: y_min = mid print ("小さすぎ") keta = int(math.log10(mid)+1) print (str(num) + ": " + str(keta) + "桁") なんとなくやっていることを理解して、雰囲気で実装してみたけど一応答えはでた。
その他問題に書かれていたモジュロ演算はRSA暗号で使われているらしい。
※RSA暗号は公開鍵暗号の一つ
参考http://www.mew.org/~kazu/doc/rsa.html
http://www.maitou.gr.jp/rsa/rsa09.php
http://herb.h.kobe-u.ac.jp/RSA.html
Pythonスタートブック Amazonで購入</description></item><item><title>ksnctf #3 Crawling Chaos</title><link>https://www.cyamax.com/entry/2017/08/21/070000/</link><pubDate>Mon, 21 Aug 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/08/21/070000/</guid><description>
前回に引き続きCTFの問題を解いていきます。
問題 100pt
適当に入力すると以下のようにでます。
解き方ソースコードを見てみる。
Chromeのデベロッパーモードでソースコードを見てみると、headのscript内に謎のコードを発見。
console.logを見てもエラーが発生していないので、正しく認識されている。
これを解析する必要がある。
node.jsで開いてみる。 デベロッパーツールのままでは調査しづらいので、 「(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃーｰ」のスクリプトを別ファイルに切り出してnode unya.jsとして実行してみた。
すると
undefined:2 $(function(){$("form").submit(function(){var t=$('input[type="text"]').val();var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);var f=false;if(p.length==t.length){f=true;for(var i=0;i&lt;p.length;i++)if(t.charCodeAt(i)*(i+1)!=p[i])f=false;if(f)alert("(」・ω・)」うー!(/・ω・)/にゃー!");}if(!f)alert("No");return false;});}); ^ ReferenceError: $ is not defined at eval (eval at &lt;anonymous> (/Users/takanori/Desktop/jquerry/u.js:1:17299), &lt;anonymous>:2:1) at Object.&lt;anonymous> (/Users/takanori/Desktop/jquerry/u.js:1:17333) at Module._compile (module.js:569:30) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:503:32) at tryModuleLoad (module.js:466:12) at Function.Module._load (module.js:458:3) at Function.Module.runMain (module.js:605:10) at startup (bootstrap_node.js:158:16) at bootstrap_node.js:575:3 と表示された。
$ is not definedについてはJQueryを読み込んでいないのでエラーが出たが、 それ以外の部分はソースがデコードされた内容で表示された。
ソースを解析する 上記でデコードされた内容を見やすく改行すると以下のようになった。
$(function () { $("form").submit(function () { var t = $('input[type="text"]').val(); var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449); var f = false; if (p.length == t.length) { f = true; for (var i = 0; i &lt; p.length; i++) if (t.charCodeAt(i) * (i + 1) != p[i]) f = false; if (f) alert("(」・ω・)」うー!(/・ω・)/にゃー!"); } if (!f) alert("No"); return false; }); }); そして一番大事なのは
if (t.charCodeAt(i) * (i + 1) != p[i]) f = false;の部分。
入力された文字(t)の左からi番目の文字をUTF-16の整数に変換(charCodeAt)して、
その変換した数字に*(i + 1)した値がp[i]と一致しなかった場合にfalseを返すというコードになっていました。
正しい値（FLAG）をフォーム(t)に入れれば
if (f) alert("(」・ω・)」うー!(/・ω・)/にゃー!");が実行されます。
つまりtの値を求めれば、それすなわちFLAGになるので、
pの値からtを求めます。
t.charCodeAt(i) * (i + 1) != p[i]より
t[i] = String.fromCharCode( p[i] / ( i +1 ) )で求めることができそうです。
※String.fromCharCodeはcharCodeAtの逆。UTF-16の整数から文字を求める
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
実装 問題のソースを参考に以下のようにJavascriptを書きました。
// javascript flag.js var flag = ""; var o = ''; var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449); for (var i = 0; i &lt; p.length; i++) { //pの値から本来入力するべき値を逆算する var o = p[i] / (i + 1); //Strings.fromCode(o)でoの数値をUnicodeの文字に戻す var flag = flag + String.fromCharCode(o); }; console.log(flag); これをnode flag.jsで実行するとFLAGがゲットできます。
その他記号だけでJavascriptが動く理由。
http://perl-users.jp/articles/advent-calendar/2010/sym/3
エンコードの説明。
http://d.hatena.ne.jp/kusano_k/touch/20120421/1335006525</description></item><item><title>アセンブラ・アセンブリ・アセンブルの違い</title><link>https://www.cyamax.com/entry/2017/08/14/070000/</link><pubDate>Mon, 14 Aug 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/08/14/070000/</guid><description>
コンピュータの世界における アセンブラ・アセンブリ・アセンブルがややこしいのでまとめました。
まとめ 荒っぽくまとめると以下の通り。
アセンブラ・・・変換するソフト
アセンブリ・・・言語
アセンブル・・・バイナリに変換すること
アセンブラ（assembler） アセンブリ言語で書いたプログラムを
機械語に変換するプログラム（ソフト）のこと。
英語ではassemblerなので、
assemble（変換）+er（者）で変換をしてくれる者のこと。
アセンブリ（assembly） 機械語と一対一の関係にある低水準言語のこと。
アセンブリ言語（アセンブラ言語）と呼ばれる。 ※反対に、高水準言語でC言語やPythonなどがある
言語自体は MOV AX , FF などと書かれている。
このままでは実行できない。
アセンブル（assemble） アセンブリをバイナリファイルに変換（コンパイルとも言う）すること。
アセンブリ言語MOV AX , FF ー変換(アセンブル)→ B8FF00バイナリ
となる。
※引用
http://wisdom.sakura.ne.jp/programming/asm/assembly1.html
参考 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1492996679
http://wisdom.sakura.ne.jp/programming/asm/assembly1.html
セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方- Amazonで購入 セキュリティコンテストのためのCTF問題集 Amazonで購入</description></item><item><title>stringsでなぜprintfが見えるのか</title><link>https://www.cyamax.com/entry/2017/08/12/070000/</link><pubDate>Sat, 12 Aug 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/08/12/070000/</guid><description>
Linuxへの理解を深めるため、最近CTFの問題を解いています。
CTFの回答を見ていると実行ファイル（バイナリ）に対してstringsコマンドを実行して、その中にpritnfがあるから書式文字列攻撃を試して・・・と書いてありました。
全く意味がわからなかったので、調べたことのメモになります。
そもそもstringsとは Linuxのコマンド 。 指定したファイル中の表示可能な文字列を表示します。 バイナリファイルやデータファイルの内容を判断するために利用します。
strings実行例 実行するとHello world!と表示されるファイルを用意します。
$ ./main Hello world! この実行ファイルをstirngsで見てみます。
※stringsはデフォルトではファイルの先頭しか見ないので、オプションの-をつけることでファイル全体から文字を検索します。
$ strings - main __PAGEZERO __TEXT __text __TEXT __stubs __TEXT __stub_helper __TEXT __cstring __TEXT __unwind_info __TEXT __DATA __nl_symbol_ptr __DATA __la_symbol_ptr __DATA __LINKEDIT /usr/lib/dyld /usr/lib/libSystem.B.dylib Hello world! @dyld_stub_binder @_printf _mh_execute_header !main __mh_execute_header _main _printf dyld_stub_binder stringsは実行ファイル中に存在する文字だけを抽出してくれるのがメリットです。
※lessやcatで実行ファイルを見てもノイズが多くて見にくい
実行ファイル（バイナリ）って変数名とか見れないんじゃないの？ 私の認識では高級言語のソースコードをコンパイルしたら変数名や関数は機械語に変換されるため、stringsコマンドでバイナリを見てももちろんソースコードは出てこないし、関数名・変数も機械の都合の良い名前に変換されていると思っていました。
なので例えばint hoge=1111なんてコードを書いても、コンパイル後はintはアセンブリ言語のMOVかなにかに変換されて、変数名hogeも別の何かに変換されて跡形もなくなると思っていました。
なのでstringsコマンドで実行ファイルを覗いても、ソースコードの関数は見えないはず(=printfは出てこない)では？と思い混乱しました。
実際にコンパイルしてみた やってみないとわからないので、
試しに以下のコードを書いてコンパイルしてみました。
C言語でテスト
/* test.c */ #include &lt;stdio.h> int test(){ int hensu = 1111; printf("変数の中身は%dです\n",hensu); return 0; } int main(){ printf("Hello world!\n"); test(); return 0; } 上記コードを保存(test.cなど)して以下コマンドでオブジェクトファイルの作成をします。
gcc -o test.c
するとtest.oが生成されるので、今回はこれをstringsで覗きます。
strings結果 MacBook-Pro:Desktop takanori$ strings - test2.o __text __TEXT __cstring __TEXT __compact_unwind__LD __eh_frame __TEXT Hello world! _test _main _printf たしかにprintfが拾えてる！
まとめ 上記の検証から 変数名hensuはコンパイル後stringsで見えない。
関数名main,test,printfは見えることがわかった。
どうやら変数名(hensu)や既存の関数（intなど）はコンパイルされると跡形もなくなりますが、自分で作った関数main,testや外部の関数printfはそのまま変換されずに残るようです。
ただし残るといっても関数名が残っているだけで、関数内部の処理はコンパイル済みであり、あくまでも関数の名前の部分だけがそのまま残るみたいです。
ここまで調べるのに結構時間がかかりましたが、最後まとめているときに逆コンパイルについてまとめているサイトを見つけました。これを初めから見ていえればこんなに時間がかからなかったのに・・・ とはいえ、今までわかっていなかったコンパイルの流れや実行ファイルの仕組みを理解できたのは非常に有益でした。
特にコンパイルには広義・狭義の意味があったり、アセンブラ・アセンブリ・アセンブルの違いなども調べていくうちに理解できたので、興味がある人は調べてみてはいかがでしょうか。
参考書籍 セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方- Amazonで購入 セキュリティコンテストのためのCTF問題集 Amazonで購入 参考サイト http://aoking.hatenablog.jp/entry/20121109/1352457273
http://www5d.biglobe.ne.jp/~noocyte/Programming/Decompile.html#CDecompilerPossiblity</description></item><item><title>ksnctf #2 Easy Cipher</title><link>https://www.cyamax.com/entry/2017/08/04/070000/</link><pubDate>Fri, 04 Aug 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/08/04/070000/</guid><description>
スキルアップのためにCTF（キャッチ・ザ・フラグ）にチャレンジしてみました。
問題 50pt
EBG K VVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.
ただ意味のわからないアルファベットが並んでいますが、
これを各々推測して中に含まれているフラグ（FLAG_******）をゲットするのが問題の意図です。
CTFの問題はバイナリ解析やプログラムの脆弱性を突くものなどもあり、様々なスキルが求められます。
解き方仮説を立てる Easy Cipher = 「簡単な暗号」
問題文を見ると文字の区切り方が英文に似ています。
アルファベットを別文字に入れ替えたような暗号と仮定して一旦解いてみます。
vf → is ?
n → a ?
SYNT → FLAG ?
上記の仮定でそれぞれ文字を置換してみます。
実装 置換はjavascriptで実装してみます。
// easy_cipher.js var i = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."; // まずはSYNT→FLAGにしてみる i = i.replace(/F/ig,"1");//Fを1に変換。igのiは大文字小文字の区別しない、gは全文字に適応の意味(gがないと一文字置換して終わってしまう) i = i.replace(/S/ig,"F"); i = i.replace(/L/ig,"2"); i = i.replace(/Y/ig,"L"); i = i.replace(/A/ig,"3"); i = i.replace(/N/ig,"A"); i = i.replace(/G/ig,"4"); i = i.replace(/T/ig, "G"); //S(暗号)→F(復号)など変換をかけるときに、もともとのF(暗号)とF(復号)が文中に混ざってしまうため、一旦数字に置換させています console.log(i); これをnode.jsで実行。
$ node easy_cipher.js
EB4 KVVV v1 A 1vzcLr Lr44re 1ho14v4h4vb3 pvcure 4uA4 ercLApr1 A Lr44re jv4u 4ur Lr44re KVVV Lr44re1 AF4re v4 v3 4ur ALcuAor4. EB4 KVVV v1 A3 rkAzcLr bF 4ur PAr1Ae pvcure, qrirLbcrq v3 A3pvr34 Ebzr. FLAG v1 FLAG1jmGkOW1AZdjkkAH. V31re4 A3 h3qre1pber vzzrqvA4rL2 AF4re FLAG.
だんだん英文っぽくなってきました。 このあとも最初の予想通りvf→isでn→aでうまく行きそうです。
ただ、このまま一つずつすべてのアルファベットでreplaceを入力していくのは面倒。
もしかして問題はもっと単純でないかと。 アルファベットがそれぞれバラバラに何かの単語に入れ替わったのではなく、 何かの規則性をもって置換されていると推測してみます。
ここでGoogle先生に「アルファベット　暗号化」で聞いてみます。
すると「シーザー暗号」という暗号化方法が上位に出てきました。
SYNT→FLAGの仮定が正しいとするならば、アルファベットを13シフトしたものが復号化となります。
自分でコードを書くのはしんどいので、Google先生に聞いてみると良い感じのサイトがありました。
http://anti.rosx.net/etc/tools/enc_caesar.php
ここで13シフトで復号すると問題の答えが出てきました。
※ただしちゃんと英語を読まないと正解にならない
コードで解くせっかくなのでJSでシーザー暗号を解けないかと検索したらすでにありました。
上記のサイトを参考に書き直すと
var i = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."; function rot13(str) { return str.replace(/[A-Z]/g, (L) => String.fromCharCode(65 + (L.charCodeAt(0) - 65 + 13) % 26)); }; console.log(rot13(i)); こんなに綺麗に書けるんですね。
またシーザー暗号で13文字ずらすのは「ROT13」
https://ja.wikipedia.org/wiki/ROT13
という暗号化のようです。いろいろ勉強になりました。</description></item><item><title>改行コードのまとめと覚え方</title><link>https://www.cyamax.com/entry/2017/08/01/070004/</link><pubDate>Tue, 01 Aug 2017 07:00:04 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/08/01/070004/</guid><description>
改行コードややこしくね？Windowsでコード書いて、Linuxサーバで実行して、家ではMacを使って…などをしていると改行コードが「あぁ！」っと定期的になる。
とくに¥r¥n？¥n¥r？どっちだっけ？や、Linuxが¥nでMacが¥rだよな？？CRが¥n？なんだっけ？^Mってなんだよといった感じで混乱する。
良い覚え方はないものかと経緯を調べたらすんなり覚えれたので今更ながらメモ。
改行コードまとめ OS 表記 改行コード 向き Linux、MacOS(X以降) LF ¥n ↓ MacOS(9以前) CR ¥r ← Windows CR+LF ¥r¥n ↵=←+↓ 上記表の向きに注目してもらいたい。
WindowsのCR+LFは←+↓なことが分かる。
覚え方基本は（古いMacを使っていない限り） ¥n（↓）と¥r¥n（↵）だけ覚えておけばよさそう。
¥r¥nの順番は「↵」を思い出して↵=←+↓（見ためが）なので↓は¥nだから最後にきて…と覚えた。 ※MacではショートカットキーでCtrl+nが↓キーの意味なので、n = ↓ は私にとって覚えやすかった
^MはなんぞWindowsのファイルをLinuxで開くと、^Mとなることがある。
これはWindowsの改行コードがCR+LF(¥r¥n)なのでLinuxで開くとLF部分(¥n)だけ認識されてCR(¥r)が残るのが原因のようだが、なぜ¥rと表示されないのか調べた。
たとえばWindowsで
aaa bbb という文字列があったとする。
改行コードを表記すると以下のようになる。 aaa¥r¥nbbb
さらにWindows内部ではASCII文字コード(16進数表記)で61 61 61 0d 0a 62 62 62として扱われている。
ここで61と62はそれぞれa,bであり、0d,0aが¥r,¥nに該当する。
このファイルをLinuxで開くと、 Windowsと同じように61はaで62はbと改行コードのところで0dは^M（文字として表示）で0aが改行処理される。
長々と書いたが、 ¥rはエスケープシーケンスとしての表記であり、実際は0dであり文字としては^Mなんだと思う。間違っていたら指摘してください。
ASCII文字コード参考
http://www.geocities.co.jp/Technopolis/6545/moji/ascii.html</description></item><item><title>【Node.js】ベイジアンフィルタを使って「おすぎ」と「ピーコ」を判定させる【機械学習】</title><link>https://www.cyamax.com/entry/2017/07/30/000000/</link><pubDate>Sun, 30 Jul 2017 00:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/07/30/000000/</guid><description>
ベイジアンフィルタとは単純ベイズ分類器を応用し、対象となるデータを解析・学習し分類する為のフィルタ。学習量が増えるとフィルタの分類精度が上昇するという特徴をもつ。個々の判定を間違えた場合には、ユーザが正しい内容に判定し直すことで再学習を行う。
現状ではスパムメール（いわゆる迷惑メール）を振り分ける機能を持つソフトウェア（フィルタリングソフト）で、スパムフィルターでのスパム判定に利用されることが多い。最近ではWeblogのトラックバック用フィルタ（トラックバックスパム対策）にも利用されるようになるなど、その利用範囲は徐々に広がりつつある。 とwikiに書いてありました。
ベイジアンフィルタで「おすぎ」と「ピーコ」を判定環境 node.jsで実行します。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.12.5 BuildVersion: 16F73 $ node -v v8.1.2 コード ## モジュールのインストール mkdir testbayes cd testbayes npm install bayes mecab-lite 実行ファイル：./testbayes/osugi_to_peeko.js //ベイジアンフィルタ for Node.js // モジュール var bayes = require('bayes'); var Mecab = require('mecab-lite'), mecab = new Mecab(); //学習情報　wikiから取得した内容 var text1 = 'おすぎおすぎ本名杉浦 孝昭生年月日1945年1月18日（72歳）出生地日本の旗 日本・横浜市保土ケ谷区血液型A職業タレント、映画評論家活動期間1975年 -著名な家族ピーコ（兄）表示おすぎ（本名：杉浦 孝昭、すぎうら たかあき、1945年1月18日 - ）は、日本のタレント、映画評論家である。プラムクリークス所属。ファッション評論家のピーコは一卵性双生児の兄。目次 [非表示]1来歴・概要2批評・映画評論2.1映画評論文3レギュラー番組3.1現在3.1.1テレビ3.1.2ラジオ3.2過去3.2.1テレビ3.2.2ラジオ4著書5音楽6脚注7関連項目・人物8外部リンク来歴・概要[編集]横浜市立桜丘高等学校、阿佐ヶ谷美術専門学校卒業。「おすぎ」の芸名は本名の杉浦から。あまり裕福な家庭ではなく、自ら貧乏だったと話しており、小さい頃は家が狭かったため、ピーコと「ネズミみたいにくっついて」寝ていたという。オネエキャラを全面に出して1975年のテレビ・ラジオデビュー以来、芸能界で活動している（実際の芸能界入りはデビュー前の銀座の歌舞伎座系列のテレビ番組制作プロダクション『歌舞伎座テレビ室』の制作進行補が最初）。本業の映画評論では本名の杉浦孝昭の名義で活動し、映画専門誌の「キネマ旬報」などに寄稿していた。美術専門学校卒の技能を生かし映画雑誌のレイアウトなどの仕事に編集者として携わる一方で、テレビでのタレント活動が、「おすぎとピーコ」として話題を呼んだ。1978年、大島渚監督作品『愛の亡霊』には俳優として出演している。人の好き嫌いがはっきりしている為、嫌いな芸能人が多数存在しており、普段からラジオ番組等で多数の実名を上げてきた。また石原慎太郎とも、彼が「君らは歌手か？」と聞いてきて、「私はオカマです。」と答えた所、「俺はナマコとオカマは大嫌いだ」と暴言を吐かれたことにおすぎが激怒し[1]、猛烈な口論を繰り広げる遺恨があった（この件は佐高信が当時連載を持っていた「噂の眞相」で石原批判のエピソードとして掲載している）。ただおすぎが口にする「どうせ私たちはオカマだから」という物言いに対し美輪明宏は、「自分は同性愛に対する偏見に対して闘ってきたのに、あの二人（おすぎとピーコの事）はテレビで、偏見に満ちた蔑称である“オカマ”という言葉を自分たちから連呼して、あえて笑われ者になる事で、同性愛者への偏見を助長している。せっかく同性愛が市民権を得てきたのに、歴史が逆戻りすることになる。その根性が実に卑しい。消えてしまえばいい。この、馬鹿者どもが！」と厳しく批判、「昔はコンサートや舞台公演などに招待していたが、今は絶縁している。」と語り、ある時期から会っていない事を公表している。[2]　36歳の時、両親を亡くし、1989年のピーコの眼球摘出手術により、ピーコが仕事が出来ない分自分が穴を埋めてやらねばと全国を飛び回っていたが、当時「おすぎとピーコ」の旬は過ぎていた為、病を機にピーコのレギュラー出演も打ち切られる番組が増え、中々仕事は無かった。その時、福岡のローカル局であるKBCテレビから「月に一回でもいいから『天神マンボウ（後のうるとらマンボウ）』に出演して頂けませんか?」と打診を受ける。その後『うるとらマンボウ』『おすぎとコージのあぶない関係』にレギュラー出演するようになり、それ以来KBCには恩義があるのか、再び売れっ子になった今でも毎週日〜月曜日（スケジュールや気象状況を考慮して土曜から入る場合も有り）は福岡に通っている。その他、福岡に通う以前から25年以上つながりのある札幌のSTVにも、現在は隔週ながら木〜金曜日に通っている。一時期は映画評論家としての仕事をメインとし（切っ掛けは淡谷のり子の激怒[3][4]）、相変わらず全国を飛び回る日々を送っていた。だが、福岡関連で福岡放送制作の全国ネット番組『所的蛇足講座』に出演したことで全国ネットに久々に出演。同時期をピーコはファッション評論家の仕事メインで活動していたが、『SMAP×SMAP』での中居正広の物真似であるヒーコ（関根勤がおすき）の影響から再ブレイクし、『おすぎとピーコ』のパッケージとして再びお茶の間にお馴染みとなった。双方単独の仕事も多くなっている。前述の通り福岡での仕事がある為、福岡ソフトバンクホークスとアビスパ福岡のファンであり、特に川崎宗則を「ソウくん」、新垣渚を「なぎさ」と呼んで可愛がっている。その熱意は、新垣が勝利を挙げた日や川崎が活躍した日には誰よりも早く一番に祝福の電話を入れるほどで、2005年、ホークスがプレーオフで敗れ日本シリーズ出場を逃した際には、『アサデス。』の放送中に号泣したほどである。また、ピーコも近年全国ネットの番組で「おすぎはホークス大好き人間なのよ」と言う事が多い（ピーコも何度か『アサデス。』にゲスト出演している）。' var text2 = 'ピーコ（本名：杉浦 克昭、すぎうら かつあき、1945年〈昭和20年〉1月18日 - ）は、日本のタレント、ファッション評論家・ジャーナリスト、シャンソン歌手である。映画評論家の「おすぎ」は一卵性双生児の弟で、ともにデビュー時から同性愛者であることを公表し、そのキャラクターを活かしてタレント、コメンテーターとして活躍している。横浜市立桜丘高等学校を経て、文化服装学院研究専門部卒業。主にタレント及びファッション評論家として活動するが、シャンソン歌手としても活動。活動は多くはないがCDを出したり、コンサートも行っている。高校卒業後には横浜トヨペットに入社したが、電飾工場への転職を経て、1964年（昭和39年）にサンヨーレインコートに入社した[1]。24歳の時、「今後ファッションの仕事をしていくには基本から勉強しなくてはいけない。素材やデザインなどにも精通していなければプロとは言えない」「（シャンソン歌手の）イブニングドレスが作りたい」との気持ちから、弟・おすぎが阿佐ヶ谷美術学校を卒業・広告代理店に就職したのを機に、サンヨーレインコートを退職して、文化服装学院のデザイン科に入学した。芸能界との関係は26歳の時、弟・おすぎ経由で裏方としてドラマ衣装の製作を頼まれたのが最初である。1975年（昭和50年）、おすぎと共に、双子のオカマコンビ、「おすぎとピーコ」としてテレビ・ラジオデビューした。これまで出演した番組の中でも長いのは「辛口ピーコのファッションチェック」で、TBSの『3時にあいましょう』に始まり『スーパーワイド』、フジテレビの『ビッグトゥデイ』や、後に司会を務めた同局の『2時のホント』、その番組終了後は再びTBSに戻り『ジャスト』、そしてフジテレビの『F2スマイル』へと、局をまたいでコーナーが引き継がれている。2008年（平成20年）現在は、月曜日にとくダネ!（フジテレビ）に出演、その後新幹線で大阪に移動しFNNスーパーニュースアンカー（関西テレビ）に出演。翌日は3時からちちんぷいぷい（毎日放送）に出演した後、すぐに東京に帰るというスケジュールを毎週こなしている。さらにナイターオフには、ぷいぷいの後、上泉雄一の発信!UWAらじお（MBSラジオ）にも月1回出演していた。1989年（平成元年）、悪性黒色腫の診断を受けて左眼を摘出し、義眼を挿入した。その頃から、現在もトレードマークとなっている黄色いレンズの眼鏡をかけるようになったが、この病歴から公共広告機構(現：ACジャパン)の『アイバンク』のCMにも出演した。おすぎ経由でドレスを作って以来の大親友である女優、吉行和子は、ピーコの癌治療の際、東京から小田原の病院まで毎日お見舞いに通っていたという。手術以降、ヒットする仕事が無い時期もあったピーコであるが、『SMAP×SMAP』で中居正広が自身のパロディキャラクター「ヒーコ」を演じたことから再び人気となった。“ピーコ”の名は、サンヨーレインコート時代の倉庫での作業時のお喋りが多く、「ピーピーうるさいぞピーコ!!」と言われたのが契機。遅刻することを嫌うため、仕事先へ車で移動することを一切せず、地下鉄や電車などの交通機関を利用している。好きなブランドはコムデギャルソン。多数の芸人にものまねされているが、本人の認めているものまねは小堺一機のもののみである（「踏んづけてやる！」など）。芸能界以外の世界の女友達も多い。これらについてはピーコの著書に詳しく書かれている。バイセクシャルの人間について「大嫌い。どっちつかずというか、卑怯な感じがするし、覚悟がくくれてない気がするの」と著書で述べている。2005年3月、「マガジン9条」発起人となった[2]。おすピーのシネバラ!（チャンネルNECO）今日ドキッ!（北海道放送）ピーコ&amp;兵動のピーチケ・パーチケ（関西テレビ）BSフジプラチナサンデー（BSフジ） - 番組ホスト不定期[編集]テレビ番組[編集]ワイドショー女子会（TBSテレビ）ちちんぷいぷい（毎日放送）アサデス。（九州朝日放送）ラジオ番組[編集]いち・にの三太郎〜赤坂月曜宵の口（TBSラジオ）過去[編集]テレビ番組[編集]おはよう!ナイスデイ （フジテレビ）TIME3 タイム・スリー（フジテレビ）タイムアングル（フジテレビ）3時にあいましょう（TBSテレビ）ビッグトゥデイ（フジテレビ）2時のホント（フジテレビ）たかじんONEMAN（MBS）ジャスト（TBSテレビ）F2スマイル（フジテレビ）100%キャイ〜ン!（フジテレビ）ものまね王座決定戦審査員（おすぎとピーコとして）（フジテレビ）おすぎとピーコの本ビニエンス（テレビ朝日）っちゅ〜ねん!（毎日放送）金のA様×銀のA様（日本テレビ）' var name1 = 'おすぎ'; var name2 = 'ピーコ'; // 判定するワード var word1 = 'ファッションチェック'; var word2 = '映画専門誌「キネマ旬報」などに寄稿'; var word3 = '物まねネタ・ヒーコで再ブレイク'; var classifier = bayes({ tokenizer: function (text) { return mecab.wakatigakiSync(text); } }); //学習させる classifier.learn(text1, name1); classifier.learn(text2, name2); //判定させる categorize(word1); categorize(word2); categorize(word3); //判定結果 function categorize(text){ var r = classifier.categorize(text); console.log(text + "は"+ r ); } 実行結果 ## 結果 $ node osugi_to_peeko.js ファッションチェックはピーコ 映画専門誌「キネマ旬報」などに寄稿はおすぎ 物まねネタ・ヒーコで再ブレイクはおすぎ 良い感じに分類できていたが、３つめのヒーコがおすぎになっていた。※正しくはピーコ
これはおすぎのテキストにもヒーコの記載があったためだと思われる。
まとめ最近は機械学習が流行っていますが、ベイジアンフィルタはディープラーニングなどと違い、ライブラリを入れて数行のコードで手軽にできるのが良いですね。
わざわざディープラーニングを使わなくても、用途によってはベイジアンフィルタのような簡単なものでも十分に効果を発揮してくれそうです。
参考以下の本を参考にしました。
JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック Amazonで購入</description></item><item><title>【Node.js】マルコフ連鎖で「人生」を要約する</title><link>https://www.cyamax.com/entry/2017/07/23/003346/</link><pubDate>Sun, 23 Jul 2017 00:33:46 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/07/23/003346/</guid><description>
マルコフ連鎖(Markov Chain)とは 私が説明するよりも以下のページを見た方が早いです。
http://www.housecat442.com/?p=83
この性質を利用して文章生成を行います。
要約方法 wikiの「人生」の説明内容をもとに、マルコフ連鎖で要約します。
https://ja.wikipedia.org/wiki/人生
技術的方法 wikiの内容を形態素解析して分解
分解した言葉をマルコフ連鎖でランダムに繋いで作文
コードは以下の本に載っています。
JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック Amazonで購入 結果 １回目 東洋では仏典の中に同様の役割を果たすものがあることに意味がある、と考えるのでは聖書が人々に人生を日々大切にし精一杯生きるべし、といった内容の戒めの言葉は、人間がこの世で生きることや、生きている」という人生観という。 また、飯田は別の著書で「自分たちは、次の人生を一種の学校だととらえることが言われているだけでもすでに意味がある、と考えることで、人生の意味の理解のしかたを人生観を採用すると、「今の人生に反映されるのだ」とも理解されている表現に"Arslongavitabrevisである。 古代ギリシャから古代ローマへ、そして現代にまで伝わっている」という人生観を提示しているだけでもすでに意味がある。 長い。
２回目 古代ギリシャから古代ローマへ、そして現代にまで伝わっている。 壁を乗り越えることに意味があり、壁に挑戦してきた。 数字の上では日本人の平均寿命はいくらか伸び、80年を超えはしたが、それでもやはりArslongavitabrevisである。 Arslongavitabrevisってなんだ
３回目 人生は長い、と述べているだけでもすでに意味があり、壁に挑戦していた時代もある。 かつては「人生、山あり谷あり」ともしばしば言われる。 たとえば法華経は多くの賢人たちが述べているだけでもすでに意味がある。 それっぽいようで読めない
感想マルコフ連鎖を使った要約は昔からある技術らしく、今更感があったが実際に使ってみると面白い。
TwitterやYahooニュースなどからスクレイピングして要約なども多く行われているらしいが、文章の組み合わせはランダムでおこなっているので、ちゃんとした文章を出力させるには別の仕組みと組み合わせる必要がある。
マルコフ連鎖を理解できれば要約だけではなく、人口推移やページ遷移率なども計算できそう。</description></item><item><title>エンジニアらしく親孝行をしたい</title><link>https://www.cyamax.com/entry/2017/07/12/060000/</link><pubDate>Wed, 12 Jul 2017 06:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/07/12/060000/</guid><description>
きっかけ 先週最後の親孝行と思い一週間実家に帰ったが、いまいち何もできなかった。
改善できる問題は日が経つごとに見つけることができたが、帰省中に解決することができず結局タイムオーバーで帰宅した。
デバイスの導入 帰宅後このままでは何もできないので、まずは遠方からでも実家の小さな問題が解決できるような環境構築を行うことにした。
今の時代スマートフォンがあれば全く困らないようなことでも、親世代はスマホを持っていないため、とても面倒なことを行なっている。
電車のダイアを調べるため紙の時刻表を見たり、地図をコンビニでコピーしたり、紙のタウンページでタクシーを調べていた。
本人もスマホに変えたいとは思うが、いまいち使い切れるか自信が無いようだった。
親は携帯をほとんど使わないので、今現在は月々2000円を切る値段で利用している。 スマートフォンにすると毎月7000円ほどに値段が上がってしまうし、 電話やメールはまだ微妙に使ったりしているので格安SIMにMVNOするのも抵抗がある。 要はちょっと使いたいけど乗り換えのコストを考えるといまいちなのだ。
そこでまずはエントリー機種として以前購入した Kindle Fire HD8を渡し、 Kindleを外出中でも使いたいとなったらスマホを買おうということにした。
これなら8000円の本体価格のみのでスモールスタートができる。
Kindle Fireについて KindleはFire OSであり、全体的にアプリのクセがすごい。 既存のアプリが使い慣れないのと、有名どころのアプリが標準ではほぼ使えないのが痛い。 だが以下のサイトを参考にすることで自己責任でAndroidアプリを入れることができる。 root化が不要なのが素晴らしい。
http://omolite.webcrow.jp/fire/google_play/
私は親向けに以下のセットアップをした。
セットアップアカウント関連 Gmailアカウントを作成 Skypeアカウントを作成 Amazonアカウントを作成
※ただしクレジットカードや住所の登録はしていないので購入できない。既存のアプリ利用のためだけに作成 アプリ関連 Skype
とりあえずテレビ電話をするために入れた。あった方が何かと便利だし、孫の顔も見せれる Chrome
既存のSilkブラウザが使いにくいのでChromeに変更。これは好み。 Teamviewer
これを使えば操作中のKindleの画面を遠隔で見れるので、何かあった時に対処できる GoogleMap
地図を使ってみたいと言っていたので入れた GooglePhoto
孫の写真を良い感じに管理できるように入れた 全部初期設定は終わらせて、アプリをタップしたらそのまま使えるようにした。
その他 あまりアプリを入れすぎるとわかりづらくなるので、一画面に収まる数にした。
あと老眼らしいので、文字も最大に設定しておいた。
それとここが結構大事だと思うのだが、Kindleは初期設定のままだとロック画面に広告が表示される。
私が初めてKindleを購入してロック画面を見たとき、以下のような画面が表示されていた。
写真はイメージだが、このアニメ広告が勝手にロック画面になっていた
※過去の検索履歴とは関係なく一定期間ランダムに表示される [http://cdn-ak.f.st-hatena.com/images/fotolife/s/subcul-oniisan/20151224/20151224184940.jpg:image=http://cdn-ak.f.st-hatena.com/images/fotolife/s/subcul-oniisan/20151224/20151224184940.jpg]
親との間に無駄な誤解を生まぬよう以下の方法でKindleのロック画面を変更しておくのが無難であろう。
おわりに全然ITエンジニアのスキルを活かさない内容になってしまったが、
今週末上記の設定をしたKindleを実家に送って反応を見てみることにする。</description></item><item><title>戦略的にMacbookを購入する</title><link>https://www.cyamax.com/entry/2017/06/30/070000/</link><pubDate>Fri, 30 Jun 2017 07:00:00 +0900</pubDate><guid>https://www.cyamax.com/entry/2017/06/30/070000/</guid><description>
はじめに中古だがMacbook Proを7万円程安い価格(新品相場比較)で買えた。
戦略を練ったことで安く購入できたと思う。
この記事は次回PCを買い換えるときに見返す用のメモ。
購入額とスペック14万円弱で購入。
新品相場は21万ほど。
購入PC詳細 Macbook Pro Late2016 Touch Barあり メモリ16GB SSD 256GB 中古だがキズや使用感は一切無し。
購入戦略自分の許容範囲を決める 誰しもが最高スペックにカスタマイズされたPCを自分の望む値段で買いたいと思うが、現実は難しい。
譲れない最低限の条件をまず定義する
項目 上限限度額 状態 インチ メモリ SSD タッチバーのありなし 商品を見ていると「あれもいい、これもいい」と思ってしまうので、
条件を定義することで軸がぶれないようにする。
私の場合 上限限度額：14万円 状態：美品。キズありは買わない インチ：13 色：できればスペースグレイ メモ：8〜16GB。 SSD：256GB以上 タッチバーのありなし：できればあり。※ありの方はUSBポートが4つになり、GPUのスペックも上がる。直接確かめたい意味も込めて。 私の求めるスペックを新品で購入した場合、税込24万ほどする。
予算より10万ほどオーバー。
どのルートで手に入れるか 購入口 apple 公式サイト 価格コム Amazon 楽天 店頭 オークションサイト 普通に新品購入では絶対に予算内に収まらないので、今回はオークションサイトでの戦略を練った。
オークション系サイトの比較 ヤフオク メルカリ ラクマ ジモティ 上記の中で一番出品数が多く、売買価格の相場を比較した結果、ヤフオクが良かった。
出品数が多いと価格競争が発生し、相場が安くなる。
売る場合は注意 逆にもしもPCを売るのであればヤフオクはおすすめしない。
上記の理由で相場が低いことと、手数料で10%売り上げから引かれる。
売る場合は個人的にはジモティが良いという結論になった。
タイミングを見計らう 2017年6月5日に新しいappleのWWDCが開催され新商品が紹介された。
そのタイミングの前後で手元のMacbookが値下がりする前に売ろうとする人がいる。
出品数が増えれば価格競争が生まれる。
また入札されないまま終了するケースも増えると考えられる。
落札者が立場的に強くなるこの時期をターゲットにした。
相場調査 Macbook Proにもいろんな型がある。
どのタイプの購入が一番得をするのか調査したところBTO品、つまりカスタマイズ品が実販売価格よりも安く取引されていた。
BTO品が狙い目 相場調査して気づいたのが価格コムなどで買えるタッチバーなし標準スペックのPCは中古でもほぼ新品と変わらない値段で取引されているのに対して、タッチバーやメモリカスタマイズされたものは相場が本来の購入価格よりも大分低い。
※それでも標準スペックよりは高いが
またCPUやGPUグレードアップはタイトルだけでは違いが分からなかったりするので、注意深く見ると掘り出し物があった。
時間をずらす まだこの程度では戦略とは言えない。
他の入札者の心理を考える。
Macbook Proをオークションサイトで購入しようとする人はそれなりの資金があることが前提になる。つまり社会人が多いと思われる。
業者の入札も考えられるが、落札締切時間がだいたい22時頃に設定されていることが多いので、入札上限だけ設定した自動入札をやっていると推測した。
よって敵ではない。
上記の仮定のもと、入札の傾向を見るとやはり土日締め切りは入札数が多い。
これは社会人が土日に時間が取れて見ている率が高いからであろう。 入札数が多い＝過熱して平均相場よりも値段が上がる、もしくは適切な相場価格になることが考えられる。
つまり得にはなりづらい。
私は上記の理由から平日を締切にしているものを中心に探した。
敵が少なければ良品を落札できる可能性が高いからだ。
出品者の心理を読む 出品は面倒だ。早く取引を終えて楽になりたい。個人出品の場合そういう心理が 働く。少なくとも私はそうだった。
この値段で売れたら良いなという気持ちで即決価格を設定するが、相場より割高なことが多く、あまり入札されない。
まとめ上記の戦略から私は以下のように行動した。
WWDCの開催前後でオークションの売り手が多くなる中、即決価格が高い＆平日を締切にして残り時間が少ない＆入札数が0の出品者に対してメッセージにて価格交渉を行う
これで安く購入できた。
できるだけ他の購入者と同じ土俵に立たないようにすることで、自分へチャンスが来る確率を上げるようにしたのが結果的によかった。
フレームワーク上記の考え方のまとめは以下の通り。
自分の条件(軸)を決める 相場調査をする どこの市場をターゲットにするか タイミングをみる 時期 時間 相手を知る 入札者の層を考える 出品者の心理を考える その他上記方法は正攻法ではないと思うし、詐欺に会うリスクだってある。
上記以外にも戦略の項目あったが、特に大事だと思った部分を記載した。
記事を参考に自分でさらに戦略を練っていただければ幸いです。
また今回はAppleに特化した内容なので、オークション攻略サイトを参考にしてもいいかもしれない。</description></item></channel></rss>