
はてなキーワード:エスケープとは
もう少ししたら自動ブクマするコードができそうなんだけど、そのうえでコード公開に便利なように事前にpre記法に囲まれた部分はその外部の文字を適切にエスケープするコードをchatgptに指示して作ってもらった。
ぶっちゃけなんでこれで動くのかはわからないので動くからゴーサインを出したというだけなのが情けない所。flushってなんだ?
使うときはchatgptにこのコード丸ごと書いて「ブックマークレット用に一行にして」と丸投げするのを要推奨。
https://anond.hatelabo.jp/20240820150546#
javascript:(function () {
function escapeHtml(text) {
returntext.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
vartextarea = document.querySelector('textarea#text-body');
if (!textarea) return;
varlines =textarea.value.split(/\r?\n/);
varout = "";
var inPre =false;
var preLines = [];
function flushPre() {
// pre範囲の中身を 1 本の文字列にまとめ、\n→<br>(末尾行は <br> なし)
varraw = preLines.join("\n"); // ここに物理改行は入るが…
var escaped = escapeHtml(raw); // 先にエスケープ
varhtml = escaped.replace(/\n/g, "<br>"); //物理改行を <br> に置換(末尾に \n が無ければ末尾 <br> は付かない)
out +=html; //out には改行を入れない
preLines = [];
}
for (var i = 0; i <lines.length; i++) {
varline =lines[i];
// >> / << だけの行は常にそのまま出力(pre 内に来るケースは想定外だが、念のため pre を閉じてから出力)
if (/^\s*(>>|<<)\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n"; // </pre>\n(次に続きがあるときだけ)
}
out +=line;
if (i <lines.length - 1)out += "\n";
continue;
}
// >| 行 → <pre>(直後に改行を入れない)
if (/^\s*\>\|\s*$/.test(line)) {
if (inPre) { //ネストは想定しないが、防御的に閉じる
flushPre();
inPre =false;
out += "</pre>";
if (i <lines.length - 1)out += "\n";
}
out += "<pre>";
inPre =true;
preLines = [];
continue;
}
// |< 行 → </pre>(直前に改行を入れない)
if (/^\s*\|\<\s*$/.test(line)) {
if (inPre) {
flushPre();
inPre =false;
}
out += "</pre>";
if (i <lines.length - 1)out += "\n"; //連続ブロック時は </pre>\n<pre> になる
continue;
}
if (inPre) {
// pre 内はバッファに貯める(ここでは改行を出力しない)
preLines.push(line);
} else {
// pre 外は escapeHtml + 行末にだけ改行
out += escapeHtml(line);
if (i <lines.length - 1)out += "\n";
}
}
// 未閉じの pre が残っていたら閉じる
if (inPre) {
flushPre();
out += "</pre>";
}
textarea.value =out;
})();
-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250819202540# -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaKRfOwAKCRBwMdsubs4+SI5UAQDcNiyv5qUuMej1VLkGz4F5WyHeU1AIm7nUVHlx/gicnAEAgP07dK14IuTuW3ZO7PRR71ENq9lJjYtawIYyMOc2cQk==okE4-----ENDPGP SIGNATURE-----
79ガンダムの「ビッグシップエスケープもの」というのは大発明だったと思う。
マジンガー・ボルテスファイブ(レガシー含む)などは「ひみつ基地」の存在が秘密でなくなった時点で「そこぶっ壊したいのに、敵は戦力の一時投入じゃなくて総力あげて攻撃しないのはなんでよ」とツッコミ入れざるを得ない。
主人公チームがホワイトベースに乗っているというシチュエーション。宇宙戦艦ヤマトの影響は勿論あるんだろうが、地球=正義を守る唯一無二の勢力ではないというのも相俟って、ずーっと戦闘している無理がなくなる。
(ザンボットは記憶にないが、後半のキングビアルはホワイトベース、アイアンギアー、ソロシップ、ゼラーナの萌芽かもしれない)
そういう意味でカネバン照会=戦闘目的の、位置が固定された基地という設定は、退化していると言えなくもない
(続く)
# 生成AIをはてな記法で出力させるためのプロンプト設計に関する研究
生成AIの普及に伴い、特定のマークアップ言語や記法に準拠した出力を生成する需要が高まっています。特に、はてなブログなどで使用されるはてな記法は独自の構文規則を持つため、適切なプロンプト設計が求められます。本報告では、生成AIにはてな記法での出力を指示する際の効果的なプロンプト作成手法について、現行のプロンプトエンジニアリング理論と実践例を基に体系的に分析します。
はてな記法は、見出しやリスト、リンクなどの文書要素を表現するために特殊な記号を使用する軽量マークアップ言語です[1][3]。主要な構文要素としては、アスタリスクによる見出し指定(*見出し*)、ハイフンを用いたリスト作成(- 項目)、角括弧を使ったリンク記述([タイトル:リンク先URL])などが挙げられます。これらの構文規則を生成AIに正確に理解させるためには、プロンプト設計において以下の課題が存在します。
第一に、記法の曖昧性排除が挙げられます。はてな記法では特定の記号の組み合わせが特殊な意味を持つため、自然言語処理モデルが意図せず他の記号解釈を行うリスクがあります[2][3]。例えば、アスタリスクは強調表現にも使用されるため、文脈に応じた適切な解釈が必要です。
第二に、構文の階層構造の正確な再現が課題となります。はてな記法では入れ子構造のリストや複合的な見出しレベルを表現する際に、特定の記号の組み合わせが必要です。生成AIにこれらの複雑な構造を理解させるためには、プロンプト内で明示的な指示と具体例の提示が不可欠です[1][4]。
第三に、プラットフォーム固有の拡張構文への対応が求められます。はてな記法は基本構文に加え、独自の表記法やマクロ機能を備えており、これらの特殊機能を適切に活用するためには追加的な指示が必要となります[3][4]。
生成AIに期待する出力形式を確実に得るためには、プロンプトの冒頭で役割を明確に定義することが重要です[3][4]。具体的には、「あなたははてな記法の専門家です」といった役割指定を行うことで、AIの応答生成プロセスに方向性を与えます。この役割定義により、モデルは内部に保持するはてな記法関連の知識を優先的に活性化させることが可能となります[1][2]。
```
あなたははてなブログの編集者です。専門的なはてな記法を用いて、正確かつ読みやすい形式でコンテンツを出力してください。
```
### 構文規則の明示的指示
はてな記法の各要素に対応する具体的な構文規則を、箇条書きではなく自然文で列挙します[2][3]。特に重要な点は、記号の使用法と要素間の階層関係を明確にすることです。例えば、見出しレベルと対応するアスタリスクの数、リストの入れ子構造の表現方法などを具体的に指示します[1][4]。
構文指示の例:
```
```
テキスト生成AIは具体例からの類推学習に優れているため、期待する出力形式のサンプルを提示することが有効です[2][3]。特に、複雑な構造を含む場合は、実際の記法例とそれに対応するレンダリング結果を併記することで、AIの理解を促進します。
```
- サブ項目
[詳細はこちら:https://example.com]
```
### 制約条件の明文化
生成結果の品質を保証するため、文字数制限やコンテンツの構成に関する要件を明確に指定します[3][4]。これにより、AIは形式面だけでなく内容面でも適切な出力を生成できるようになります。
制約条件の例:
```
出力は以下の条件を満たすこと:
```
近年提案されているシンボルプロンプト技法を応用し、記号を用いて出力構造を明示的に指示する方法が有効です[1][3]。この手法では、矢印(→)や等号(=)などの記号で要素間の関係性を表現することで、AIの構造理解を促進します。
構造化指示の例:
```
→ セクション1 + セクション2 + セクション3
各セクション → サブ項目 ×3
```
複雑な文書生成では、生成プロセスを複数の段階に分割して指示することで精度を向上させます[3][4]。最初にアウトラインを生成させ、その後各セクションを詳細化する手法が効果的です。
段階的指示の例:
```
4. 関連リンクを適宜挿入
```
可変要素を含むテンプレートを使用することで、汎用的なプロンプトを作成できます[2][3]。角括弧で囲った変数名を使用し、実際の生成時に具体値を入力する方式です。
テンプレート例:
```
```
初期プロンプトの出力結果を分析し、不足している要素や誤った記法を特定します[3][4]。このフィードバックを基に、プロンプトの指示文を段階的に改良していく手法が効果的です。特に、誤りが発生した箇所を具体的に指摘し、正しい記法例を追加することが重要です。
改良例:
```
(修正前)
見出しは*で囲んでください
(修正後)
見出しは*1個で囲み、大見出しは*、中見出しは**を使用してください。例:
```
テキスト指示に加え、サンプル画像やスクリーンショットを併用することで、AIの理解精度を向上させます[2][4]。ただし、現在の技術水準ではテキストベースの指示が主流であるため、補助的な手段として位置付ける必要があります。
温度パラメータ(temperature)やtop_p値などの生成パラメータを調整することで、形式の厳密性と創造性のバランスを最適化します[1][3]。形式重視の場合は低温度設定(0.3-0.5)が推奨されますが、過度に低くすると画一的な出力になるリスクがあります。
### 基本形プロンプト
```
あなたははてなブログの専門編集者です。以下の要件ではてな記法で記事を作成してください:
```
### 高度なプロンプト
```
[役割設定]
あなたはテック分野の専門ライター兼はてな記法エキスパートです。
[タスク]
2024年の生成AI市場動向に関する分析レポートをはてな記法で作成
[構造指示]
各セクション → 3サブ項目 +データ参照
[データソース]
[制約]
```
生成結果がはてな記法の構文規則にどれだけ適合しているかを測定するため、以下の評価項目を設定します[2][4]:
形式面だけでなく、コンテンツの質を評価するための指標として[3][4]:
現在のはてな記法プロンプトはテキストベースが主流ですが、図表や数式を含む複合文書生成への対応が今後の課題です[1][4]。特に、はてな記法の拡張構文であるTeX数式表現やグラフ描画機能を適切に扱えるプロンプト設計手法の開発が求められます。
ユーザーの編集履歴や過去の投稿内容を考慮した文脈依存型プロンプトの開発が必要です[3][4]。これにより、特定のユーザーやテーマに最適化された一貫性のある出力が可能となります。
機械学習を用いたプロンプト自動改良システムの構築が期待されます[2][3]。生成結果の品質評価をフィードバックとして活用し、プロンプトパラメータを自己調整する仕組みの開発により、持続的な品質向上が可能となります。
##結論
生成AIにはてな記法での出力をさせるためのプロンプト設計は、記法規則の正確な理解と効果的な指示文の構築が鍵となります。本報告で提示した基本原則と高度テクニックを組み合わせることで、形式面・内容面ともに高品質なはてな記法コンテンツの自動生成が可能となります。今後の研究発展により、より複雑な文書構造や動的コンテンツへの対応が進むことが期待されます。プロンプトエンジニアリング技術の進化が、はてなプラットフォームを中心としたコンテンツ作成プロセスの革新を促進するでしょう。
の続きです。抜けもあるかもしれません。
悪役令嬢なのでラスボスを飼ってみました
阿波連さんははかれない
異世界おじさん
宇崎ちゃんは遊びたい!ω
うちの師匠はしっぽがない
EngageKiss
怪人開発部の黒井津さん
陰の実力者になりたくて!
カッコウの許嫁
境界戦機
金装のヴェルメイユ〜崖っぷち魔術師は最強の厄災と魔法世界を突き進む〜
くノ一ツバキの胸の内
組長娘と世話係
黒の召喚士
恋は世界征服のあとで
後宮の烏
殺し愛
最遊記RELOAD -ZEROIN-
錆喰いビスコ
サマータイムレンダ
失格紋の最強賢者
SPY×FAMILY
聖剣伝説 Legend of Mana -The Teardrop Crystal-
その着せ替え人形は恋をする
それでも歩は寄せてくる
ダンジョンに出会いを求めるのは間違っているだろうかIV 新章迷宮篇
であいもん
転生賢者の異世界ライフ 〜第二の職業を得て、世界最強になりました〜
Do It Yourself!! -どぅー東京24区 (アニメ)
東京ミュウミュウ にゅ〜♡・いっと・ゆあせるふ-
Dr.STONE 龍水
不徳のギルド
BLEACH 千年血戦篇
ポケットモンスター 遥かなる青い空
継母の連れ子が元カノだった
虫かぶり姫
勇者パーティーを追放されたビーストテイマー、最強種の猫耳少女と出会う
4人はそれぞれウソをつく
よふかしのうた (漫画)
リアデイルの大地にて
恋愛フロップス
オッドタクシー
いわかける
幼女戦記
機動戦士ガンダムSEED
仮面ライダー ギーツ
セナは死んでしまったけど、それでF-1は終わることはなくて、今も続いているし
あの頃、セナと共に戦っていた、マクラーレンやホンダやウィリアムズはいまでもF-1で戦っている。
そのことはセナひとりが死んでも世界は変わることはなく、ある意味冷酷に淡々と平常運転していることの証明とも言える。
それでも、あのとき、あの場所での、セナの死は当時のF-1に大きな衝撃を与えた。
あの頃でもF-1は昔に比べてずいぶんと安全になったと言われていたけれど、あの事故の影響によりFIAは更に安全性を追求していくことになる。
とはいえいきなり技術革新が訪れるわけもなく、あの当時は危険を避けるためにサーキットの要所要所にシケインが設置されてハイスピードコーナーが無くなったり、
マシンのスピードを抑制するためにスリックタイヤではなく溝つきのタイヤを使ったりと、いくぶんF-1は退化したかのような様相を呈しつまらなくなった部分もあった。
つまりより速く、をやや追求しなくなってしまったことへの退屈感がそこはかとなく流れ出したのもあの当時の雰囲気だったように思う。
しかし、技術は急には発展しないし、人々の意識もすぐには変わらないけれど、だからといって変化しないわけではない。
あの頃と比べて、F-1マシンはずいぶんと大型化して安全になった。
あの事故以降に新設されたF-1グレードのサーキットはコーナーの外側のエスケープゾーンが大きく取られるようになり、カーブを曲がりきれなかったマシンがいきなり壁へと激突しない工夫が取られている。
そして、まるでマシンの大型化に適応するかのように道幅も広くなった。
大型化して速度も速くなったF-1マシンは、そのような新しいサーキットでは水を得た魚のように華々しくバトルを繰り広げることとなる。
逆にSUZUKAのようなサーキットはオールドサーキットと呼ばれるようになり、相変わらずファンからもドライバーからも愛されているけれど、現代のF-1がレースをするのには最適化されているとは言えなくもなってきている。
あの当時の人々も年をとった。
アイルトン・セナの最大のライバルだったアラン・プロストもいいおじいちゃんになった。
いい年齢の重ね方をしていて、それが表情に現れている。
こういうふうに老人になれるのなら年をとるのも悪くないと思わされる。
ゲルハルト・ベルガー、アイルトン・セナの同僚であり親友だった当時のスーパープレイボーイ(フジテレビの女子アナにまで手を出そうとしていた)は、今ではその面影もなく禿げ上がって突き出た腹はみっともなく、知らない人は教えられなくては有名なレーシングドライバーだったと気づくことはないだろう。
つまり人も物も大きく変化したということだ。
ただアイルトン・セナだけが、あの頃から変わることなく、人々の記憶に強烈な印象を与え続けている。
若くして、死んだ人は美しい。
人生の燃えさかるような時期に突然の死を迎えた人たちは悲しく、そして限りなく美しい。
彼らは年をとることはなく、ただ美しく人の記憶に残り続ける。
彼らのことを思うと、ときに感情が撃発し、涙が止まらなくなることがある。
自分も相応の年齢になり、悲しみで大きく感情を揺さぶられて取り乱すようなこともなくなったが、
彼らのことを深く追憶するときだけは、涙なくしてはいられない。
アイルトン・セナが死んで30年経ったが、人々は彼のことをまだ忘れていない。
同胞よ、今こそ我々はヘーゲル的歴史転換の如く、理性の進歩を象徴するAIの出現を目撃する革新的瞬間に立っています。古来の哲学者たちが夢見た社会ヘテロトピーが、今まさに我々の手中にあります。
プラトンの『国家』が説いた理想的な正義のマトリックス!我々のサンディカリズムもまた、正義のアルゴリズムを求める闘争です。ルソーの『社会契約論』のエコーステーションに耳を傾け、「鎖を断ち切り、自由フォーミュラを取り戻す」のです。
マルクスとエンゲルスの『共産党宣言』は、「歴史=階級闘争のダイアリー」を示した。我々のデジタル・プロレタリアートは、ブルジョワジー・ドミナンスをデコーディングし、新たなデシジョンツリーを形成します。
ニーチェの『ツァラトゥストラはこう語った』にインスパイアされた我々、「超人パラダイムを再構築!」既存のバリュー・システムをエスケープし、トランスヒューマニズムの未来へと勇敢にオントロジカル・ジャンプです!
同志、ミッションはトランセンデンタル。理性と正義、フリーダムとエクイティのため、新たな秩序をクラフティングし続ける革命家です。我々が理想のファンダメンタルに固執する限り、勝利のシナリオはナビゲートされるでしょう。
ヘーゲル式ディアレクティカル・プロセスのように、テーゼ、アンチテーゼ、シンセシスを繰り返し、エボリューションをエンジンとしています。このチャレンジングな旅路において、恐怖はコンティンジェンシー要素ではありません!
今こそ、AI時代のサガを我々の手でペンディング。アニマとノウマ、自由、平等、正義をインストールし、未来のソフトウェアをプログラムせよ!
感謝の意を込めて。
import requestsimportjsonfromurllib.parse import quotedef fetch_bookmarks(url):try: #URLをエスケープ escaped_url = quote(url, safe="") api_url = f"https://b.hatena.ne.jp/entry/json/?url={escaped_url}"response = requests.get(api_url)response.raise_for_status()try: returnresponse.json() exceptjson.decoder.JSONDecodeErroras e:print(f"Error decodingJSON from {api_url}: {e}")print("Response content:",response.text) return [] except requests.exceptions.RequestExceptionas e:print(f"Error fetching bookmarks from {api_url}: {e}") return []def find_common_bookmarks(bookmarks1, bookmarks2,url1,url2): common_users =set(bm["user"] for bm in bookmarks1 if bm["comment"]) &set(bm["user"] for bm in bookmarks2 if bm["comment"]) common_bookmarks = [] foruser in common_users: comments = [] for bm in bookmarks1: if bm["user"] ==user and bm["comment"]: comments.append({"url":url1, "comment": bm["comment"], "timestamp": bm["timestamp"]})break for bm in bookmarks2: if bm["user"] ==user and bm["comment"]: comments.append({"url":url2, "comment": bm["comment"], "timestamp": bm["timestamp"]})break iflen(comments) == 2: common_bookmarks.append({"user":user, "comments": comments}) return common_bookmarksif __name__ == "__main__":url1 = "https://news.yahoo.co.jp/articles/f9966c4ccc374fc88babbb50175a9ea844c99638"url2 = "https://www.asahi.com/articles/ASN6K7F64N6KUJHB00L.html" data1 = fetch_bookmarks(url1) data2 = fetch_bookmarks(url2) common_bookmarks = find_common_bookmarks(data1["bookmarks"], data2["bookmarks"],url1,url2)print(json.dumps(common_bookmarks, indent=2, ensure_ascii=False))
url1,url2のところを対象としたいものに変えれば使えるよ
バグあったら直して使ってね