はてブの API の日付指定によるフィード取得で全てを取得できるようにして欲しい
まずはFTTHさんの記事を見習って ID コール。
はてなアイデアにも投稿済み。
本題。
はてなブックマークフィード仕様 - クエリパラメータによるフィードの絞り込み機能
上記の仕様によると、特定ユーザのブックマーク情報の Atom フィードをクエリパラメータによって絞り込んで取得ができるようになっていますが、該当するブクマが 20 件以上ある場合でも 20 件までしか取得できないです。
絞り込まないのならページング機能を使って取得できるのですが、絞り込んだ結果にはページング機能がないので絞り込んだら 20 件しか取得できないということになっています。
なので、絞り込んだ結果を 20 件以上取得できるようにして欲しい。もっと言うと、絞り込んだ結果にページング機能を付けって感じなのをあればそれでいいんじゃないのかなとかそんな感じ。ぶっちゃけ、タグとか日付で絞り込んでも 20 件しか取得できないんじゃ「何に使うの?」って感じです。
やろうと思えば普通の最新のから取得するやつのページング機能を使って目的の日付のエントリ全部取得はできるのだけど、それだと無駄にはてブにアクセスして無駄な負荷がかかっちゃってよくないと思うのですよね。
以下、このような機能を希望する動機について。
まずは、はてブの人気エントリ・新着エントリの変化が発端。人気エントリはユーザが増えたことによる大衆化で自分とは合わなくなってきたこと。あと、新着エントリはスパムの温床になっていること(特におもしろカテゴリの2chまとめ系が酷い)。スパムに関しては、最初の数ブクマのユーザを調べると総ブクマ数が 100 にも満たないユーザである事が非常に多い。それも数日おきにブクマして目立たないようにしている場合も多い。同時にそういうエントリはプライベートブクマがついている場合が非常に多い。多いパターンはプライベートブクマが 1 〜 2 ブクマで総ブクマ数が 100 にも満たないユーザが 1 〜 2 ブクマしている場合多い。そんで、その記事の最初の数ユーザを超えた後にブクマしているユーザを調べると、そういうユーザがまるで居ないって状況。こんなん明らかにスパムでしょ。ほかのサイトで例えば新聞社とかのブクマ傾向とかと見比べても明らかにおかしい訳なのよね。まあ、これをスパムって断定するのは難しいと思うのだけど、そんな重要性が塵にも満たないユーザを参照した新着エントリとか役に立たない訳で。
そんで、はてなブックマークでは API が公開されてるからそれを利用して自分なりに村はてブとかBL Hatena Bookmarkとかいろいろやってるのだけど、その API に不備があると困るって訳なんです。
Donca というユーザのブックマークについての調査
Donca というユーザのブックマークについて調べました。動機は「このbotうぜえ。どうにかして規約違反の証拠ねえかな」です。
調査対象のブックマークは 2011 年 1 月 1 日〜 9 月 27 日の270日間のブックマークである。
投稿間隔。
ブクマしてから次のブクマまでの時間
投稿間隔範囲 | 数 | 割合 |
---|---|---|
0 分 〜 5 分 | 35430 | 70.9% |
5 分 〜 30 分 | 10863 | 21.7% |
30 分 〜 1 時間 | 2981 | 6.0% |
1 時間 〜 3 時間 | 629 | 1.3% |
3 時間 〜 6 時間 | 66 | 0.1% |
6 時間 〜 12 時間 | 6 | 0.0% |
12 時間 〜 24 時間 | 0 | 0.0% |
見ての通り、7 割が 5 分以内に投稿、9 割以上が 30 分以内でのブクマ。また、6 時間以上間隔が開くことはまれで、12 時間以上間隔が開くことは無かった。これにより bot で投稿しているのは確実であると言える。
月間ブクマ数
月 | 数 |
---|---|
1 月 | 2853 |
2 月 | 3510 |
3 月 | 3705 |
4 月 | 5718 |
5 月 | 6952 |
6 月 | 7375 |
7 月 | 6684 |
8 月 | 7161 |
9 月 | 6018 |
見ての通り 4 月から急増している。ここには省略するが週間ブクマ数を調べてみたら 4 月中旬に急増している。
曜日別ブクマ数
曜日 | 日数 | 合計 | 平均 | 簡易グラフ |
---|---|---|---|---|
日 | 39 | 4189 | 107.4 | ★★★★★★★★★★★ |
月 | 39 | 6816 | 174.8 | ★★★★★★★★★★★★★★★★★ |
火 | 39 | 8522 | 218.5 | ★★★★★★★★★★★★★★★★★★★★★★ |
水 | 38 | 8901 | 234.2 | ★★★★★★★★★★★★★★★★★★★★★★★ |
木 | 38 | 8409 | 221.3 | ★★★★★★★★★★★★★★★★★★★★★★ |
金 | 38 | 8057 | 212.0 | ★★★★★★★★★★★★★★★★★★★★★ |
土 | 39 | 5082 | 130.3 | ★★★★★★★★★★★★★ |
平日は日曜日の倍近くのブクマをしている。平日更新するサイトをブクマしている結果だと予想される。
サイト別ブクマ数、月毎のブクマ数
サイトは 1 日1ブクマ以上、つまり 270 件以上のサイトをここに出します。
サイト | 全件数 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 |
---|---|---|---|---|---|---|---|---|---|---|
www.applelinkage.com | 4090 | 104 | 178 | 188 | 423 | 441 | 697 | 673 | 691 | 695 |
gs.inside-games.jp | 2741 | 69 | 106 | 95 | 309 | 408 | 506 | 428 | 487 | 333 |
www.lifehacker.jp | 2211 | 99 | 91 | 152 | 232 | 266 | 365 | 337 | 380 | 289 |
taisyo.seesaa.net | 2166 | 60 | 156 | 137 | 247 | 300 | 362 | 310 | 304 | 290 |
jp.techcrunch.com | 1608 | 77 | 65 | 112 | 191 | 253 | 250 | 236 | 241 | 183 |
instagr.am | 1518 | 62 | 33 | 131 | 171 | 354 | 272 | 260 | 194 | 41 |
vocaloid.blog120.fc2.com | 1513 | 83 | 90 | 99 | 162 | 188 | 214 | 204 | 235 | 238 |
blog.livedoor.jp/amd646464 | 1353 | 53 | 66 | 47 | 148 | 226 | 180 | 213 | 242 | 178 |
www.socialnetworking.jp | 1262 | 51 | 63 | 51 | 155 | 169 | 237 | 155 | 212 | 169 |
www.i-mezzo.net | 1250 | 27 | 65 | 60 | 145 | 185 | 190 | 175 | 190 | 213 |
サイト | 全件数 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 |
japanese.engadget.com | 1124 | 70 | 67 | 55 | 137 | 182 | 164 | 130 | 170 | 149 |
www.nationalgeographic.co.jp | 950 | 23 | 41 | 43 | 117 | 152 | 165 | 123 | 157 | 129 |
foursquare.com | 818 | 67 | 71 | 55 | 121 | 68 | 59 | 89 | 179 | 109 |
ipodtouchlab.com | 699 | 31 | 25 | 19 | 89 | 115 | 105 | 104 | 105 | 106 |
blog.livedoor.jp/applebrothers | 671 | 27 | 39 | 40 | 129 | 154 | 119 | 101 | 21 | 41 |
northwood.blog60.fc2.com | 566 | 14 | 32 | 23 | 72 | 102 | 76 | 77 | 81 | 89 |
www.gizmodo.jp | 524 | 105 | 139 | 260 | 20 | 0 | 0 | 0 | 0 | 0 |
blog.livedoor.jp/manamerit | 524 | 42 | 27 | 30 | 61 | 73 | 79 | 75 | 70 | 67 |
kuracyan.net | 451 | 23 | 30 | 31 | 70 | 75 | 65 | 62 | 50 | 45 |
www.appbank.net | 429 | 165 | 137 | 127 | 0 | 0 | 0 | 0 | 0 | 0 |
サイト | 全件数 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 |
digimaga.net | 425 | 22 | 16 | 27 | 117 | 60 | 27 | 78 | 49 | 29 |
so-mo.net | 389 | 8 | 13 | 11 | 23 | 30 | 72 | 76 | 98 | 58 |
www.jp.sonystyle.com | 383 | 20 | 34 | 16 | 0 | 54 | 61 | 65 | 79 | 54 |
slodive.com | 382 | 3 | 6 | 12 | 32 | 81 | 58 | 67 | 65 | 58 |
www1.jp.sonystyle.com | 382 | 30 | 65 | 13 | 0 | 14 | 54 | 48 | 74 | 84 |
kjx130.blog19.fc2.com | 370 | 9 | 18 | 21 | 44 | 62 | 56 | 59 | 56 | 45 |
gigazine.net | 369 | 86 | 123 | 150 | 10 | 0 | 0 | 0 | 0 | 0 |
techwave.jp | 366 | 10 | 25 | 13 | 47 | 62 | 64 | 47 | 51 | 47 |
ma2mars.org | 339 | 13 | 24 | 11 | 18 | 30 | 56 | 78 | 59 | 50 |
shimajiro.sakura.ne.jp | 335 | 31 | 21 | 21 | 58 | 75 | 66 | 56 | 7 | 0 |
サイト | 全件数 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 |
wiredvision.jp | 334 | 24 | 30 | 28 | 82 | 136 | 34 | 0 | 0 | 0 |
rdp.blog52.fc2.com | 330 | 22 | 27 | 28 | 31 | 31 | 43 | 47 | 44 | 57 |
juggly.cn | 309 | 88 | 114 | 91 | 16 | 0 | 0 | 0 | 0 | 0 |
slashdot.jp | 292 | 91 | 72 | 129 | 0 | 0 | 0 | 0 | 0 | 0 |
veadardiary.blog29.fc2.com | 283 | 12 | 8 | 13 | 34 | 30 | 40 | 50 | 55 | 41 |
newsroom.intel.com | 282 | 31 | 20 | 21 | 40 | 35 | 35 | 28 | 28 | 44 |
japan.digitaldj-network.com | 270 | 21 | 33 | 11 | 28 | 49 | 36 | 12 | 52 | 28 |
全体的に 4 月からブクマ数が大幅に増えていることから、4 月からブクマ数が急増したのは bot の性能を変えたからだと思われる。この変更後の件数から、各サイトのほぼ全てのエントリをブクマしていると考えられる。
また、ここに載っているサイトだけでなく 3 月末〜4月頭あたりでブクマしなくなったサイトがいくつか見られ、bot が巡回するサイトもちょくちょくと変更している模様。
件数の一番多い www.applelinkage.com のブクマに関して考察
一番多くブクマしている www.applelinkage.com について、APPLE LINKAGE | ARCHIVESにある 2011 年 8 月の記事件数は 438 件であった。それに対し8月のブクマ数は 691 件であった。ブックマークエントリ内容について調べたところ、どうもトップページの記事と ACHIVES の記事の両方にブクマをしており、いくつかの漏れがあることから記事 438 件に対し約 1.5 倍のブクマになっている。
また、ここのトップページの各記事は新着何件かを表示するようになっているので、トップページの各記事へブックマークをしても 数時間〜2日程度で無意味なものになってしまう。これにより、「とりあえずブクマしておいて後で何かする」という目的には利用するのが非常に難しいというか実質できないであろう。
まとめ
結論
Donca というユーザは bot による自動投稿で特定サイトの記事を事前に見ることなく、また後で見る目的でもなくブックマークしていると考えられる。この件がはてな利用規約 - はてなの第 6 条の6-3の「広告、宣伝および検索サイト最適化を目的としてブックマークに登録する行為」に該当するかどうかはよくわかんなーい。
「きれいなはてブ」こと BL Hatena Bookmark(ブラックリスト除外機能付きはてブ新着・人気)を改良した。
「きれいなはてブ」の元ネタはこちら → Twitter. It's what's happening.
BL Hatena Bookmark はこちら → http://childs.squares.net/blhatebu/
バージョンを上げて 1.0.3 → 1.1.0 になりました。
更新内容
- ブラックリストを分離して設定で選択できるようにした。
ブラックリストを 2chまとめブログ系、エロ系、スパム疑惑系、糞ネットメディア系に分離しました。さらにユーザが設定でそれぞれを選択できるようにしました。やろうと思えばブラックリスト無しも可能です。ブラックリストのジャンル追加等は要望があったらまあ良さそうなのが有ればやりたいっすね。
あと、ゆくゆくは(例えばブラックリストの URL を指定するとかで)ユーザ個別のブラックリストを指定したいなあとか思ってます。
- ブラックリスト適合したものを削除ではなく取消線で表示できるようにした。
見た目のインパクト狙い*1で、ブラックリストに適合したのを削除しないで取消線で表示できるようにしました。設定から選んで下さい。どの程度削除されているのか一目瞭然だと思います。とくにおもしろカテゴリの2chまとめブログ系の占有具合は凄いですね。
- エントリが被ってしまう事があった不具合を修正
前のバージョンでは RSS から取得したエントリを保存する処理が結構適当にやってまして、その辺を一から作り直したのでましたので、まあ今回にのはそういった変な動きは無くなったと思います。
- 他色々(一から作り直した感じなので)
技術的な話も含めて。前のを部分的にコピーしたものの、基本的にはクラス設計から一から作り直した感じになってます。一番違う点は、以前は RSS から取得した時にブラックリスト適合処理をして削除した結果をキャッシュしていたのを、RSS から取得したのは全部キャッシュしていて、表示するときにブラックリスト適合処理をするようにした。ブラックリストがどんなのなのかはアクセスする時にしか判らないので、そうなってしまうのは必然。
あと、これは前からだけど、アクセスがあったときに前回アクセスから(新着なら)10分後以降なら RSS を読みに行く作りになっているんですが、前回アクセスから時間が空いてしまうと、その間の新着が取れないので、連続性が失われてしまう問題がありまして、これは定期的なアクセスが有ればいい訳で*2、これを広めて皆がアクセスするようにして欲しいのでこれを広めて欲しいっちゃ欲しいのですてそのへんよろしく尾根ギアしたい。まあ軽く対策はしていますが。
- 細かいの
- 内部的な話(今後の拡張性を考えて作ってある)
参考
はてブ新着・人気エントリからブラックリストに載ってるのを除外して表示するのを作った
名前は BL Hatena Bookmark
http://childs.squares.net/blhatebu/
- なにこれ?
端的に言うと 簡易はてブ + ブラックリスト除外機能 + α
- なんで作ったの?
最近はてブ新着・人気エントリが 2ch まとめとかライフハック系が(スパム行為やってるっぽいし)ウザかったから。簡易はてブも javascript を使ったボタンになって自分的には嫌だったし自分で作るかなと。
- ブラックリストには何が載ってるの?
ページからリンク貼ってるのでそれを見て見て。ベースとして、はてなブックマークの現状 - Life like a clownにあった 2ch まとめブログ、エロブログ、それ以外で自分で追加した 2ch まとめブログ。それにスパム(らしき)行為が確認(独断)されたサイト。今後も2ch まとめブログ・エロブログは無条件で、ライフハック系ブログに多いスパム臭いのはあからさまなのは入れるし、怪しいのも適当に入れるかも。
- ブラックリストに載っているのに表示されている
ブラックリスト更新直後は残ってしまうの。改善予定っちゃ改善予定。
- あのサイトが載ってない
2ch まとめブログなら漏れてるので教えてくれたら入れる。スパム行為やってるのは証拠がいくつかあれば。
- あのサイトはスパムやってないのに載ってる
俺がそう思うんならそうなんだよ、俺ん中ではな(訳:俺が怪しいと思ってるし、特に良い記事でも書くわけでもないから除外してるわ)
- + αって?
増田のエントリは(だいたいタイトルとふいんき(何故か変換できない)で判るのだけど)、タイトルに増田と追加するようにした。
- 他には?
こと、虚構新聞社様におかれましてはその素晴らしい発想力・取材力・編集力により、無知蒙昧なる愚衆の皆様への情報の伝達・啓蒙をなされており誠に有意義であると感じておりながら、その見出し文章に虚構新聞社様の名前を入れておらず、これにより愚鈍な有象無象どもはその素晴らしき記事を認識することができず、これは日本全体の多大なる損失ととらえ、この問題を解決する一助として見出しにその虚構新聞社様の御名前を入れる機能を取り入れております。*1
- RSS 出力しないの?
要望があるならするかもしれない。
ユーザごとのブラックリストは今後の機能追加で入れたい機能ではあるが、元々プログラマとしてネット系ではない*2のでその辺の技術力が(あとモチベーションも)低く、またセキュリティの知識も乏しい。マンパワーも無いし、サーバーも適当に選んだレンタルサーバなのでサーバパワーも微妙。という状況で実現する良い方法が思いついていないので、もし良い実装方法があるなら教えて欲しい。
- デザインが駄目
CSS も外部で指定できるようにするのはできるが、セキュリティがよくわからん。
- 他不満が
なら自分で作れ。ほれ作れ。
- ソースが欲しい
まだまだ発展途上すぎるので公開はしないが、気が向いたらするかも。しないかも。ほしければ俺になんかすればー。
- まとめ
とりあえず作ってみて思ったのは 2ch まとめブログの浸食具合はかなり来ている。とくにおもしろカテゴリは実質的に 2ch まとめカテゴリでしょ。はてな的にはこれで良いんでしょうかね?この辺はどうにかしないと客は離れるかも。まあ他の多くの客をとりこめるのかもしれないのではてな的にはOKなのかも。けどやっぱりうざい。これのお陰で今後は積極的に見たい時以外は見ずに済みそう。
あとスパム行為の多さ。もうね、ライフハック系とスマホ系のブログは超あからさまなのから、微妙なのとか、マジでマジで多すぎ。2ch まとめブログと同等にこれらも問題。正直これをつくらなかったらはてブ新着・人気は自分にとってほぼ無価値になってしまってたかもしれんよ。
- 技術的な話
今は RSS で取得したのをブラックリスト適応したのをキャッシュしているのだけど、ゆくゆくは RSS で取得したのをそのままキャッシュしておきたい。しかしこれだと、表示する度ブラックリストの適応をするので今の 1 行ごとに正規表現オブジェクトを作って全部チェックしてるのはキャッシュが多くなればなるほど遅くなるのでその改善は必要。ユーザ個別ブラックリストを追加するならまずはそこからだなと。あとはマジでどうやってユーザ個別にブラックリストを指定するかなんだけど、マジで良いアイデアが無いのがなあ。少人数なら自分が手作業でやるんだけど。
「起業して安定した収入を得る!」まずはそのふざけた幻想をぶち殺す!!
大学を辞め、起業するために動き始めます - serizawawawaの日記
突っ込むべき所は山ほどあるが、ポイントを絞って突っ込む。
安定して収入を得るため、雇われるより起業が良いと考えました
言いたいことは判るが、大前提が必要。それは「会社の運営が上手くいっている」のが大前提。起業して 1 年で半分以上は潰れると言われている訳で、この時点で良く見積もっても「安定した収入」を得る可能性は半分。そして潰れた場合は莫大な借金を抱えるわけで、普通に考えてもギャンブルですよギャンブル。起業して数年経って残ってる会社なんて 1 割にも満たないんじゃないですかね。その優秀な少数派になる自信があるのかと。周りは大学生活を余裕でこなしているのに、自分は大学生活で手一杯の人間が。
んで、仮に運営が上手くいってるとしてもだ、実は経営者の金と会社の金って境界が曖昧なのよね。まあこれは、私物を会社の経費で落とせると思うかもしれないし、実際確かにそういうのはあるけど、逆に会社が危なくなったり会社の都合次第で自分の金を差し出す必要があるってこと。所謂持ち出しってやつね。自分は今は会社の経営者側の人間で以前はサラリーマンやってたのだけど、その時に貯めた貯金があったけど、会社の都合で百万以上使わないといけないことにり百万以上出した事があった訳で、この辺は実体験としてそう強く思ってる。
だから「安定した収入」っても経営者の持ってる金って半分は会社の金な訳で、それって当人が望むものではないんじゃないかと思う。
毎日授業と宿題と家事で手一杯で、人間が1日に集中して作業できる時間や量を越えていました。
当人は相当傷つくと思うけど、相当に能力が低い。大学生活 + 一人暮らしで手一杯なら数倍忙しい社会人なんて到底無理でしょうし、ましてや起業して経営者になったら休日なんて実質的に無いようなもんで睡眠時間すら惜しいような状況になるだろうに、到底あり得ないですね。大学生活が社会人に比べてどんだけヌルいかは大卒の人に聞けば判るでしょう。
どんなものを作りたいかを考えるのは好きですが、今の僕はそれを作れない。IT系で製品を作りたいのですが、そのためのプログラミングやウェブデザインの技術を僕は持っていない。
独学して作ろうとも考えましたが、全てを僕1人でこなすのは難しそうだし、効率も落ちそうです。仲間がいれば役割分担ができて、楽しいし、自分が何らかの理由で動けなくなった時でも、製品づくりが完全に止まることがない。
極めつけはコレで、自分は無能だと言ってる訳ですよね。その上技術を身につける事すら拒否とキタ。悪いのだけど、向上心すら無い人って優秀な人から見れば「仲間」とは思わないんじゃないですか?役割分担とか言ってるけど、本人は何の役割なの?考えるだけ?正直、ここは怒りに近い感情が湧きましたよ。
人を雇うって事は、雇われた人はサラリーマンな訳なんだけど、それって当人が否定した「安定した収入を得られない人」って訳だよね。自分が拒否した立場を他人にやらせようとして受ける人間って居るのかしら。
(ベンチャーとかでない)ある程度長く続いている会社でサラリーマンやってるのが一番安定した収入が得られるでしょ。だって今まで続いてたってことは、以後も続く可能性が高い(少なくとも起業したばかりの会社よりは)って事だし、リストラされたくなければ、その会社でそこそこの結果を出せばいい訳で。
「見習いプログラマが読んだら、すぐにジョブレベルが上がる10冊」が酷いと思った理由とか
http://blog.usagee.co.jp/2010/11/23/level-up-programmer
http://blog.usagee.co.jp/2010/11/27/level-up-programmer-2
上記のエントリを酷いと思ったのでそれの説明をする。
あの批判が多い憂鬱本をあげている点もありますが、個別の本の質とは別にバージョン管理ツールの解説書を 2 冊挙げている点が明らかにおかしいだろと思ったわけ。
バージョン管理ツールなんて環境によって使うものが変わってくるわけで*1、例えば会社で CVS を使っていたら Subversion の本とか git の本を読んだって直接は役に立たないわけですよ。見習い程度の人が会社で使うバージョン管理ツールを選ぶ権限だってないでしょうし、環境に合わない本を読むのは無駄が多いですわ。それなのに
『自分がやってる言語の本ぐらい読むだろうから、割と汎用的なものがいいかな』
とか言ってて、特定のツールに依存した本に汎用性なんてあるの?とか。どこをどう考えれば特定のソフトウェアの解説本が汎用性あるの?とか。
まあそれで、バージョン管理をする必要性とか意義とかを説いていて素晴らしいってのならまだ判るんですよ。それならば普遍的な内容だし。けれどもそれなら 1 冊の本で良いわけで、2 冊もとりあげる意味あるの?と。なので、特定のバージョン管理ツールの解説書を 2 冊もオススメするとかまあ相手の事を何も考えてない単に「自分が役に立った」とかでしか評価してないんだろうとか。
『自分自身が読んでみて、読んでよかったと思える本』というコンセプトで10冊を書いてみました。
多分、これだけを考えた癖にタイトルで「見習いプログラマが読んだら、すぐにジョブレベルが上がる10冊」とか言ってるから駄目なんだろうなと。ちゃんとタイトルを「自分が読んで良かった本 10 冊」とかにするべき。
そうなると初心者に勧める本の紹介は、ちゃんと客観的に何故初心者にお勧めなのか書かないとその人の主観になるので、その個人の信用がそのままオススメ度になるわけで、まあ糞本を薦めてるような奴が勧める本とか推して知るべしとか。
C 言語ポインタ基礎中の基礎の図解
C 言語のポインタについての基礎中の基礎について解説します。*1
ポインタに入る前に、先に通常の変数宣言について解説する必要があるので解説します。
例えば int 型の変数を使いたい場合は以下の用に宣言します。
int x = 10;
この用に記述したとき、下の図のようにメモリ領域に "x" という名前で確保されます。
アドレスが16進表記だったり 4 ずつ増加しているのは特に深い意味はありません。要するにメモリの領域には番号が振ってあるという事がポイントです。
今後、この変数は x という名前で使用できますね。例えば
x = 20;
と、記述した場合、メモリ領域は以下のような感じになります。
コンピュータではメモリにアクセスするにはアドレスを指定する必要があるのですが、そこに "x" という名前を付けて使えるようになるわけです。
ポイント
- 変数を宣言すると、メモリに領域が確保される。
- 以後は変数名でそのメモリ領域にアクセスできる。
ここで重要なのが、メモリを意識することです。変数を箱として考えると序盤は問題無く考えることができますが、 C 言語基本機能の配列、構造体あたりでイメージが食い違ってきます。
ここからはポインタについてです。ここでこの "x" というメモリ領域のアドレス(図でいう 0x1000)を取得する方法があります。それは以下のように記述します。
&x;
"x" に & 記号を前に付けるだけですね。これで変数 x におけるアドレス(図でいう 0x1000)を得ることができます。これは int とはまた違う型なので int の変数に代入はできませんワーニングとなります(個人的にはエラーでもかまわないぐらい危険な行為)。
int y; y = &x; // ワーニングとなる
ポイント
- 変数名の前に & を付けるとその変数(の宣言時に確保したメモリ)のアドレスが取得できる
それで、このアドレスを保存しておく変数も作ることができます。以下のように変数を宣言します。
int * p;
イメージとしては以下の図のようになります。
また、代入もすることもできます。
p = &x;
これのイメージは以下です。
そして、ポインタがあればそれが指し示す先にアクセスすることができます。つまりこの場合は x (と名前を付けたメモリ領域)に p を使ってアクセスすることができます。記述方法はポインタの前に * を付けます。
*p = 30;
この時のイメージは以下のようになります。
以上の解説では全て int 型で説明しましたが、これは全ての型でも応用することが可能で、例えば char や構造体などでも全く同じです。
ポイント
- 宣言時に * を使うことでポインタ型の変数を宣言することができる。
- 当然、その変数にはアドレス値を入れる事ができる
- ポインタ型の変数からそれが指し示す先にアクセスできる
以上がポインタの基礎中の基礎になります。基礎中の基礎なので、「これで何が良いの?」とか「どうやって使うのか?」とか「何が便利になるのか?」といった疑問が出てくると思いますが、それは他の解説書を読んでください。その際にこの基礎の事を念頭に読めば理解しやすくなると思います。
関数ポインタについて。まず、関数ポインタなんて応用中の応用なのでポインタを理解したばかりなら理解する必要ありません。なので、簡単に説明して後で必要になったときにちゃんと勉強すると良いでしょう。
よく使う関数として printf があると思います。使う際はこんな感じで記述すると思います。
printf( "Hello World\n" );
この printf ですが、実は関数名を書くだけで関数のアドレスが取得できるのですね。つまり
printf;
で関数のアドレスを表しているのです。それで、この関数名の後に括弧を付けると関数呼び出しとなるのです。
ここで、この関数のアドレスを保存できる変数 fp があるとした場合、以下のように関数のアドレスを代入することが出来ます。
fp = printf;
printf のアドレスが変数 fp に入っている訳です。それで fp を使って関数呼び出しをすることができます。
fp( "Hello World\n" );
これの他にも以下のような記述も可能です。両方とも同じ事になります。
(*fp)("Hello World\n" );
関数ポインタを使って呼び出しているということを明示するために後者の使い方で呼び出すことが多いようです。この変数 fp ですが、宣言するには色々と難しいです。これ以上は他の解説を見て勉強してください。
最後に。
どうですか?難しいですか?個人的には相当丁寧に解説したつもりですが(俗に言う優しくとか判りやすくではない)、あえて他の事(箱とかショートカットとか)で例えたりしないで出来るだけ「正確に」やってみました。何故そうしたのかというと、他の事で例えるとその例えた事では表現出来ないことをやろうとすると壁にぶつかるからなんですね。
C 言語は高級アセンブラと呼ばれる事があるように、コンピュータの仕組みとは切っても切れない縁にあります。コンピュータを扱う為に C 言語は存在しておりコンピュータの仕組みに直結した設計になっています。なので、「正しく」理解する為には絶対にコンピュータに仕組みの理解は不可欠です。もし、コンピュータの仕組みを理解せずに理解しようとしても、それは必ずどこか違う勉強すればするほど破綻をきたしてしまうでしょう。個人的には上記の説明で頭が爆発する人は、プログラミング(少なくとも C 言語)には向いてないです。坂道発進が出来ないのにマニュアル車を運転するのがダメなように、この程度の事が理解できないなら少なくとも C 言語は止めた方が良いです。他にも良い言語はたくさんありますよ。
※11/9 関数ポインタについて少し修正
※11/10 コンパイルエラー→ワーニングに修正。
※11/13 関数ポインタのところを修正。関数のアドレスが取得できるのを主とするようにした。
*1:ここでは初心者向けにある程度適度にはしょって説明しています。 C 言語仕様的には限定されない(例えばポインタはアドレスに限らない)のは判った上で初心者向けに限定して説明しています