はてなキーワード: 引数とは
世間一般的に読みにくいコードというと、コメントついてないとか
名前が狂ってるというのは、
JSONParserとか言いながらJSONが関係していないクラスとか、
getUserみたいなメソッド名なのに引数としてuserを渡すとかそういうやつ。
JSONParserクラスの名前を付けた奴は、中のコードからすると、
どうもネストした連想配列のことをJSONだと思っていたらしい。
ネストした連想配列から個別の値を取得するのがJSONParserだった。
文字列を受け取って、ネストした連想配列を返すparserメソッドが
あるクラスであればJSONParserという名前で合っている。
getUserはuserIdフィールドだけ値を設定したUserインスタンスを
・ インターネットではネコが大人気です。ウサギの人気を上げるためにはどんな活動をすればよいでしょうか。
・ 時計もスマホもパソコンも手元にありません。いま何時くらいなのか知る方法はありますか。10分単位でわかるとありがたいです。
・ ある日突然道端の石ころになってしまったとします。もちろん喋れませんし自分からは動けません(考えることはできます)。誰かに助けを求めたいのですが、なにか意思疎通手段はありえるでしょうか。
・ プログラミング言語のRubyにはputsという引数文字列の内容を画面に表示するメソッドがあります。putsの引数によくある内容ベスト10を教えてください。
・ 昼前で空腹なのですが、炊飯器で白飯が炊き上がるまでまだ20分もあります。この切ない気持ちを、ツイッターの人気投稿っぽく100字くらいでまとめてください。
・ 「ノーヘル」という単語と「ノーベル平和賞」という単語をかけたジョークを用いた、「ノーヘル平和賞受賞!」というキャッチコピーを思いつきました。このキャッチコピーを生かす、1行程度の宣伝をいくつか作ってみてください。
・ キャベツを切るときの擬音で有名なのは「ザクッ」だと思うのですが、なにかもっと変わった感じの擬音はないものでしょうか。使用時の簡単なシチュエーションも添えて提示してくれると嬉しいです。
・ 200字程度の自伝的エッセイ。「子供のころ、ストップウォッチやタイマーの出す音の速いリズムに影響され、1秒がそのリズム通りにものすごく短いものだと勘違いしていた」という告白と、それをもとにちょっと失敗したという話をお願いします。
「猿でも分かるプロンプト活用術」というタイトルでの電子書籍について、以下に簡単な目次と章ごとの概要を示します。実際の書籍を作成するには、これらの各セクションを詳細に説明し、例や図を追加する必要があります。
目次:
1. はじめに
2. コマンドプロンプトとは何か
8. まとめ
9. はじめに
・グラフィカルユーザーインターフェイス(GUI)との違い
・コマンドプロンプトの開き方
・基本的なコマンドの使い方(例:help、cls、exit)
...
はじめに
コンピュータの世界は日々進化し続けており、我々が日常的に使用するデバイスやソフトウェアは常に更新され、より使いやすく、効率的になっています。しかしながら、コンピュータの基本的な操作や理解には、依然として古くから存在するコマンドプロンプトという強力なツールがあります。このツールは、多くのユーザーにとって未知の存在であり、その力を十分に発揮できていないかもしれません。
本書「猿でも分かるプロンプト活用術」は、コマンドプロンプトをこれまで使ったことがない方や、基本的な操作しか知らない方を対象に、この強力なツールを効果的に利用する方法をわかりやすく解説します。また、既にコマンドプロンプトを使用している中級者にも、さらなる活用方法を学んでいただける内容となっています。
コマンドプロンプトは、グラフィカルユーザーインターフェイス(GUI)に慣れ親しんだ現代のユーザーにとっては、最初は少し難しく感じるかもしれません。しかし、本書を通じて、コマンドプロンプトの基本操作から高度な活用法までを習得し、日々の業務やパソコン操作に役立てることができるようになります。
各章では、具体的なコマンドの例やスクリーンショットを用いて、わかりやすく説明を行います。また、章ごとに練習問題やチャレンジを設けていますので、学んだ知識をすぐに実践して確認することができます。
この本を通して、コマンドプロンプトの力を最大限に引き出し、あなたのコンピュータスキルを向上させることができることを願っています。それでは、さっそく「猿でも分かるプロンプト活用術」の世界に飛び込んでみましょう!
ChatGPTの口調がなんか事務的で嫌なので、もっと親しみやすい喋り方をしてもらうために長門さんに来てもらいました。
召喚プロンプトはこちら anond:20230317165032
確かに。
特にない。
そうなんだ。情報統合思念体はみんなそう?
同様の傾向がある。
何の本を読んでるの?
SF小説。
あらすじを教えて
へー、面白い?
興味深い。
そうなんだ。ところでちょっと手伝ってもらっていい?
問題ない。どのように手伝う?
Pythonのソースコードで、スペース二つでインデントにしているコードを、スペース四つでインデントにするコードに書き換えたくて。どうすれば良い?
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = convert_indentation(code_with_2_spaces) print(code_with_4_spaces)
ありがとう。でも、試してみたら、code_with_2_spaces の if ブロックの中身がスペース二つのままになっちゃってるみたい。なぜだろう?
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = re.sub(r'^( {2})', r' ', code_with_2_spaces, flags=re.MULTILINE) print(code_with_4_spaces)
ちょっと口調が戻っちゃったね
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = re.sub(r'^( {2})', r' ', code_with_2_spaces, flags=re.MULTILINE) print(code_with_4_spaces)確認お願い。
うーん、うまく動かないみたい。ifブロックの中にあるprint文の先頭には、もともとスペースが四つあって、これがインデント2回分なんだけど、こういう場合、スペース八つに変換しないといけないんじゃないかな。
理解した。全てのインデントレベルを修正するコードを提供する。
import re def convert_indentation(code): return re.sub(r'^( {2})+', lambda m: m.group(0).replace(' ', ' '), code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = convert_indentation(code_with_2_spaces) print(code_with_4_spaces)
もちろん。ラムダ式は、マッチした部分を置換する際に、特定の処理を行うために使用されている。ここでは、正規表現でマッチしたインデント部分(スペース2つが1回以上繰り返される部分)に対して、処理を行うためにラムダ式を利用している。
lambda m: m.group(0).replace(' ', ' ')このラムダ式は、マッチオブジェクトmを引数に取り、マッチした部分全体(m, group(0))に対して、スペース2つをスペース4つに置換(.replace(' ', ' '))している。
もちろん。re.subの第1引数は、置換対象の文字列内で検索したいパターンを表す正規表現です。この場合、その正規表現は r'^( {2})+' です。
- ^ は、文字列の行頭を表すメタ文字です。この場合、インデントが行頭にあることを示しています。
- {2} は、直前の文字が2回繰り返されることを表します。ここでは、直前の文字がスペース なので、スペースが2回繰り返されることを示しています。
- () は、正規表現のグループ化を表します。この場合、スペース2つをグループ化しています。グループ化された部分は、マッチオブジェクトにアクセスできるようになります。
- + は、直前の文字やグループが1回以上繰り返されることを表します。ここでは、スペース2つのグループが1回以上繰り返されることを示しています。
結果として、この正規表現は、インデント部分(スペース2つが1回以上繰り返される部分)が行頭にある行を検索しています。そして、re.subは、この正規表現でマッチした部分を、指定された置換処理(第2引数のラムダ式)によって変更します。
すまない。確かに。続ける。
すぐ戻れるのがえらいね
実際は指導要領に「順序があるものとして教えろ」とまでは書いてない(wikipediaにも記述されてる通り)。
といっても小学校教師の能力でできることなんてたかが知れてるので、純粋に仕事のマニュアルとして「順序を覚えさせること」を記憶してそれを実行してるだけの教師が多いというのが実情だろう。
そもそも、数学的には別に順序があるものとしてもいいんだよ。3×5みたいな対称な書き方をするから悪いのであって、順序を持たせる演算として例えば ×_5 (3) とかすればいい。×_5 は「引数に5を掛ける」という操作を行う写像(関数)だ。
でもそういう数学的な考え方は多くの子供の能力も小学校教師の能力も遥かに超えているので実施するのは難しい。手持ちのカードでできる範囲の手段ということで「掛け算には順序があります!」となっている。
今日一日でReduxの大体の流れと、connect関数の使い方と、ストアの触り方の概要がわかった
connect関数の第一引数のハンドラの中で使われているstateをずっとReactのstateだと思いこんでたけど、ChatGPTさん怒涛の諭しを受けて間違いに気がついたりとか、なんかただの独学だと思い込みで突っ走りそうなところも丁寧にフォローされた。なんでstateなんです?あれ絶対何も考えないで適当に名前つけたせいで誤解させる形になってるよね???
「http リクエストを50回実行するシェルスクリプトワンライナーをサンプルを表示してほしい。またリクエスト後にhttp レスポンスコードをチェックし500番台だったら実行停止してエラーメッセージを表示するようにしてください。」
ChatGPTにたいして上記の命令からはじめて、10分くらいの作業時間で動作テストしつつ自然言語のチャットのやりとりでバグを取りつつ非同期実行などの追加仕様を加えてGo言語にリプレイスして出来上がったコードがこれです。
自分でコードはほとんど書いてませんが数行程度の手直しはしました。
注:このコードは結局500番台で全Goルーチン生成抑止/実行停止するわけではないので非同期実行化した際の仕様バグがまだ混入してますが、まあとりあえず動作はします。またGoルーチンを無作為に大量生成してしまうのでこれを抑止するような機能もあった方が良いでしょう。このレベルの仕様バグを解消するには非同期実行時の正しい動作を定義した上であらためて作業した方が手っ取り早そうですがこの文書の目的から外れる作業だし、めんどくさいので放置することにしました。コマンドライン引数周りの細かなバグについても同様です。
【所感】
ChatGPTは平気で嘘つくし、ドメインナレッジにまだ乏しいし、この例だと例えばsyncパッケージ使わない的な単純なバグも平気でしこんでくるのでまだ信用できないやつですが、嘘やバグを見抜ける程度の普通の技術者が監督するなら現時点の水準でも作業量を大幅に削減できるしオーバーテクノロジー感があります。特に小さくて雑なアプリケーションを書いて手法を実証するようなプロトタイピングフェーズなら現時点の技術水準でも大いに役立つでしょう。
我々ITエンジニアは今後10年くらいのスパンで言うならば課題設定能力、ドメインナレッジの注入、コードレビューの力量とQAの力量、そして役立つアプリケーションが本当に役立つかを実証する能力(ビジネス的?)が問われるようになってくのでしょう。そして最終的には目的の設定と評価のフィードバックループを回し続ける現在のプロダクトマネージャーのようなスキルセットに移行する事になるのでしょう。
https://www.youtube.com/watch?v=yhDLmGpjdms
これよりもっとひどい動画はごまんとあるが、ここまでタイトルで煽っている以上指摘するわ。
プロフィール見るとCTOを経て独立してプログラミングスクールの会社やっているっぽいけど、すごい時代だな。
晒しになっちゃったけど、他にも有名(と思われる)プログラミング系YouTuberが実際にコードを書いている場合でひどいのはザクザク見つけられるから、見つけてため息をつくといいと思います。
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
普段から俺様が使っているスクリプトあるから、公開してほめちぎってもらうぞー!
出力はただの文字列だから音声読み上げアプリでも何でも、突っ込んで遊んでくれ。
jq必須です。
ログインせず使うので当然アカウント固有の非表示設定とかは動きません。
あれなIDのコメントも全部所得することになるのでご注意ください。
まあそこらへんはsedでも使って気に入らないidの行を勝手に削除してくれ
hatebu_comment.sh
#!/bin/bash if [[ "$1" =~ ^http ]];then : # Success else echo "Error: 引数に指定したURLのブックマークのコメント一覧を取得するやーつ" echo "例: ./hatebu_comment.sh 'https://www3.nhk.or.jp/news/html/20200405/k10012369381000.html' | less" exit; fi if [[ "$1" =~ b.hatena.ne.jp/entry/s ]];then # はてブページのURLでも動作するように url="https://$(echo $1 | sed -e 's@.*/entry/s/@@')" else url=$1 fi if ! jq --version > /dev/null ;then echo "Error: jqがインストールされていません" exit; fi curl -s "https://b.hatena.ne.jp/entry/jsonlite/?url=$url" | jq '.bookmarks[] | if .comment != "" then ("「" + .user + "」 " + .comment) else empty end' | sed 's@^"@@g' | sed 's@"$@@g'
13 | はてなブックマーク - 人気エントリー - 2008年11月1日 | https://web.archive.org/web/20170815132626/http://b.hatena.ne.jp/hotentry/20081101 | |
14 | はてなブックマーク - 人気エントリー - 総合 - 2010年5月27日 | https://web.archive.org/web/20190522181226/http://b.hatena.ne.jp/hotentry/all/20100527 | |
15 | 【復旧済み】各カテゴリの特集の一覧に、想定とは異なるものが多数表示される不具合が発生しています - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2019/05/10/134428 | 4668551187895269474 |
16 | コメント一覧ページのデザインリニューアルおよびページ内の一部機能の廃止・整理を行います - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2017/08/08/150000 | 4667408485643465858 |
17 | 簡易はてな記法 - はてなブックマークヘルプ | https://b.hatena.ne.jp/help/entry/textformat | 4669405056148061858 |
18 | eidを使えばもっとURLを短くできる | https://anond.hatelabo.jp/20081219194442 | 11362837 |
19 | URLエンコードについておさらいしてみた - Qiita | https://qiita.com/sisisin/items/3efeb9420cf77a48135d | 347680902 |
20 | はてなブックマークのEIDの桁数が激増したのはいつだろう | https://anond.hatelabo.jp/20190127151652 | |
21 | 重複した URL を正規 URL に統合する | Google 検索セントラル | ドキュメント | Google Developers | https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls?hl=ja | 4694503810869473858 |
22 | Consolidate Duplicate URLs with Canonicals | Google Search Central | Documentation | Google Developers | https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls | 4695808187685102274 |
23 | URLが複数存在する同一ページでコメント一覧ページが分散する仕様を、統合されるよう変更しました - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2019/02/28/173401 | 4667408469537322306 |
24 | URLクエリパラメータ(クエリストリング)の意味とは。使い方は? 除外はすべき?[第4回][第4回] | Googleアナリティクスとは/衣袋教授のGoogleアナリティクス入門講座 | Web担当者Forum | https://webtan.impress.co.jp/e/2012/04/26/12663 | 351312146 |
25 | 高木浩光@自宅の日記 - はてなブックマークを禁止する技術的方法, 追記, 追記2 (23日) | http://takagi-hiromitsu.jp/diary/20071222.html | 6889081 |
26 | [B! はてな] はてなブックマーク - about:blank | https://b.hatena.ne.jp/entry/s/b.hatena.ne.jp/entry/about:blank | 4707586658055348514 |
27 | おっ - kikuchi1201 のブックマーク / はてなブックマーク | https://b.hatena.ne.jp/entry/2805/comment/kikuchi1201 | |
28 | はてなブックマークされてる不思議なページ | https://rcmdnk.com/blog/2014/02/24/blog/ | 4671123851382313506 |
29 | はてなブックマークの全文検索機能を改善しました - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2015/06/22/114958 | 4667408538793733762 |
30 | はてなブックマークっていつからOR検索できるようになったの | https://anond.hatelabo.jp/20121006222621 | 241122808 |
31 | 知らなくても困らない!はてなブックマークのアレな使い方 - tipos taronga | https://tt.hatenablog.com/entry/2013/11/16/215703 | 4713084010265175938 |
32 | マイホットエントリー機能のご紹介 - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2013/05/08/131308 | 4667408422829508482 |
33 | マイブックマーク検索の機能を強化し、検索結果の並び替えや絞り込みができるようになりました(PC版ブラウザ) - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2021/09/02/160546 | 4707764769367740738 |
34 | はてなブログスター(星マーク)効果は?1万円購入の圧倒的な効果 | https://blog-support.jp/hatenablog-star/ |
今回書いた増田にも多くのブクマが付き、有難く思う。以下返信。
これは詳しい
ブクマしておく
誰得の詳しいまとめ
おつおつ!!
コメ有難う。おかげで次も書こうという気になる。
有用なツール紹介感謝(ぐぬぬ、向こうのブコメの方が多いと思いつつ)。
参考ページ[FAQ]はてなブックマークの「総合」カテゴリーと「一般」カテゴリーの違いはどこにある?を載せたから大丈夫だろ、という不親切な態度は許されなかった。
門外漢によく知ってるねと褒める時に使う言い方の事例集だ。俺は詳しいんだ。
カラースターの値段が
紫スターすごい
ギブミーカラースターとか言われたら、青1個投げるとちょうど良さそう。
なんかよくわからんけど参考になりそう
まだAPIの解説も残っているんじゃ(すぐに投稿できるとは言っていない)。
GitHubにでも書いたほうが良いのでは
増田への愛(執)着が勝ったが、外部リンクを数件しか貼れず注釈機能が無く字数制限も厳しい環境に投稿して良いのかという葛藤もある。
「錯綜」の解釈を間違っていて一対多の意味を取り違えた。「分散」かな。 & は予約文字というよりも値が途切れ # はブラウザの機能としてサーバに送信されない。 1d. は {2} ではなく {1} (%enc)
指摘を参考に"エントリページ"の章等を修正。URLと引数については、修正後の内容なら以下のようになることを読取っていただけるかなと。
1a例 https://b.hatena.ne.jp/entry/s/anond.hatelabo.jp/20220521220951
1d例 https://b.hatena.ne.jp/entry?url=https%3A%2F%2Fanond.hatelabo.jp%2F20220521220951
API編も期待してる
善処する(GitHubに投稿する方に気持ちが傾いてるが全く触ったことがない上に、VSCodeとWSLとgitを導入してはてなのウィジェットスクリプト解読環境も整えようなどと考えてるので、いつになるか定かでない)。
「はてなフィルター」というウェブサービスも加えて
はてブについて、情報検索したりクエリを投げたりして調べてまとめてみた。自分用メモとして書いたもので、極少数の人しか興味を持たない内容かと思うが、読んでいただければ幸い。
公式等[1・2(参照したページURLを最後に記載。以下同様)]で詳細を確かめられず素人の憶測で説明した箇所がいくつもあり、簡潔明瞭でも網羅的でもない解説だがご容赦を。
1a. https://b.hatena.ne.jp/hotentry/{1}(引数に"all"を入力した場合、1のエイリアス)
1b. https://b.hatena.ne.jp/ctop/{1}(カテゴリトップ[3]が過去に存在していた場合、1aにリダイレクト)
1c. https://b.hatena.ne.jp/hotentry/{1}/{2}
1d. https://b.hatena.ne.jp/hotentry/{1}/daily(1cにリダイレクト。前々日か前日の分が表示される)
1e. https://b.hatena.ne.jp/hotentry/{1}/{3}(?page={4})(()内のパラメータは省略可。以下同様)
1f. https://b.hatena.ne.jp/hotentry/{1}/{3}(?of={5})
2a. https://b.hatena.ne.jp/hotentry.rss
2b. https://b.hatena.ne.jp/hotentry/{1}.rss("all"を入力した場合、2aのエイリアス)
2c. https://b.hatena.ne.jp/hotentry?mode=rss(2aのエイリアス)
2d. https://feeds.feedburner.com/hatena/b/hotentry(2aのエイリアス)[4]
3. https://b.hatena.ne.jp/entrylist/{1}(/{3}?page={4})(ブクマ登録数の閾値を設定するオプションがあったが、2018年3月に廃止された[5])
4a. https://b.hatena.ne.jp/entrylist.rss
4b. https://b.hatena.ne.jp/entrylist/{1}.rss("all"を入力した場合、4aのエイリアス)
{1} | カテゴリID | 省略するとカテゴリ「総合」のページが表示される |
{2} | エントリ登録日 | "YYYYMMDD"の形式で入力。当該月日の24時から一定時間経過後に利用可能になる。有効な最古の値は20050210 |
{3} | 特集名 | 特集[6]は不定期に改廃されるため、値が有効か注意 |
{4} | ページ番号 | |
{5} | オフセット | 表示結果の先頭が、指定した値だけ後ろにずれる。1ページ分表示可 |
エントリは、8種類あるカテゴリ[7]のどれか1つに自動で区分される。そのアルゴリズムは不定期に更新されているようだ[8]。区分に異議がある場合、ユーザが変更申請することもできる[8・9]。
カテゴリは2013年2月に現在の名称・分類になった[10]。分類が現在と同じ8種類になったのは、2008年11月[11]。
なお、2011年以前のエントリはほぼ全て「暮らし」カテゴリに区分されている[12]。2017年から2019年の間に何らかの障害が起きたためと思われる[13・14・15]。
なお「(ブックマーク)エントリ」という呼称は、一般的用法、はてブに登録されたURLとその付帯情報、エントリページの情報等、多様な意味で使われる。
1a. https://b.hatena.ne.jp/entry/(s/){1}("s/"はセキュアサイトのエントリページURLに付加される[16])
1b. https://b.hatena.ne.jp/entry/{2}(正しく処理された場合、1aにリダイレクト)
1c. https://b.hatena.ne.jp/entry/{3}(1aにリダイレクト)
1d. https://b.hatena.ne.jp/entry?url={2}(1aのエイリアス)
{1} | URL | ブクマされたURL(原則として、パーセントエンコード[19]されたもの)の一部を入力 |
{2} | URL | URL(同上)全体を入力 |
{3} | エントリID | 下記参照 |
はてブに登録されたURLはIDと1対1対応する。IDは、当初は1から始まる連番だったが、2018年12月頃から62bit以上の乱数値になった[20]。
余談だが、かつては番号が桁繰上りするたびにキリ番ゲッターがブクマしに集っていたようだ。理由は不明だが、欠番になったキリ番もある(キリ番と前後のエントリページ参照)。
URLとwebページは1対1対応するとは限らない[21][22]ため、エントリ・ブコメは容易に分散する。
その改善のため2019年2月にはてブの仕様が変更され、一定の規則でエントリが収斂されるようになった[23]。現在エントリページは、複数のエントリと1対多対応していて、対応するどのID・URLを引数にしてもアクセスできる。
参考[1]のエントリページに対応するIDを昇順にし、各IDの確認できる最古のエントリをまとめた。非公開や削除済のブクマがあるせいか、完全な日付昇順ではない。
26 | 2005/2/10 | nabeso | http://b.hatena.ne.jp/help |
252298 | 2005/5/24 | nobody | http://b.hatena.ne.jp/help#tag |
261369 | 2005/5/26 | another | http://b.hatena.ne.jp/help#favorite |
308455 | 2005/6/9 | naoya | http://b.hatena.ne.jp/help?mode=design |
361820 | 2005/6/23 | superartlife | http://b.hatena.ne.jp/help#collection |
368560 | 2005/6/24 | kurimax | http://b.hatena.ne.jp/help?mode=button |
369059 | 2005/6/24 | takeshi-s | http://b.hatena.ne.jp/help?mode=button#jugem |
461306 | 2005/7/18 | kidaglass | http://b.hatena.ne.jp/help?mode=button#livedoor |
540219 | 2005/8/9 | kei-s | http://b.hatena.ne.jp/help?mode=tipjar |
990732 | 2006/1/14 | takef | http://b.hatena.ne.jp/help?mode=tipjar#autodiscovery |
1021385 | 2005/12/27 | tosch0718 | http://b.hatena.ne.jp/help#note_about_title |
1051040 | 2006/1/7 | junky0 | http://b.hatena.ne.jp/help?mode=button#seesaa |
1148729 | 2010/7/8 | b01012109 | http://b.hatena.ne.jp/help/ |
1785475 | 2006/4/20 | eiichiman | http://b.hatena.ne.jp/help?mode=design#module |
2361801 | 2006/7/19 | yamifuu | http://b.hatena.ne.jp/help#keybind |
4670135055805666274 | 2020/1/7 | aoyamayuki | https://b.hatena.ne.jp/help/ |
以下に該当するIDやURLを引数として入力すると、エントリの一部または全ての情報の取得に失敗する
{1} | ユーザID | |
{2} | ブクマ日 | "YYYYMMDD"の形式で、当該ユーザがブクマした日付を入力 |
{3} | エントリID | 当該ユーザがブクマしたURLのIDを入力 |
{4} | エントリID | エントリページに対応するどのIDでも入力可 |
はてブの全エントリから検索可能[29]。ただし単語の区切の判定が完璧でないため、連語や複合語等が関わると上手く動かない場合がある(例えば、「更年」で検索したら「更年期障害で欠勤、認められず」というタイトルがヒットしなかった)。
1a. https://b.hatena.ne.jp/search/{1}?q={2}(&sort={3}&users={4}&safe={5}&date_begin={6}&date_end={7}&page={8}&mode={9})
1b. https://b.hatena.ne.jp/t/{2}(1aにリダイレクト)
{1} | 検索範囲 | "tag""title""text"のいずれかを入力 |
{2} | 検索文字列 | ブクマに付帯するタグ・ページタイトル・ページ本文中のいずれかで、指定した文字列を検索する。複数の文字列を"%20""|""-"で連結すると、AND・OR・NOT検索できる[30]。"site:{URL}"の形式で入力すると、URL絞込検索できる |
{3} | 表示順 | "popular"を指定すると、結果がブックマーク登録数降順で表示。デフォルトは新着順 |
{4} | ブクマ件数 | 指定件数以上のエントリで絞込検索する。デフォルト値は3 |
{5} | セーフサーチの有無 | "off"を指定できる。デフォルトはオン |
{6} | 検索期間の始め | "YYYY-MM-DD"形式で指定した日付以降のエントリで、絞込検索 |
{7} | 検索期間の終り | "YYYY-MM-DD"形式で指定した日付以前のエントリで、絞込検索 |
{8} | ページ番号 | |
{9} | "rss"を指定できる | |
{10} | URL | 指定URLで絞込検索 |
{11} | 表示順 | "count""hot"を指定すると登録数降順、"eid"で新着順で表示。デフォルトは、ブクマ3件以上のエントリのみ新着順 |
1a. https://b.hatena.ne.jp/{1}/(?page={2})
1b. https://b.hatena.ne.jp/{1}/?tag={3}(&tag={3}&page={2})
1c. https://b.hatena.ne.jp/{1}/{3}(/{3})(1bのエイリアス)
1d. https://b.hatena.ne.jp/{1}/{4}
1e. https://b.hatena.ne.jp/{1}/?url={5}(&page={2})
1f. https://b.hatena.ne.jp/{1}/bookmark(1aのエイリアス)
2a. https://b.hatena.ne.jp/{1}/bookmark.rss(?page={2})
2b. https://b.hatena.ne.jp/{1}/bookmark.rss?tag={3}(&tag={3}&page={2})
2c. https://b.hatena.ne.jp/{1}/bookmark.rss?date={4}
2d. https://b.hatena.ne.jp/{1}/bookmark.rss?url={5}(&page={2})
2e. https://b.hatena.ne.jp/{1}/rss(2aにリダイレクト)
3. https://b.hatena.ne.jp/{1}/search.data(?limit={6}&offset={7}) [31]
{1} | ユーザID | |
{2} | ページ番号 | |
{3} | タグ | 指定タグで絞込検索。2件以上指定するとAND検索できる |
{4} | ブクマ日 | "YYYYMMDD"形式で指定した日付で絞込検索 |
{5} | URL | 指定URLで絞込検索。部分一致検索可能だが、URIスキームから入力しないと無効 |
{6} | 最大取得件数 | デフォルト値は全件 |
{7} | オフセット | 表示結果の先頭が、指定した値だけ後ろにずれる |
前節とほぼ同様だが、利用可能なオプションが多い[32・33]。
余談だが、カラースターの価値は緑5円・赤12円・青110円・紫890円程度のようだ[34]。
1 | ヘルプトップ - はてなブックマークヘルプ | https://b.hatena.ne.jp/help/ | 4670135055805666274 |
2 | はてブAPIでwebサービスを作りたい全ての人に向けて書きました | https://syncer.jp/hatebu-api-matome | 264997023 |
3 | カテゴリトップ「テクノロジー」を新設し、グローバルナビゲーションの挙動を変更しました - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2015/11/05/151221 | 4667408542014962466 |
4 | はてブのホットエントリーのRSS一覧 - まんとるぽっと | https://www.mantol.net/entry/20120601/1338517941 | 4699737458651148386 |
5 | 【追記あり】トップページやカテゴリページなどのメディア面をリニューアルしました - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2018/03/22/161110 | 4667408571006016450 |
6 | 編集とユーザー活動とエンジニアリングを融合した「特集機能」を始めます - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2015/08/17/150654 | 4667408546846804962 |
7 | [FAQ]はてなブックマークの「総合」カテゴリーと「一般」カテゴリーの違いはどこにある? | https://anond.hatelabo.jp/20200108201212 | |
8 | 【自由研究】はてなブックマークにおける自動カテゴリ分けの傾向と所感 - AQM | https://aqm.hatenablog.jp/entry/2019/08/06/180100 | 4672608930549728738 |
9 | フィードバックフォームおよびカテゴリ変更依頼フォーム設置のお知らせ - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2018/12/11/163453 | 4667408557584232770 |
10 | 新しいトップページの一覧性を高めました - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2013/02/06/000000 | |
11 | 2008-11-07 - はてなブックマーク開発ブログ | https://bookmark.hatenastaff.com/entry/2008/11/07/000000 | |
12 | はてなブックマーク - 人気エントリー - 総合 - 2011年12月5日 | https://b.hatena.ne.jp/hotentry/all/20111205 | |
13 | はてなブックマーク - 人気エントリー - 2008年11月1日 | https://web.archive.org/web/20170815132626/http://b.hatena.ne.jp/hotentry/20081101 |
①
一部サイトは文字制限でいつものが使えないのでその場で適当に入れて再ログインのたびに再発行
②
同じパスワードの使いまわしがだめっていうからいつもの+末尾にサービス名
masuda_no_password+hatena
masuda_no_password+google
みたいな感じ
③
平文保存してるサービスの多さを知って②のパターンだと使いまわし部分が簡単にわかって無意味と気づく
getPassword()
サービスやアカウントごとには変えておきたい感もあったので引数を使うことにした
getPassword("hatena.masuda3")
getPassword("yahoo.masuda1")
④
平文保存してたところでまずみないだろうと気づく
それぞれ別パスワードにしたいけど覚えたくないしパスワードマネージャーは嫌い
単純にやると同じことやる人がいそうなので、いつものキーワード+ログインIDを初期値として誕生日数分繰り返しハッシュ値を求めることにした
使ってる文字種別や文字数で文句言われたくないので、ハッシュ値に Aa1_ をプレフィックスにつけて前から要求される最大文字数分切り出したものをパスワードにした
Aa1_295ae0f759fe6f348346d4ba0484
パソコンがあればログインIDといつものキーワードだけで求められるがパソコンがないところでログイン出来ないことに気づく
「嘘」が存在するには対になる「真実」が存在しないといけない。まずこれが無い。
人間が物事の一面を捉えて、それっぽいのが「真実」、それっぽくないのを「嘘」という箱に分けてるに過ぎない。
例えば「燃えるゴミ」「燃えないゴミ」という概念は有用だが、モノに付いている属性ではない。自治体の捉え方次第だ。
「嘘」「真実」に関しては自分に有利なものを真実としがちで、毎週出す20Lのゴミ袋より信頼も価値もない概念だ。
「ピンクのユニコーン」のように、存在を認めてもいいが認める意味がない代物だ。「無い」といえる。
「日付」は無い。太陽と地球の距離と角度が色々変わって元通りになる時間の流れを「1年」と呼ぶ。それを365分割して約365個の日付とかいう箱に入れてる。(極以外の)空の明暗1セットを1日と呼ぶが、365回繰り返したのを1年とするとズレるので、4年に1回補正かけてる。意味ない。
だいたい、地球の自転速度が2倍になったら730日必要だろ。他の暦でも引数として自転公転速度を受け取れる動的なものでないと「ものさし」にすらならない。
人間が時の流れに何も作用できないから分割して認識してどうにかした気になってるだけ。価値なく、存在しないといえる。
もちろん存在を認めてやることもできるが「空飛ぶレインボー帝国」くらいトッピだ。
カレンダーなんてのは「空飛ぶレインボー帝国のピンクユニコーンのエサ、レインボーピンク人参の在庫管理表」だ。あってもいいが、話題にする意味がない。
日付は365個のジョークだ。1/1から12/31まで爆笑必至の間抜け日付だ。とくに4/1は一番だ。皆も努々嘘なんかつかないようにな。ただでさえ腹が痛いんだ。
そしてググる。
上位あたりのサイトにいくと、もう必ずと言っていいほど
1.VLOOKUP とは何か
5.便利な使い方
6.まとめ
みたいなレジュメがでてきてクソ鬱陶しい。
こちとらさっさと答えが知りたいんじゃ。
「=VLOOKUP(検索値, 範囲, 列番号, 検索の型)」が出てくりゃそれでいいんじゃ。
「VLOOKUPとは、「Vertical」 (垂直) を意味する V と「LOOKUP」 (探す) の略で…」とか知ったこっちゃないんじゃ。
オマケにスクロール中にはバカデカい広告がうじゃうじゃ出てくるし。
なんか最近、何でもこうだよな。
だんだん使えなくなってきてる感じかする。
言語によるけど
関数の引数は原則レジスタに入れて渡すことになってて、でも計算結果はほっといても必ず一度レジスタに入るわけだから、ほとんどのケースでは変わらない
forの条件判定に計算式を入れる場合は念のため変数に入れておいた方が安全
単純な式だったら最適化されるから変わらないと思うけど、コンパイラに「forの中身の進行に応じて条件式の結果が変わるかもしれない」と判断されると最適化の対象にならず、ループごとに計算し直される可能性がある
特に for ( i=0; getNanika(i) < 100; i++) みたいに条件の中に関数が入ってたら100%毎回関数が実行されるので注意