「t-con」を含む日記 RSS

はてなキーワード: t-conとは

2022-08-06

はてブトップくそ重いのは

ページには表示されないのに各ブクマ概要

class="entrylist-contents-description"

が含まれてるから

2022-04-14

(function() {
  const gomi = {};
  $$('span.hatena-star-inner-count').map(x => x.click());
  $$('.js-bookmarks-recent .entry-comment-contents').map(content => {
    const userName = content.getAttribute('data-user-name');
    const comment = content.querySelector('.entry-comment-text')?.textContent;
    const stars = [];
    content.querySelectorAll('a.hatena-star-star').forEach(a => { stars.push(a.href.split('/')[3]); })
    gomi[userName] = { comment, stars };
  });
  copy(Object.entries(gomi).map(x => { return ['', x[0], x[1].comment, x[1].stars.join(','), ''].join(' | ').trim() }).join("\n"));
  })();

2022-01-01

anond:20220101145248

正直動けばいいと思うので、現状でも問題ないと思うけれどちょっとだけ気になった点。

$$使ってる時点で、デベロッパーツール前提なのは分かるけど、 javascriptで動かしたいのか、デベロッパーツールで動かしたいのか、どっちつかずな書き方になっている。

$$('.hatena-star-inner-count').map(a => a.click());
let data = {};
Array.from($$('.entry-comment-contents')).forEach(x => {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x => { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("\n"));

デペロッパツールだけで動くだけでいいなら、3行目のArray.fromがなくても動く。多分、forEachをmapに書き換えても動く。個人的にはforEachに統一したいけど、そこは好みレベル問題だと思う。

$$('.hatena-star-inner-count').map(a => a.click());
let data = {};
$$('.entry-comment-contents').forEach(x => {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x => { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("\n"));

逆に、javascriptで動かしたいなら1行目と3行目はquerySelectorAllに書き換えれる。

document.querySelectorAll('.hatena-star-inner-count').forEach((a)=>{a.click()});
let data = {};
document.querySelectorAll('.entry-comment-contents').forEach(x => {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x => { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("\n"));

これも好みの問題だけど、途中のconst宣言は一回しか使ってないので、宣言せずにそのまんま入れてもいいんじゃないかと思った。

document.querySelectorAll('.hatena-star-inner-count').forEach((a)=>{a.click()});
let data = {};
document.querySelectorAll('.entry-comment-contents').forEach(x => {data[x.querySelector('.entry-comment-username a').href.split('/')[3]] = [x.querySelector('.entry-comment-text').innerText, Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3])];});
console.info(Object.entries(data).map(x => { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("\n"));
|<<

anond:20220101141743

これや!


$$('.hatena-star-inner-count').map(a => a.click());
let data = {};
Array.from($$('.entry-comment-contents')).forEach(x => {const userName = x.querySelector('.entry-comment-username a').href.split('/')[3];const comment = x.querySelector('.entry-comment-text').innerText;const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3]);data[userName] = [comment, stars];});
console.info(Object.entries(data).map(x => { return ['|', `b:id:${x[0]}`, '|', x[1][0], '|', x[1][1].join(','), '|'].join(' '); }).join("\n"));
b:id:yujimi-daifuku-2222 まず表現の自由戦士というのは他称、しか揶揄する目的キャンセルフェミニストポリコレ規制派が投げつけた呼び名なのでねという話を何度すれば良いのだろうか。/ちなみに私はしっかりコメントしてますよ。 xorzx,YoshiCiv,YoshiCiv,YoshiCiv,stand_up1973,donald_love,amane60,ffggmm,plank,technocutzero,InvisibleStar,yorozuyax,oakbow,peppers_white,arket789,Hige2323,hamu_start,hamu_start,hamu_start,hamu_start,hamu_start,heroween,Capricornus,wisboot,revert,tomoP,colonoe,ssssschang,IthacaChasma,stick23rd,the_sun_also_rises,frothmouth,Abox,Abox,Abox,gesyo,poko_pen,chikurou,moegi_yg,wtw2222,takashi1211,fishma,fishma,fishma,armadillo_1005,uturi,oyagee1120,JavaBlack,lone-dog,flowerload,enya_r,pKspDXqDZe,saJittarius,godspeedlove,karbyry,ken530000,juscas,chiguhagu-chan,chiguhagu-chan,sek30,gidosupario,btei,keso361,sakamoto_tarou,norinorisan42,FlemingYamamoto,muz78,yumenoa,yml,knok,zorio,s4h4i3n,arvante,ShionAmasato,takamurasachi,mobile_neko,berusaga11,greenmold,choliro,tonton-jiji,sirobu,etenrak,h5dhn9k
b:id:greenT 毎回思うけどこういう自分は何も動かず他人に動くようけしかける奴、揶揄したいだけで対象問題には何の関心もないんだろうな/違うと言うなら自分がまず動いて見せろ mukudori69,InvisibleStar,princo_matsuri,yorozuyax,oakbow,kazeula,far_niente,Hige2323,heroween,colonoe,oktnzm,ssssschang,IthacaChasma,the_sun_also_rises,h1roto,everybodyelse,frothmouth,mariki24,gesyo,poko_pen,coluli,chikurou,moegi_yg,kirifuu,death6coin,takashi1211,fishma,fishma,fishma,fishma,fishma,nicoyou,armadillo_1005,ribot,nacady,lone-dog,goturu,ken530000,ken530000,chiguhagu-chan,chiguhagu-chan,chiguhagu-chan,robokichi,sek30,sgo2,FlemingYamamoto,herion88,damedom,yumenoa,akiat,monotonus,arvante,takamurasachi,Magicant,mobile_neko,berusaga11,kabochatori,etenrak
b:id:higgsino こういうのウイグル論法って言うらしいよ。サヨク名前つけてくれたか言及やすくなったね Hige2323,colonoe,oktnzm,ssssschang,h1roto,frothmouth,Abox,Abox,Abox,chikurou,by-king,hinodai,moegi_yg,mmuuishikawa,kirifuu,death6coin,takashi1211,fishma,fishma,fishma,fishma,fishma,armadillo_1005,keshimini,ribot,oyagee1120,Tatada,flowerload,stand_up1973,sds-page,saJittarius,godspeedlove,chiguhagu-chan,chiguhagu-chan,chiguhagu-chan,sek30,gidosupario,btei,hazeyoshida,muz78,yumenoa,monotonus,venom,arvante,Barton,tonton-jiji
b:id:colonoe まず「人種差別を含むあらゆる表現の自由を守る」と主張している「表現の自由戦士」を屏風から出して faqua,death6coin,takashi1211,fishma,fishma,fishma,nicoyou,armadillo_1005,keshimini,yutoma233,JavaBlack,kappa9,himakao,enya_r,featherballs2,chiguhagu-chan,chiguhagu-chan,gidosupario,keso361,hazeyoshida,damedom,yml,zorio,monotonus,frothmouth,arvante,buluffel_branche,buluffel_branche,tonton-jiji,sirobu,donald_love,technocutzero
b:id:develtaro所謂リベラルと呼ばれる人たちがその広告に対してなにか行動したというのも聞かないが… Hige2323,tomoP,ssssschang,stick23rd,coherent_sheaf,h1roto,trickart412,frothmouth,gesyo,poko_pen,by-king,takashi1211,fishma,fishma,fishma,fishma,fishma,fishma,fishma,fishma,fishma,fishma,junglejungle,sds-page,saJittarius,godspeedlove,chiguhagu-chan,chiguhagu-chan,gidosupario,FlemingYamamoto,muz78,yumenoa,monotonus,arvante,choliro,tonton-jiji
b:id:kuzudokuzu この手のダンマリ論って印象論なので賛否どちらに加担するのもバカバカしいんだよね。言及しないことが罪なら、人は問題について話し続けない限り罪を免れることは決してない。さあお前らは何について話してない? frothmouth,mmuuishikawa,hobo_king,kirifuu,faqua,death6coin,death6coin,takashi1211,magefee,fncl,flowerload,goturu,juscas,KKElichika,sek30,gidosupario,tacamula,FlemingYamamoto,yumenoa,norinorisan42,arvante,ShionAmasato,kabochatori,h5dhn9k,enmotakenawa777
b:id:dubdisco1966 単純に差別だと思ってないからでしょう。細目の女のモデル仕事するのを差別だと思いませんから。あれが「差別だって前提で話進められてもねぇー。。 stand_up1973,Pinballwiz,hamu_start,hamu_start,hamu_start,hamu_start,hamu_start,BERSERK,frothmouth,gesyo,trickart412,moegi_yg,fishma,nyomonyomo,masa8aurum,preciar,town2town,town2town,godspeedlove,robokichi,arvante,tonton-jiji,Kazero
b:id:poko_pen表現の自由差別は別物なんだけど何で雑に一緒くたにするんだろうか?ブーメランを自らの頭にぶっ刺してるのに気が付いて無さそう kirifuu,cloudliner,JavaBlack,JavaBlack,ss56235,flowerload,fishma,fishma,fishma,frothmouth,chiguhagu-chan,chiguhagu-chan,hazeyoshida,colonoe,monotonus,arvante,greenmold
b:id:zheyang ここでまともな反論が一つもないのが答え。日本でも批判されて中止した広告はいくつもあるのに、騒ぐのはアニメ絵エロときだけ。未だに90年代オタクバッシング被害者のつもりでいる。 PIEZOU,Josui_Do,Josui_Do,Josui_Do,hopeholdsmoon,inkman,white_rose,baronhorse,Zephyrosianus,rci,bogus-simotukare,faifan
b:id:oktnzm外国のしかも独裁国家における表現の自由を守るために声を等しく上げるべきと言ってるの?俺に距離が近い人権をまず守ろうとする態度がなぜ批判されるのか?その人権に対してあまねく擁護者になる義務があるとでも? ssssschang,frothmouth,gesyo,moegi_yg,faqua,takashi1211,fishma,sds-page,FlemingYamamoto,damedom,ko-ya_ithaqua
b:id:vesikukka なんでもかんでもコメントしないよ。なんでもあれにコメントたらこっちにもってなるの?アホ?
b:id:bear_accountネトウヨみたいな事言いだして草
b:id:hazardprofileバカらしい的なブコメをした記憶がある
b:id:rider250 何年も前からここで「白人ナチュラルボーンレイシスト」と書いてる(で在日白人文句つけてきたこともある)ので何らの驚きもなかったからな、皆もコロナ禍のニュースでわかったろ?連中マジでナチュラルなんだ。
b:id:wildhog このモデル広告に使ったら不適切とすることの方がよほど差別だよ。仕事なくなるじゃん。私は好きなモデルを使う自由擁護しま
b:id:tonton-jiji これどっちかというと細目の人に対する差別中国人ベンツ側もしてるように見える。細目=劣っているという自覚がないとできない nanamino,hazardprofile
b:id:CocoA表現の自由戦士揶揄するだけでベンツ広告コメントしない人は何なんだろうね。
b:id:Sakana_Sakana中国政府はあまりきじゃないが、この中国側の主張は正しいと思ったよ
b:id:tzt海外案件でもフェミやリベが抗議ってニュースなら表現の自由戦士はいつもみたいに発狂して暴れてたと思うよ。いつもあいつらそうじゃん。whataboutismとかウソウソw bogus-simotukare,nanamino
b:id:NOV1975中国ベンツ広告ってのを今知ったわ。みんな熱心やね
b:id:nanamino あの広告別にいいと思うんだけどなあ。抗議している側の方が細い目のアジア人女性差別していると思う tonton-jiji,stand_up1973,hazardprofile
b:id:monotonusキチガイは家から出てこないでくれよな
b:id:tettekete37564 この「表現の自由戦士」という言葉を使う人達はなんで差別表現犯罪区別が付かないの?別に表現の自由だと広告に使い続けても良いし差別だと批判し不買するのも自由不満を理由ディーラー襲ったりしたら犯罪
b:id:ayumun3次元守備範囲外に決まっとるやろ
b:id:shenlong表現の自由を進めたいのか禁じたいのかわからない呼称なんでどっちの立場わからん。まあ内輪向けの揶揄ってことよね
b:id:norinorisan42他者勝手蔑称つけて、勝手キャラ付けして、勝手にそのキャラ矛盾してると批判するセルフ藁人形論法のお手本みたいな増田/割とあらゆる党派性の人で見られる印象 colonoe,magefee,ShionAmasato,poko_pen,greenmold,tonton-jiji
b:id:imashそもそもそんなそこら辺で見かけるような広告なのか?
b:id:shinobue679fbea2022年はできるだけこういうのから離れたいんだけど増田特定文言ミュートとかできるんだっけ? cloudliner,donald_love
b:id:findup 全方位に噛みついてたら際限が無いし無理なわけだけど、それはそれとしてエロ萌えしか頭にないって人は多いのかなとは思う。 cloudliner,bogus-simotukare
b:id:hazeyoshida 「まともな反論がない」→それはあなた主観ですよね? tonton-jiji
b:id:laislanopira ??
b:id:chiguhagu-chan なんでこんなことあるごとに自分表現の自由とは何かを理解してないクソバカですって表明演説し出すのこの人たち cloudliner
b:id:agricolaウイグル論法っていうのは、比較的縁遠い問題を持ち出してきて身近な問題への批判を無化する手口だぞ。散々「そんなことより香港思想弾圧が!」とウイグル論法を駆使しといてソレは通らねぇよ(侮蔑 bogus-simotukare
b:id:kangirenドストレートにポリコレ案件なので、表現の自由戦士は黙ってないと思たんだけど? yomota_yomogi,rci,bogus-simotukare
b:id:Zephyrosianus いつものように広告における表現差別的だというのはお気持ちなので撤回する必要はない、と答えればいいのに、その質問自体や使っている言葉を論難するのは倫理的判断を迫られる事自体への忌避があるのかな? agricola,yomota_yomogi,rci
b:id:hdwdgfva よく「萌絵は多様性がない。白人から見たら、あれは白人しか見えないから」ってやつが現れるんだけど、白人からしたら細目・吊り目・京劇みたいなメイク・浅黒じゃなきゃアジア人認識できない。それだけのこと。 donald_love
b:id:town2town なんで細目や吊り目がマイナスイメージって決めつけんのかっていうね。性的か否かで議論するのは分かるけどさ。 frothmouth
b:id:sewerrat あのベンツ広告も当然表現の自由範疇内ですよ。もちろん、顧客の評判が悪いので広告を取り下げるという経営判断をするのも自由。あらゆるケースで同じ基準を用いる事が重要 stand_up1973,frothmouth,fusanosuke_n,trickart412,ShionAmasato
b:id:shaokuz勝手侮蔑的な意味合い込めて雑なレッテルを貼っておいてそのレッテル通りに行動しないと文句付ける人達って何が足りてないんだ?知性? Capricornus,fishma,fishma,fishma,frothmouth,juscas,deamu,ddnation,hazeyoshida,magefee,colonoe,arvante,poko_pen,tonton-jiji
b:id:tameruhakidaフェミがこの件にダンマリなのが酷すぎる」ってしょっちゅう言うくせに、自分が言われるとキレるのね/ネットフェミ叩きは同族嫌悪なのかなって最近思う/基本自分被害者なのよね。 hedgehogx,hedgehogx,hedgehogx,Zephyrosianus,agricola,yomota_yomogi,yomota_yomogi,demakirai,demakirai,mike24,tzt,bogus-simotukare,faifan
b:id:en-en-ra Whataboutismは保守マジョリティ相手を黙らせるのによく使う手だったけど、お互いの手法をパクりあいながら地獄に向かって並走して行くのどうにかならんかな… sds-page,frothmouth,hdwdgfva,fusanosuke_n,ddnation,magefee,donald_love
b:id:Tatada そも表現の自由戦士特に萌えしか擁護しない!」と逆ギレされる我々は、実在被害者存在しないコンテンツなのに攻撃されたから、仕方なく立ち上がったわけであって、そもそも政治性は薄いんだが。 preciar,fishma,frothmouth,colonoe,arvante
b:id:Chitanz そうやって煽ることで逆にその問題の関心を全体的に削ぐ結果になってるんだよね。あ、めんどくさい奴だ関わらないでおこうってさ。自分自分の首を絞めてる事に気がついてない可哀想な人
b:id:kishimoto0050 線引きが難しい問題ですが個人があらゆる社会問題を扱うことは無理だとしても財力や権力を持っているマジョリティの方々が都合の悪い問題を見て見ぬフリすることは責任放棄であり許すべきではないとも思います
b:id:sander表現の自由行使して内容に対して批判が上がるのと、内容すらどうでもよくただ批判したいだけのクレーム混同するのはわざとですか?
b:id:masahiro1977 世の中にある問題すべてに平等に声を上げないと偽善とか言ってたら何もしないでダンマリしてるやつが最強になるので辞めてほしい。 JavaBlack,kappa9,ShionAmasato
b:id:hazel_pluto 「AするならBもしろ論法」は今回は無理がある。中国ベンツ関係が弱すぎる。 hazeyoshida,ShionAmasato,tonton-jiji,donald_love
b:id:kirifuu お前がやるんだよ定期。/ウイグル論法というのか、なるほどー。
b:id:kiyo_hiko普段目につかないはずのものを追い求めていってクチバシを突っ込むのは寧ろ色々規制したい規制戦士の方々だと思うので別におかしな事ではないような。他人にクチバシを突っ込むのは干渉。=規制親和性が高い行動 juscas
b:id:anguilla ?どういうこと
b:id:gesyoアジア人は細い吊り目」はステレオタイプとして広く知られていますが、フェミニストが「女性蔑視」としてクレームを入れる表現は、フェミニスト以外の誰にも共感されてないからです。 contrapunct,contrapunct,contrapunct,contrapunct,contrapunct,fishma,fishma,fishma,frothmouth,hazeyoshida,colonoe,arvante,poko_pen,tonton-jiji,tonton-jiji
b:id:lastline自由表現した結果、表現の自由の下に批判されてるのでは? frothmouth
b:id:spark7はいwhateverism」なんかいいな。どうでもいい。 frothmouth,featherballs2,sds-page
b:id:torabaかに細目女性CM出演の自由は守られるべきだけど、この件は「若くて『かわいい女性広告に起用するのは差別」の逆で「(中国人的に)ブスな女性広告に起用して晒上げにしているので抗議されてる」のに近い。
b:id:lanlanrooooo そこはまぁ、別に行く必要もないのでええんちゃう
b:id:Hagalaz戦士エロ表現さえ守れれば平気で体制側につくからな この話題に限らず表現の自由問題で彼らに期待しちゃいけない
b:id:kingateステロ」が差別ってのが頭クルクルパーだろ、と割と思っているので正直「抗議受けてるベンツは可愛そうだけど、あの広告に疑問はねぇよ」ってのが俺の感想。こんなもんで価値観アップデート(笑)とか。バカかと。 tomoP
b:id:Capricornus そんなことより、明けましておめでとうございます。今年もよろしくお願い致します。A Happy New Yearrr!!!! hinodai,hinodai,hinodai,death6coin,sander,sds-page,juscas,ShionAmasato,greenmold
b:id:yogasa差別を認めろ、擁護しろなんて言ってなくて、差別でないもの規制するなと言っている。ベンツの奴はアジア人差別で、適切に処されるべき poko_pen,death6coin
b:id:az1na8もっとシンプル年末年始からってのが大きいと思ってる faqua
b:id:samu_i 全部に噛み付くのしんどい。
b:id:nnn06ダンマリってのは「広告」じゃなくて「批判」に対してってことだよね。フェミから批判はいももっとうるせーだろって Josui_Do,Josui_Do,Josui_Do,IkaMaru,agricola,hazeyoshida,nanamino
b:id:shoot_c_na コレ、細くてつり目の人は、モデルになる資格はねぇ!って言ってるんだろか?ガイジン東洋人のマネと称して目尻つり上げるのは差別で叩いていいが、生まれ持った顔でしょ?このモデルにそんな業を背負わせるの? hazeyoshida,tonton-jiji
b:id:lejay4405 みんなが世界中広告に目を光らせていると思ってるのかな cartman0,colonoe,frothmouth
b:id:technocutzero表現の自由戦士」を使う連中はバカしかいないのか? そもそも誰もそんなの名乗っちゃいない Hige2323,tomoP,colonoe,gesyo,flatfive,hazeyoshida,arvante,donald_love
b:id:mayumayu_nimolove 増田が思ってるほど馬鹿じゃないんじゃないの?
b:id:brain-ownerコメ『女でもないのに女性表像に執心している』→フェミ男が散々「女でもないのに女性表像に執心している」だろうが。ボンクラフェミはそんな事も都合よく認知を歪ませられるんだな。ダブスタより酷い自己 Hige2323,tomoP,juscas,hazeyoshida,arvante
b:id:syou430工作員がいてもおかしくないから真面目に取り合わないようにしている。現代広告戦略戦争っぽくなってきてるとも思ってて、コンペティターアタックとして競合の広告効果を下げるのはあってもおかしくないよ。 colonoe
b:id:oxamラーメン好きの人を勝手に「炭水化物マニア」と呼んでおいて「お前は炭水化物マニアのくせにチャーハンを食わないのはおかしい」といちゃもんをつけている構図 Hige2323,cartman0,crexist,frothmouth,sds-page,juscas,arvante
b:id:nt46 じゃあベンツ表現の自由を支持するわ。 KKElichika,hazeyoshida
b:id:hedgehogx 表自の男は自分当事者でもないのに口出してくるのが特殊だなって。女でもないのに女性表像に執心している。なんでそんなに女のことが好きなのか demakirai,Q_saku,Josui_Do,Josui_Do,rci
b:id:ko2inte8cu 「よし、ベンツ娘を作ろう」「それ、メルセデス嬢ですわ」 hinodai,hazeyoshida
b:id:Euterpe2 ぼくは表現の自由雀士なので…
b:id:kunitaka 煽るなよ。馬鹿!ただでさえ鬱陶しいのに、更に鬱陶しくなるやろ。
b:id:maninthemiddle批判が起きてるのは表現して良いかどうかのレイヤーではなくターゲットに対する広告として適切かどうか、だよ。履き違えたイチャモン付けない方がいいと思う
b:id:narwhal AするならBもしろ論法使う奴は、世界中飢饉がなくなるまで飯食うな https://b.hatena.ne.jp/entry/367565673/comment/zyzy hamu_start,hamu_start,hamu_start,coherent_sheaf,hinodai,plank,princo_matsuri,Hige2323,cartman0,poko_pen,kappa9,juscas,arvante
b:id:TZK

2021-12-20

anond:20211220145734

もう!増田君はわがままだな!

console.info($$('.entry-comment-contents').map(x => { const userName = x.querySelector('.entry-comment-username a').href.split('/')[3]; const comment = x.querySelector('.entry-comment-text').innerText; console.info(x); const stars = Array.from(x.querySelectorAll('.list-star-container a.hatena-star-star')).map(y => y.href.split('/')[3]); return ['|', `b:id:${userName}`, '|', comment, '|', stars.join(','), '|'].join(' ');  }).join("\n"));


b:id:manamanabaルッキズムというかこのコンビネタの前提にしてる「偏見」に全然共感できなくて何も面白くなかった fusanosuke_n,gesyo
b:id:ykana最初はぎょっとしたけど、あれはオタクだけじゃなくて対極のヤンキーも顔で決めつけられることへの批判と受け取った。「○○顔だろ」に突っ込みが入り双方向にすることで、つり合いが取れた。 gegegepo,wumako
b:id:maguro1111 「これは言っていいラインなんだ」って受け取る素人が多発してまた社会でこういう偏見再生産されそうだな、とは思った cartman0,aquatofana,hatsumoto,IthacaChasma,greipoo,cleome088,vlxst1224,sand_land,point2000,yas-mal,suzuxa,masaff5656,kazutok,ragi256,wa_oga
b:id:esbee 私も正直笑えなかったし、ゆにばーすの男女関係ネタもドキドキした。ただ、同時に偏見がこの世から無くなるというのも有り得ない話で、こういうエンタメを通して都度考えていくことになるんでは?とも思う hanyA,zentarou,topiyama,paperot,point2000,d346prt,ai_gaminglife,Colorful44,tacamula,akihagi
b:id:goldhead 見ていてこういう意見が出てくるだろうとは思った。個人的には、両方とももっと振り切れた見た目じゃなきゃな、とか思った。 zentarou,hara_boon,tapi423,esbee,surume000,vlxst1224,d346prt,gengo_k,misomico,levele,type-100,prq098
b:id:Hayano 真似するといじめに発展しそうではあるが、何でも制限するのもよくない気もする。錦鯉も激しく後頭部を叩きまくっていたが、真似したらいじめに発展しそう。だが、やめろってなると考えてしまう。 casm,hara_boon,trickart412,crexist,oktnzm,point2000,gengo_k,misomico,unasuiyu
b:id:sangping特定個人バカにするのと架空オタク風体の人(非実在オタク)をバカにするのは危害の度合いが全く違うので分けて考えるべき。「嫌い・誤り」と言うのと「やめろ」と言うのの間には大きな落差があるのを意識して。 xKxAxKx,rymshm,hara_boon,Schrd,amourkarin,trickart412,fantascape,masudatarou,misomico,lainof
b:id:casm 「こういう表現は本当にまずいよね」「儲からないよね」という社会合意を目指そう。 ashigaru,cartman0,aquatofana,eringix,mio_wembley,sand_land,deviceone
b:id:ackey1973 ま、錦鯉長谷川が髪フサフサで歯も全部揃ってて渡辺がシュッとしたイケメンオヤジだったらあんなに受けないだろうし、オズワルドの畠中も見た目ちょっと不気味そうな雰囲気出してネタいかしてるよね。 zentarou,Schrd,cartman0,reef,tanahata,prq098
b:id:b-zou3 完全に指示する。顔という本人の生まれ持ったものネタにするのはやめていただきたい。「お前はユダヤ人だ」というのとなにが違うというのか。 cartman0,aquatofana,IthacaChasma,paperot,mshota,lifeisadog
b:id:wkpn "もも"も"ゆにばーす"も見ててモヤる部分があって、純粋に笑いに集中できなかった。たぶん会場にもそういう人がいて、そういうのがあっていまいち点数伸び切らなかったんだろうなと思う。
b:id:interferobserver 俺は好きだけど。こういう偏見ってバカバカしいけど確かにあるわーってなる。でも不快な人もいるんだからテレビでやるネタじゃないよな。
b:id:Nehanウケるってことは大多数が本心では同じことを思っているということ。芸人を責めるのではなく、それを炙り出してくれるありがたい存在だと思うべき。社会に本当に差別心がなければそもそもウケないのだから
b:id:aeka このふたりの、〇〇顔以外のネタを見たことがないもので他のネタはどうなんかなーと思ってたが、それ以外をやるとせめるくんのほうが具合が悪くなるってGYAOの大反省会で言ってた…
b:id:nicoyou まだそんなことやってるんだ。昔からルッキズムに限らず他人をいじり笑うことが不快すぎてお笑いのものを見なくなった
b:id:rci表現自由戦士の人はこれについてはどういう意見なの?
b:id:vndnぼったくりバー割り込みと結び付けられた三代目さんの対応が気になる。三代目何とは言ってないからセーフか?(?)
b:id:shun_shun 本文には書いてるけど、せめる。の見た目だけじゃなくてまもる。の見た目も交互にネタにしてるのに見出しで「ルッキズムオタクバカにする」になるのはきついな。
b:id:levele まあこう言う意見出るだろうなと思った。もう古いって事になっていて自然に淘汰されてるから気にするほどじゃないのでは。
b:id:crarentクリーピーナッツが泣いてたのと同じだな。今の時代バカに見つかるのはリスクしか無い。鳥肌実のようにずっと裏で生活するしかない。
b:id:misomico風刺とするには、2人の見た目が普通だったなと思った。
b:id:rtpcr2 彼らなりの風刺なのかなと考えて観てた。一見相容れない者同士が見た目でいがみ合ってておかしいねっていう、しか典型的な。でもまぁ、こういう意見くるよねとは思いながら。
b:id:nina19 顔だけじゃなく身長デブ、禿、年齢など自分属性で笑いを取るスタイルが好きじゃないんだよな~だからこの人たちのネタ錦鯉の一本目もアインシュタインも好きじゃない。設定で笑わせてくれる人たちが好き
b:id:lifeisadog これで笑えるのが古いなって感想
b:id:hagakurekakugo偏見ではなくギャップ萌えなら良かった。例えばヤンキー顔がボランティアしてるとか、オタク顔がウェイ系で毎日DJしてるとか。だったら「その顔で!?」も許容できる。
b:id:sconbkun あー、価値観アップデート教の人が絶対文句言うだろうなって思った ai_gaminglife,dominion525,casm
b:id:adatom そんなことよりも、最初から最後までズレてる一本槍のやりとりだけだったので、そこから発展した意外な展開が終盤にほしかった/むしろホモも女も自由に笑えた時代こそがこれに関しては正しかたかもね
b:id:vanillayeti 早く日本お笑いも下に見た人を馬鹿にする笑いではなく上を馬鹿にする風刺の方向に動いていけば良いと思うんだけど、客がついてこない可能
b:id:junglejungle表現制限しておけば勝手に世の中が良くなると思ってるここ最近の風潮には反対。オタクがここまで大衆に受け入れられたのは、オタク叩きを規制たからではないので。 donald_love
b:id:oktnzm 嫌だなって思ったら飛ばすなり再生止めるなりしなよ。
b:id:triggerhappysundaymorning ”これが「お前、ホモみたいな顔してんな」だったら大炎上だぞ”←ここがキモオタク差別は未だ「してもいい差別」って世間が思ってんの.マスメディアならどうにかしろっての.
b:id:planariastraw 噺の方では昔から3ボウという事がございましてな…。自分も前からこの手のネタではちっとも笑えないのでテレビ見ない。 doycuesalgoza
b:id:taruhachi 顔っていうだけじゃなくて、髪型服装などのキャラのものも作ってるので、単純にルッキズムとは違う気はした。ネタ面白いと思ったかどうかは別として。
b:id:prophet2047最後に書いてあるたかお笑いでむきになるなっていうのが正解で、お笑い如きでマジになってどうするの。何か文化のように捉えてるアホ多すぎる。ただの娯楽やぞ。
b:id:redpants どちらかというと50歳のかわいそうな感じのおじさんをバシバシ叩いて笑い者にするほうがよくない気がする。個人的にはどっちも面白かったから好きだが casm,cartman0
b:id:y-mat2006 表自オタクさんもこの手の表現規制には理解を示してくれると思うんだけど。
b:id:vlxst1224偏見VS偏見でお互いに罵り合うというところでネタ上での因果応報担保されている……という物語なのだろうが万人が文脈をそう読み取れるかどうかは怪しいよね。ゆにばーすもそう。でも話芸が上手くて笑っちゃった
b:id:zeromoon0ももの凄いところは少なくとも彼らの顔をみんな覚えたということで、M-1舞台で爪あとを残すだけならアリのネタだとは思ったけど、この手の批判は免れないと思った。個人的にゆにばーすのほうがどうかしてた。
b:id:Snailお笑いなんてすべてが実生活で真似しちゃダメな事だらけで、そこを冷ややかに思いつつも笑い飛ばし現実はまともに生きようぜ!っていうもんじゃないの?こういうとこに目くじら立てるのいい加減やめないか junglejungle,takashi_m17,donald_love
b:id:cleome088基本的に「お笑い」って何処か他人を傷つけるものなのでテレビの話芸はテレビ話芸でお笑いはやはり演芸小屋でやるモノだと思うんだよな。
b:id:paperotオタクマイルドヤンキーの両方を馬鹿にしてるからバランス取れてる」どっちもやめる時期に来たって話なので、それはおかしい。50歳がバカやってる、ももういい。
b:id:chamind錦鯉の年齢をネタにした笑いは問題ないの? donald_love,takashi_m17
b:id:rundyh そういえばはてブで誰も傷つかない笑いを称賛していたが普通ブームは過ぎたな casm,donald_love,tomoP,rajgrksalme32f
b:id:greipoo 昨夜たまたまM-1チャンネル合わせたらこ漫才だったけどイライラして別番組に変えた。見た目に対するレッテル貼りのの何が面白いんだろうね
b:id:hyphenkorosiももオタクバカにするだけ、だったら勝ち上がってきてないよ。両方の掛け合いありきだし、オタク側が「せめる。」で、強気なこと言ってるから成立するし。まぁとは言え面白くはなかったよね casm
b:id:usosa ただワードを並べているだけで、配慮している感じが全くないのがなぁ(配慮が感じられればいいのかどうかは知らん)あと初見で、本人たちが本当はどんな人か知らないのも嫌悪感寄与した気がする。 paperot,cartman0
b:id:behuckleberry02ふたりともディスってる割に全然かわいい子供顔で、出順のせいもあってスベってましたね。この上ポリコレで叩くのはかわいそうなので来年に期待してあげてほしい。 donald_love,point2000,dominion525
b:id:x100jpダンレボさんは、いつかのコーンフレークのようにネタとして流せるだろうけど、ダンロップさんは可哀想に思った。
b:id:hatsumoto公共電波オタクという属性ネタにされて怒れるなら、女がゾーニングされないエロがある環境を嫌がる気持ちも少しはわかるのでは? casm
b:id:oysm95jルッキズムうんぬんもそうだけど、単純に大喜利の羅列で展開がないしその大喜利ネット偏見書き込みレベルで弱い。決勝に上がった時点ではぁ?と思った manamanaba
b:id:patagonumステレオタイプ偏見を互いに否定し合うネタからリベラルな印象だったけど違うのか。イジりに耐えられない人にも配慮しなきゃならないから、雅紀さんみたいなボケ人格に由来するツッコミ時代に合ってるのかな esbee,fantascape,semimaru
b:id:akanama 例えばあのネタを“誰も傷つけないネタ”にするとすると、当人が「プリキュア顔って言われるんです」と嘆いて、相方が「そんなことないよな、EXILEも好きだよな」と返す、をお互いやり合う感じになるんだろうか。 donald_love,fantascape,shun_shun
b:id:yzkuma 僕のTLだと(このご時世にルッキズムネタかあ)みたいな空気はあったけど、性格とか行動だってgenetic background規定されるわけだし、将来的には何をも笑ってはいけなくなる懸念はある。杞憂だろうが。
b:id:pero_pero 見たけどオタク馬鹿にしてるとは思ったけど、返す刀でいかつい顔とかウェイ系をバカにしていたのでまんべんなく全員に喧嘩を売ってた感があった。ルッキズム批判するなら満遍なく批判したほうが良い casm,chantaclaus,fusanosuke_n,shun_shun
b:id:sextremelyあるあるじゃなくてストレート偏見からなぁ。オタクへのいじりよりも強面のいじり方の方が雑に感じた。 fusanosuke_n
b:id:aquatofanaゆにばーすネタは「しょせん男は下心を消せない」をきれいにひっくり返して男側が完全に敗北するネタなので笑った。ももはまあその通り微妙錦鯉も同じ路線微妙気持ちよく笑うには、偏見を越えるボケ必要
b:id:meganeya3 俺はエスニックジョーク容認派だが、ある国/地方/集団には特定の傾向が強い、というネタあるあるから差別までかなり幅が広いのは確か。"一方ロシア鉛筆""大阪人を指鉄砲すると撃たれたふりする"等アウトにする?
b:id:iwiwtwy 何をやっても良い世界を望むんじゃないの?サンドウィッチマン準優勝からもう見てないからしらんけど。 casm
b:id:ykktie 顔というよりファッション髪型雰囲気の話だからオタクでも垢抜けた見た目にはできる。最近ではアニメが大流行だしイキリオタクも増えて、アニメあんまり見ないこっちは肩身狭い。オタク蔑視なんてもうない。
b:id:Gelsyぺこぱが2年前に評価されたのと逆のことをやればこう言われるのはわかってたはず。準決勝までにしっかり落としておくのが制作側の責任だと思う。 zentarou,maname,tomoP
b:id:maguro1111 「これは言っていいラインなんだ」って受け取る素人が多発してまた社会でこういう偏見再生産されそうだな、とは思った cartman0,aquatofana,hatsumoto,IthacaChasma,greipoo,cleome088,vlxst1224,sand_land,point2000,yas-mal,suzuxa,masaff5656,kazutok,ragi256,wa_oga
b:id:rhaps0dy髪型眉毛整えたり、ダイエットしたりとかできる努力もしない人が何言ってるんだろ
b:id:hrbmszももシステム漫才批判芸人から若手だから吉本からしゃあないでは済まなくなってきてる。ルッキズムネタが気になる人を空気読めでつっぱねてはならない。面白いか劇場ではやっていけるが hanyA
b:id:esbee 私も正直笑えなかったし、ゆにばーすの男女関係ネタもドキドキした。ただ、同時に偏見がこの世から無くなるというのも有り得ない話で、こういうエンタメを通して都度考えていくことになるんでは?とも思う hanyA,zentarou,topiyama,paperot,point2000,d346prt,ai_gaminglife,Colorful44,tacamula,akihagi
b:id:takutakuma個人的には2人で言い合いしてるだけだからいいんじゃないかなと思ってたけど、やっぱ難しいのかな。
b:id:cartman0 未だに童貞いじりあるドン引きよな maguro1111
b:id:topiyamaマイルドヤンキー風とオタク風の見た目二人がお互いに偏見を言い合ってて、言われた側は違うし、っていう。/私には両者ともダメでしょという風刺ネタに見えたけど、偏見事例を挙げるのも嫌だという人もいるよね
b:id:neboketeもっと
b:id:underd 印象から咄嗟判断しないといけない場合とか本能も絡んだりするから偏見を一概に悪とは言えないけど、漫才ネタとして練って出すのは時代遅れと思う
b:id:kotetsu306 昨年のウエストランド非モテが僻みを爆発させる内容だったし、そういうのが好きな人一定数いるんだろうね。どっちもファイナル進出はしてないし、キャンセルカルチャー発動させるほどではないでしょ aquatofana
b:id:gnoname 顔を例えて突っ込むのは別の芸人でも見た気がするから正直ありきたりでお腹いっぱいやな。普通につまらなくてもナベプロパワーで使われるAマッソパターンか、媚びてた関西以外で干される金属バットパターン
b:id:sumika_09 「外見と内面は違う」をコンビでずっと掛け合い続けるネタ。このタイトルだとせめるをバカにするのはダメで、まもるバカにしても構わないのか? というツッコミが入れられるんだけど、同程度の雑なツッコミ増田
b:id:sukekyo ああこんなの出てくると思ってた。ルッキズムオタクバカにするやつ絶対に殺す顔や。2022年はもうちょっと寛容な社会になるといいなあ。なにいってんねん、おまえ液体をストーブ前で蹴る顔やんけ!見るなお笑い kowyoshi,zeromoon0
b:id:casm 「こういう表現は本当にまずいよね」「儲からないよね」という社会合意を目指そう。 ashigaru,cartman0,aquatofana,eringix,mio_wembley,sand_land,deviceone
b:id:shenlongシンプル漫画村とかの違法サイトのことをネタにぶつけるのは結構リスキーだと思った
b:id:b-zou3 完全に指示する。顔という本人の生まれ持ったものネタにするのはやめていただきたい。「お前はユダヤ人だ」というのとなにが違うというのか。 cartman0,aquatofana,IthacaChasma,paperot,mshota,lifeisadog
b:id:zapa おじさんのハゲ頭をぶっ叩いて大笑いさせて優勝する国ですから satotaka99,footballnoaka,rajgrksalme32f
b:id:ko2inte8cu爆笑太田はこの種のお笑いヘイト性を認めている。駄洒落以外のお笑いで何かを皮肉らずに成立させることは難しい。そう言うお前も今まで何かのステレオタイプを笑いにしてきただろと言われると困る。コンプラ問題
b:id:nack1024ナチスネタやったって良いよ。マジで casm,oktnzm,tomoP
b:id:kishimoto0050安易規制論には反対ですがお笑いイジメハラスメント等を誘発していないか社会への悪影響については真面目に検証されるべきだと思います
b:id:ichiken7お笑いが誰かを馬鹿にすることで成立してると認識してる人が多くてビックリ。そんなわけないでしょ
b:id:ykana最初はぎょっとしたけど、あれはオタクだけじゃなくて対極のヤンキーも顔で決めつけられることへの批判と受け取った。「○○顔だろ」に突っ込みが入り双方向にすることで、つり合いが取れた。 gegegepo,wumako
b:id:goldhead 見ていてこういう意見が出てくるだろうとは思った。 Permalink | 記事への反応(0) | 15:24

2021-08-03

ブコメの熊がウザいので、削除するブックマークレット作った

javascript:document.querySelectorAll(".entry-comment-contents").forEach(function(e){if(e.innerText.indexOf('🐻')!=-1||e.innerText.indexOf('ʕ•̫͡•ʔ')!=-1){e.remove()}})

ブックマークレットクリックが面倒な人は、GreasemonkeyかTampermonkeyで。

他のパターンコメント削除したい人は『||e.innerText.indexOf('削除したいコメントに含まれ文字列')!=-1』を修正なり、追加なりでどうぞ。

何か要望があれば、はてブコメント(ただし熊系は消してます)か言及でどうぞ。気が向いたら対応します。

なんか漏れてるのがある。文字列の方は、もっと短くした方が良さそう。ただ、これでも漏れてるのがありそうで、もし多様されそうなら対策調査か、はてブユーザー非表示機能を使おう。一応、サンプルの提供感謝

javascript:document.querySelectorAll(".entry-comment-contents").forEach(function(e){if(e.innerText.indexOf('🐻')!=-1||e.innerText.indexOf('•̫͡')!=-1){e.remove()}})

id:kako-jun クマで後半を埋めてるコメントで、前半は残したいので、正規表現にして後置のクマだけ消してほしい

こんなんでどうだろう。『正規表現にして後置のクマ』が面倒なので、『1文字目に熊がある場合削除対象外』で。あと『クマだけ消す』も不十分だと思うので、『replace(/a|b|c|d/g, '')』のabcdの箇所を必要に応じて修正して。

javascript:document.querySelectorAll(".entry-comment-text").forEach(function(e){if(2<e.innerText.indexOf('🐻')||2<e.innerText.indexOf('•̫͡')){e.innerHTML=e.innerHTML.replace(/🐻|ʕ|•|̫͡|̫•|ʔ/g, '');}})

ただ、増田仕様で『<>(大なり小なり)の半角』が使えないので、上記の<は<の半角に適宜変換してください。

id:kako-jun 氏が、自身で作られてました。

https://b.hatena.ne.jp/entry/4706344345181168386/comment/kako-jun

2021-05-08

anond:20210504151428

uBlock系のコンテンツブロッカーを使っているならマイフィルターの設定に

b.hatena.ne.jp##.entrylist-contents-tags

を加えるとエントリーリスト中のタグ表示が消せるし

b.hatena.ne.jp##.entry-tags

を加えるとエントリー個別ページの右上にまとめて出るタグ表示が消せるようだ

2021-02-10

はてなブックマーク一行スクレイピング

実行すると、各記事

{

 title:記事タイトル,

 url:記事URL,

 users:ブクマ数,

 tags:[タグ]

}

形式に変換し、500ブクマ以上でフィルタし、ブクマ数降順で返す。


#一行版

curl -s https://b.hatena.ne.jp/hotentry/it | pup --charset utf-8 'div.entrylist-contents-main json{}' | jq -r '[.[] | {title: (.. | select(.class? == "entrylist-contents-title") | .children[].title), url: (.. | select(.class? == "entrylist-contents-title")) | .children[].href, users: (.. | select(.class? == "entrylist-contents-users") | .children[].children[].text | tonumber), tags: ([.. | select(.class? == "entrylist-contents-tags") | .children[]?.children[]?.text])}] | unique | map(select(.users >= 500)) | sort_by(.users) | reverse'


#変数

title='title: (.. | select(.class? == "entrylist-contents-title") | .children[].title)'
users='users: (.. | select(.class? == "entrylist-contents-users") | .children[].children[].text | tonumber)'
url='url: (.. | select(.class? == "entrylist-contents-title")) | .children[].href'
tags='tags: ([.. | select(.class? == "entrylist-contents-tags") | .children[]?.children[]?.text])'
target='https://b.hatena.ne.jp/'
hotentry='hotentry/it'
curl -s $target$hotentry | ¥
pup --charset utf-8 'div.entrylist-contents-main json{}' | ¥
jq -r "[.[] | {${title}, ${url}, ${users}, ${tags}}] | unique | map(select(.users >= 500)) | sort_by(.users) | reverse"

2018-05-23

[]uBlock Originを使って特定ブコメを隠す方法メモ

anond:20180523215832 のついで。

コメントタグ特定単語を含むブックマークコメントブロックする方法

同じくuBlock OriginのMy Filtersを使う。

コメントタグに「死ねばいいのに」という文章が含まれブコメを隠したい場合

hatena.ne.jp##.entry-comment-contents:has-text(死ねばいいのに)

特定IDブコメブロックする方法(不完全)

「Dummy_ID」によるブコメブロックしたい場合、同じくMy Filtersで、

hatena.ne.jp##.entry-comment-contents:has(a[href*="Dummy_ID"])

を追加すれば消えるのだけど、これだとDummy_IDスターを付けられたブコメまで消えてしまう。もうちょっと調べればなんとかなりそう。

2017-11-24

はてなブックマークCSSデザイン統一について

ここのところ思い出したかのように時々リニューアルが行われてるはてなブックマークデザインだけどさ。

少し前にリニューアルされたお気に入りページは、#left-container #center-container #right-container って、要するにdivタグidを振り分けて3ペインデザインを実現しているんだけれども、先日リニューアルされたユーザーブックマーク一覧ページは .left-container .center-container .right-container って、divタグclassを振り分けて3ペインデザインを実現しているのね。

こういう全体で1度しか使わないデザイン上の区切り指定するのにidを振るかclassを振るかってのは正直好みの問題でもあって、header,footer的なものidから3ペインidだろとか、優先順位とか管理やすいかclassでもいいだろとか宗教問題にもなりそうではあるんだけれど、同じ会社が作っている同じサービスほとんど同じページ表示に別の形式での記述がされているのはデザイナー間での事前定義と言うか意思疎通がされていないってことでもあってかなりマズいことじゃないのかな。

何かリニューアルするたびに「まともに仕事できないのかはてなデザイナーは」って揶揄されるけど、実際はてなデザイナーチーム、チーム内で大変なことになってるんじゃないか経営陣その辺ちゃんと把握してるか?

2017-07-06

はてブの新ユーザページ用ユーザスタイルシートを書いた

ずっと旧ページ使ってて、どうにも窮屈な感じがしたので。

.wrapper-container-inner {
    box-sizing: border-box;
    width: 100%;
    padding: 20px 20px 0;
    background-image: none;
}

#right-container {
    display: none;
}

#center-container {
    box-sizing: border-box;
    padding: 0 0 0 20px;
    width: calc(100% - 180px);
}

カラムは消した。

あくまで広くしただけ。

幅が広すぎる!って場合最後の width: calc(100% - 180px); にある100%の値を調整すればいい。

にしても、まさかレイアウトでfloat使ってるとは思わなかった。

いろいろ見ててCSSレガシーすぎて大変なんだろうなー、と思った。

2017-07-04

https://anond.hatelabo.jp/20170703143955

なんで PC 画面がワイド化してんのに、ブコメ表示部がこんなに幅狭いんだよ……。というわけで、お気に入りページのサイドバーサムネイル消して表示幅を広げるユーザースタイルシート

.wrapper-container-inner {
  width: 90%;
}

#center-container {
  width: 100%;   
}

#left-container,
#right-container,
.entry-image-block {
  display: none;
}

.wrapper-container-inner.left-column-line {
  background-image: none;
}

.entry-title,
.entry-block blockquote,
.entry-data,
.user-comment-meta,
.starContainer {
  display: inline;
}

.profile-image {
  width: 1.2em !important;
  height: 1.2em !important;
}

サイドバー区切りの縦線を消せてないけど、とりあえず。

縦線の消し方をブコメで教わりました。ありがとうございます! > id:ikihaji_kun

追記

要約文を消してさらに縦を圧縮するなら、以下を追加すればよいですね。

ガッツリ消す
.entry-block blockquote {
  display: none;   
}
あとで読む」あたりは残す
.entry-summary {
  display: none
}

2009-03-08

XAMPPMySQL文字化け

バージョン2.5

phpとかデータベースをutf8に統一した上で

my.cnfに以下の内容を書き込む。

[client]

default-character-set = utf8

[mysqld]

skip-character-set-client-handshake

default-character-set = utf8

character-set-server = utf8

collation-server = utf8_general_ci

init-connect = SET NAMES utf8

[mysqldump]

default-character-set = utf8

[mysql]

default-character-set = utf8

2008-09-13

これはひどい

http://kago.in/portal/index.php?url=<>

Warning: file_get_contents(http://api.pathtraq.com/pages?url=&lt;&gt;&amp;m=popular) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /virtual/kago/public_html/portal/index.php on line 25

Warning: file_get_contents(http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch?appid=_DG85xqxg66_I.XOwI8HXsFIoVCrj7wuyv4HstVVzMq.Eq5NFShOxteUK6FlXyPB9BFCYw--&amp;query=&lt;&gt;&amp;results=50) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /virtual/kago/public_html/portal/index.php on line 32

Warning: file_get_contents(http://www.2chsearch.net/api/list?q=&lt;&gt;&amp;mode=html) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in /virtual/kago/public_html/portal/index.php on line 42

2008-02-19

はてなブックマーク2ちゃんねるっぽくするユーザースタイルシート

インスパイヤ元 - http://anond.hatelabo.jp/20080219145538

@-moz-document domain("b.hatena.ne.jp") {
  ul#bookmarked_user{
    font-size: 105%;
  }
  #bookmarked_user li{
    list-style-type: decimal;
  }
  #bookmarked_user li:before{
    content: '\FF1A';
  }
  #bookmarked_user .timestamp:before{
    content: '\756A\7D44\306E\9014\4E2D\3067\3059\304C\306F\3066\306A\3067\3059\FF1A ';
    font-size: 110%;
    font-weight: bold;
    color: #008000;
  }
  #bookmarked_user img.hatena-id-icon,
  #bookmarked_user .user-tag,
  #bookmarked_user .hatena-star-comment-container,
  #bookmarked_user .hatena-star-star-container{
    display: none;
  }
  #bookmarked_user a[href*='bookmark-']:before{
    content: 'ID:';
  }
  #bookmarked_user a[href*='bookmark-']:link,
  #bookmarked_user a[href*='bookmark-']:hover{
    color: black;
    text-decoration: none;
  }
  #bookmarked_user a[href*='bookmark-']:hover{
    color: blue;
    text-decoration: underline;
  }
  #bookmarked_user span.comment{
   display: block;
   padding: 8px 1em;
   margin-left: 1.5em;
  }
}

曜日の表記と「2008年02月19日」を「2008/02/19」にしたかったが、方法が分からなかった。あ、あと投稿時間も。Greasemonkey じゃないと無理か?

追記

転載・改変は自由なので、再利用したいとかここを変えた方がより良い、という方は好きに使って結構です。

追記2

はてブちゃんねる

はてなブックマーク2ちゃんねる風に見せるサービスktkr

「はてブちゃんねる」を作った - mayokara memo

2007-07-19

/* Ten */
if (typeof(Ten) == 'undefined') {
    Ten = {};
}
Ten.NAME = 'Ten';
Ten.VERSION = 0.06;

/* Ten.Class */
Ten.Class = function(klass, prototype) {
    if (klass && klass.initialize) {
	var c = klass.initialize;
    } else if(klass && klass.base) {
        var c = function() { return klass.base[0].apply(this, arguments) };
    } else {
	var c = function() {};
    }
    c.prototype = prototype || {};
    c.prototype.constructor = c;
    Ten.Class.inherit(c, klass);
    if (klass && klass.base) {
        for (var i = 0;  i < klass.base.length; i++) {
	    var parent = klass.base[i];
            if (i == 0) {
                c.SUPER = parent;
                c.prototype.SUPER = parent.prototype;
            }
            Ten.Class.inherit(c, parent);
            Ten.Class.inherit(c.prototype, parent.prototype);
        }
    }
    return c;
}
Ten.Class.inherit = function(child,parent) {
    for (var prop in parent) {
        if (typeof(child[prop]) != 'undefined' || prop == 'initialize') continue;
        child[prop] = parent[prop];
    }
}

/*
// Basic Ten Classes
**/

/* Ten.JSONP */
Ten.JSONP = new Ten.Class({
    initialize: function(uri,obj,method) {
        if (Ten.JSONP.Callbacks.length) {
            setTimeout(function() {new Ten.JSONP(uri,obj,method)}, 500);
            return;
        }
        var del = uri.match(/\?/) ? '&' : '?';
        uri += del + 'callback=Ten.JSONP.callback';
        if (!uri.match(/timestamp=/)) {
            uri += '&' + encodeURI(new Date());
        }
        if (obj && method) Ten.JSONP.addCallback(obj,method);
        this.script = document.createElement('script');
        this.script.src = uri;
        this.script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(this.script);
    },
    addCallback: function(obj,method) {
        Ten.JSONP.Callbacks.push({object: obj, method: method});
    },
    callback: function(args) {
        // alert('callback called');
        var cbs = Ten.JSONP.Callbacks;
        for (var i = 0; i < cbs.length; i++) {
            var cb = cbs[i];
            cb.object[cb.method].call(cb.object, args);
        }
        Ten.JSONP.Callbacks = [];
    },
    MaxBytes: 8000,
    Callbacks: []
});

/* Ten.XHR */
Ten.XHR = new Ten.Class({
    initialize: function(uri,opts,obj,method) {
        if (!uri) return;
        this.request = Ten.XHR.getXMLHttpRequest();
        this.callback = {object: obj, method: method};
        var xhr = this;
        var prc = this.processReqChange;
        this.request.onreadystatechange = function() {
            prc.apply(xhr, arguments);
        }
        var method = opts.method || 'GET';
        this.request.open(method, uri, true);
        if (method == 'POST') {
            this.request.setRequestHeader('Content-Type',
                                          'application/x-www-form-urlencoded');
        }
        var data = opts.data ? Ten.XHR.makePostData(opts.data) : null;
        this.request.send(data);
    },
    getXMLHttpRequest: function() {
        var xhr;
        var tryThese = [
            function () { return new XMLHttpRequest(); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
        ];
        for (var i = 0; i < tryThese.length; i++) {
            var func = tryThese[i];
            try {
                xhr = func;
                return func();
            } catch (e) {
                //alert(e);
            }
        }
        return xhr;
    },
    makePostData: function(data) {
        var pairs = [];
        var regexp = /%20/g;
        for (var k in data) {
            var v = data[k].toString();
            var pair = encodeURIComponent(k).replace(regexp,'+') + '=' +
                encodeURIComponent(v).replace(regexp,'+');
            pairs.push(pair);
        }
        return pairs.join('&');
    }
},{
    processReqChange: function() {
        var req = this.request;
        if (req.readyState == 4) {
            if (req.status == 200) {
                var cb = this.callback;
                cb.object[cb.method].call(cb.object, req);
            } else {
                alert("There was a problem retrieving the XML data:\n" +
                      req.statusText);
            }
        }
    }
});

/* Ten.Observer */
Ten.Observer = new Ten.Class({
    initialize: function(element,event,obj,method) {
        var func = obj;
        if (typeof(method) == 'string') {
            func = obj[method];
        }
        this.element = element;
        this.event = event;
        this.listener = function(event) {
            return func.call(obj, new Ten.Event(event || window.event));
        }
        if (this.element.addEventListener) {
            if (this.event.match(/^on(.+)$/)) {
                this.event = RegExp.$1;
            }
            this.element.addEventListener(this.event, this.listener, false);
        } else if (this.element.attachEvent) {
            this.element.attachEvent(this.event, this.listener);
        }
    }
},{
    stop: function() {
        if (this.element.removeEventListener) {
            this.element.removeEventListener(this.event,this.listener,false);
        } else if (this.element.detachEvent) {
            this.element.detachEvent(this.event,this.listener);
        }
    }
});

/* Ten.Event */
Ten.Event = new Ten.Class({
    initialize: function(event) {
        this.event = event;
    },
    keyMap: {
        8:"backspace", 9:"tab", 13:"enter", 19:"pause", 27:"escape", 32:"space",
        33:"pageup", 34:"pagedown", 35:"end", 36:"home", 37:"left", 38:"up",
        39:"right", 40:"down", 44:"printscreen", 45:"insert", 46:"delete",
        112:"f1", 113:"f2", 114:"f3", 115:"f4", 116:"f5", 117:"f6", 118:"f7",
        119:"f8", 120:"f9", 121:"f10", 122:"f11", 123:"f12",
        144:"numlock", 145:"scrolllock"
    }
},{
    mousePosition: function() {
        if (!this.event.clientX) return;
        return Ten.Geometry.getMousePosition(this.event);
    },
    isKey: function(name) {
        var ecode = this.event.keyCode;
        if (!ecode) return;
        var ename = Ten.Event.keyMap[ecode];
        if (!ename) return;
        return (ename == name);
    },
    targetIsFormElements: function() {
        var target = this.event.target;
        if (!target) return;
        var T = (target.tagName || '').toUpperCase();
        return (T == 'INPUT' || T == 'SELECT' || T == 'OPTION' ||
                T == 'BUTTON' || T == 'TEXTAREA');
    },
    stop: function() {
        var e = this.event;
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        } else {
            e.cancelBubble = true;
            e.returnValue = false;
        }
    }
});

/* Ten.DOM */
Ten.DOM = new Ten.Class({
    getElementsByTagAndClassName: function(tagName, className, parent) {
        if (typeof(parent) == 'undefined') {
            parent = document;
        }
        var children = parent.getElementsByTagName(tagName);
        if (className) { 
            var elements = [];
            for (var i = 0; i < children.length; i++) {
                var child = children[i];
                var cls = child.className;
                if (!cls) {
                    continue;
                }
                var classNames = cls.split(' ');
                for (var j = 0; j < classNames.length; j++) {
                    if (classNames[j] == className) {
                        elements.push(child);
                        break;
                    }
                }
            }
            return elements;
        } else {
            return children;
        }
    },
    removeEmptyTextNodes: function(element) {
        var nodes = element.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            var node = nodes[i];
            if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                node.parentNode.removeChild(node);
            }
        }
    },
    nextElement: function(elem) {
        do {
            elem = elem.nextSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    prevElement: function(elem) {
        do {
            elem = elem.previousSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    scrapeText: function(node) {
        var rval = [];
        (function (node) {
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    onLoadFunctions: [],
    loaded: false,
    timer: null,
    addEventListener: function(event,func) {
        if (event != 'load') return;
        Ten.DOM.onLoadFunctions.push(func);
        Ten.DOM.checkLoaded();
    },
    checkLoaded: function() {
        var c = Ten.DOM;
        if (c.loaded) return true;
        if (document && document.getElementsByTagName &&
            document.getElementById && document.body) {
            if (c.timer) {
                clearInterval(c.timer);
                c.timer = null;
            }
            for (var i = 0; i < c.onLoadFunctions.length; i++) {
                    c.onLoadFunctions[i]();
            }
            c.onLoadFunctions = [];
            c.loaded = true;
        } else {
            c.timer = setInterval(c.checkLoaded, 13);
        }
    }
});

/* Ten.Style */
Ten.Style = new Ten.Class({
    applyStyle: function(elem, style) {
        for (prop in style) {
            elem.style[prop] = style[prop];
        }
    }
});

/* Ten.Geometry */
Ten.Geometry = new Ten.Class({
    initialize: function() {
        if (Ten.Geometry._initialized) return;
        var func = Ten.Geometry._functions;
        var de = document.documentElement;
        if (window.innerWidth) {
            func.getWindowWidth = function() { return window.innerWidth; }
            func.getWindowHeight = function() { return window.innerHeight; }
            func.getXScroll = function() { return window.pageXOffset; }
            func.getYScroll = function() { return window.pageYOffset; }
        } else if (de && de.clientWidth) {
            func.getWindowWidth = function() { return de.clientWidth; }
            func.getWindowHeight = function() { return de.clientHeight; }
            func.getXScroll = function() { return de.scrollLeft; }
            func.getYScroll = function() { return de.scrollTop; }
        } else if (document.body.clientWidth) {
            func.getWindowWidth = function() { return document.body.clientWidth; }
            func.getWindowHeight = function() { return document.body.clientHeight; }
            func.getXScroll = function() { return document.body.scrollLeft; }
            func.getYScroll = function() { return document.body.scrollTop; }
        }
        Ten.Geometry._initialized = true;
    },
    _initialized: false,
    _functions: {},
    getScroll: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            x: Ten.Geometry._functions.getXScroll(),
            y: Ten.Geometry._functions.getYScroll()
        };
    },
    getMousePosition: function(pos) {
        // pos should have clientX, clientY same as mouse event
        if ((navigator.userAgent.indexOf('Safari') > -1) &&
            (navigator.userAgent.indexOf('Version/') < 0)) {
            return {
                x: pos.clientX,
                y: pos.clientY
            };
        } else {
            var scroll = Ten.Geometry.getScroll();
            return {
                x: pos.clientX + scroll.x,
                y: pos.clientY + scroll.y
            };
        }
    },
    getElementPosition: function(e) {
        return {
            x: e.offsetLeft,
            y: e.offsetTop
        };
    },
    getWindowSize: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            w: Ten.Geometry._functions.getWindowWidth(),
            h: Ten.Geometry._functions.getWindowHeight()
        };
    }
});

/* Ten.Position */
Ten.Position = new Ten.Class({
    initialize: function(x,y) {
        this.x = x;
        this.y = y;
    },
    subtract: function(a,b) {
        return new Ten.Position(a.x - b.x, a.y - b.y);
    }
});

/*
// require Ten.js
**/

/* Ten.SubWindow */
Ten.SubWindow = new Ten.Class({
    initialize: function() {
        var c = this.constructor;
        if (c.singleton && c._cache) {
            return c._cache;
        }
        var div = document.createElement('div');
        Ten.Style.applyStyle(div, Ten.SubWindow._baseStyle);
        Ten.Style.applyStyle(div, c.style);
        this.window = div;
        this.addContainerAndCloseButton();
        document.body.appendChild(div);
        if (c.draggable) {
            this._draggable = new Ten.Draggable(div, this.handle);
        }
        if (c.singleton) c._cache = this;
        return this;
    },
    _baseStyle: {
        color: '#000',
        position: 'absolute',
        display: 'none',
        zIndex: 2,
        left: 0,
        top: 0,
        backgroundColor: '#fff',
        border: '1px solid #bbb'
    },
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '100px',
        height: '100px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        padding: '0 10px'
    },
    // closeButton: 'close.gif',
    closeButton: 'http://s.hatena.com/images/close.gif',
    closeButtonStyle: {
        position: 'absolute',
        top: '8px',
        right: '10px',
        cursor: 'pointer'
    },
    _baseScreenStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        display: 'none',
        zIndex: 1,
        overflow: 'hidden',
        width: '100%',
        height: '100%'
    },
    screenStyle: {},
    showScreen: true,
    singleton: true,
    draggable: true,
    _cache: null
},{
    screen: null,
    windowObserver: null,
    visible: false,
    addContainerAndCloseButton: function() {
        var win = this.window;
        var c = this.constructor;
        var div = document.createElement('div');
        win.appendChild(div);
        Ten.Style.applyStyle(div, c.containerStyle);
        this.container = div;
        if (c.handleStyle) {
            var handle = document.createElement('div');
            Ten.Style.applyStyle(handle, c.handleStyle);
            win.appendChild(handle);
            this.handle = handle;
        }
        if (c.closeButton) {
	    var btn = document.createElement('img');
            btn.src = c.closeButton;
            btn.alt = 'close';
            Ten.Style.applyStyle(btn, c.closeButtonStyle);
            win.appendChild(btn);
            new Ten.Observer(btn, 'onclick', this, 'hide');
            this.closeButton = btn;
        }
        if (c.showScreen) {
            var screen = document.createElement('div');
            Ten.Style.applyStyle(screen, Ten.SubWindow._baseScreenStyle);
            Ten.Style.applyStyle(screen, c.screenStyle);
            document.body.appendChild(screen);
            this.screen = screen;
            new Ten.Observer(screen, 'onclick', this, 'hide');
        }
    },
    show: function(pos) {
        pos = (pos.x && pos.y) ? pos : {x:0, y:0};
        with (this.window.style) {
            display = 'block';
            left = pos.x + 'px';
            top = pos.y + 'px';
        }
        if (this.screen) {
            with (this.screen.style) {
                display = 'block';
                left = Ten.Geometry.getScroll().x + 'px';
                top = Ten.Geometry.getScroll().y + 'px';
            }
        }
        this.windowObserver = new Ten.Observer(document.body, 'onkeypress', this, 'handleEscape');
        this.visible = true;
    },
    handleEscape: function(e) {
        if (!e.isKey('escape')) return;
        this.hide();
    },
    hide: function() {
        if (this._draggable) this._draggable.endDrag();
        this.window.style.display = 'none';
        if (this.screen) this.screen.style.display = 'none';
        if (this.windowObserver) this.windowObserver.stop();
        this.visible = false;
    }
});

/* Ten.Draggable */
Ten.Draggable = new Ten.Class({
    initialize: function(element,handle) {
        this.element = element;
        this.handle = handle || element;
        this.startObserver = new Ten.Observer(this.handle, 'onmousedown', this, 'startDrag');
        this.handlers = [];
    }
},{
    startDrag: function(e) {
        if (e.targetIsFormElements()) return;
        this.delta = Ten.Position.subtract(
            e.mousePosition(),
            Ten.Geometry.getElementPosition(this.element)
        );
        this.handlers = [
            new Ten.Observer(document, 'onmousemove', this, 'drag'),
            new Ten.Observer(document, 'onmouseup', this, 'endDrag'),
            new Ten.Observer(this.element, 'onlosecapture', this, 'endDrag')
        ];
        e.stop();
    },
    drag: function(e) {
        var pos = Ten.Position.subtract(e.mousePosition(), this.delta);
        Ten.Style.applyStyle(this.element, {
            left: pos.x + 'px',
            top: pos.y + 'px'
        });
        e.stop();
    },
    endDrag: function(e) {
        for (var i = 0; i < this.handlers.length; i++) {
            this.handlers[i].stop();
        }
        if(e) e.stop();
    }
});

/* Hatena */
if (typeof(Hatena) == 'undefined') {
    Hatena = {};
}

/* Hatena.User */
Hatena.User = new Ten.Class({
    initialize: function(name) {
        this.name = name;
    },
    getProfileIcon: function(name) {
        if (!name) name = 'user';
        var pre = name.match(/^[\w-]{2}/)[0];
        var img = document.createElement('img');
        img.src = 'http://www.hatena.ne.jp/users/' + pre + '/' + name + '/profile_s.gif';
        img.alt = name;
        img.setAttribute('class', 'profile-icon');
        img.setAttribute('width','16px');
        img.setAttribute('height','16px');
        with (img.style) {
            margin = '0 3px';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
}, {
    profileIcon: function() {
        return Hatena.User.getProfileIcon(this.name);
    }
});

/* Hatena.Star */
if (typeof(Hatena.Star) == 'undefined') {
    Hatena.Star = {};
}

/*
// Hatena.Star.* classes //
**/
if (window.location && window.location.host.match(/hatena\.com/)) {
    Hatena.Star.BaseURL = 'http://s.hatena.com/';
} else {
    Hatena.Star.BaseURL = 'http://s.hatena.ne.jp/';
}
Hatena.Star.Token = null;

/* Hatena.Star.User */
Hatena.Star.User = new Ten.Class({
    base: [Hatena.User],
    initialize: function(name) {
        if (Hatena.Star.User._cache[name]) {
            return Hatena.Star.User._cache[name];
        } else {
            this.name = name;
            Hatena.Star.User._cache[name] = this;
            return this;
        }
    },
    _cache: {}
},{
    userPage: function() {
        return Hatena.Star.BaseURL + this.name + '/';
    }
});

/* Hatena.Star.Entry */
Hatena.Star.Entry = new Ten.Class({
    initialize: function(e) {
        this.entry = e;
        this.uri = e.uri;
        this.title = e.title;
        this.star_container = e.star_container;
        this.comment_container = e.comment_container;
        this.stars = [];
        this.comments = [];
    },
    maxStarCount: 11
},{
    flushStars: function() {
        this.stars = [];
        this.star_container.innerHTML = '';
    },
    bindStarEntry: function(se) {
        this.starEntry = se;
        for (var i = 0; i < se.stars.length; i++) {
            if (typeof(se.stars[i]) == 'number') {
                this.stars.push(new Hatena.Star.InnerCount(se.stars[i],this));
            } else {
                this.stars.push(new Hatena.Star.Star(se.stars[i]));
            }
        }
        if (se.comments && !this.comments.length) {
            for (var i = 0; i < se.comments.length; i++) {
                this.comments.push(new Hatena.Star.Comment(se.comments[i]));
            }
        }
        this.can_comment = se.can_comment;
    },
    setCanComment: function(v) {
        this.can_comment = v;
    },
    showButtons: function() {
        this.addAddButton();
        this.addCommentButton();
    },
    addAddButton: function() {
        if (this.star_container) {
            this.addButton = new Hatena.Star.AddButton(this);
            this.star_container.appendChild(this.addButton);
        }
    },
    addCommentButton: function() {
        if (this.comment_container) {
            this.commentButton = new Hatena.Star.CommentButton(this);
            this.comment_container.appendChild(this.commentButton.img);
        }
    },
    showStars: function() {
        var klass = this.constructor;
        // if (this.stars.length > klass.maxStarCount) {
        //     var ic = new Hatena.Star.InnerCount(this.stars.slice(1,this.stars.length));
        //     this.star_container.appendChild(this.stars[0]);
        //     this.star_container.appendChild(ic);
        //     this.star_container.appendChild(this.stars[this.stars.length - 1]);
        // } else {
        for (var i = 0; i < this.stars.length; i++) {
            this.star_container.appendChild(this.stars[i]);
        }
    },
    showCommentButton: function() {
        if (this.can_comment) {
            this.commentButton.show();
            if (this.comments.length) this.commentButton.activate();
        } else {
            // this.commentButton.hide();
        }
    },
    addStar: function(star) {
        this.stars.push(star);
        this.star_container.appendChild(star);
    },
    addComment: function(com) {
        if (!this.comments) this.comments = [];
        if (this.comments.length == 0) {
            this.commentButton.activate();
        }
        this.comments.push(com);
    },
    showCommentCount: function() {
        this.comment_container.innerHTML += this.comments.length;
    }
});

/* Hatena.Star.Button */
Hatena.Star.Button = new Ten.Class({
    createButton: function(args) {
        var img = document.createElement('img');
        img.src = args.src;
        img.alt = img.title = args.alt;
        with (img.style) {
	    cursor = 'pointer';
	    margin = '0 3px';
            padding = '0';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
});

/* Hatena.Star.AddButton */
Hatena.Star.AddButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.AddButton.ImgSrc,
            alt: 'Add Star'
        });
        this.observer = new Ten.Observer(img,'onclick',this,'addStar');
        this.img = img;
        return img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/add.gif'
},{
    addStar: function(e) {
        this.lastPosition = e.mousePosition();
        var uri = Hatena.Star.BaseURL + 'star.add.json?uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        if (Hatena.Star.Token) {
            uri += '&token=' + Hatena.Star.Token;
        }
        new Ten.JSONP(uri, this, 'receiveResult');
    },
    receiveResult: function(args) {
        var name = args ? args.name : null;
        if (name) {
            this.entry.addStar(new Hatena.Star.Star({name: name}));
            //alert('Succeeded in Adding Star ' + args);
        } else if (args.errors) {
            var pos = this.lastPosition;
            pos.x -= 10;
            pos.y += 25;
            var scroll = Ten.Geometry.getScroll();
            var scr = new Hatena.Star.AlertScreen();
            var alert = args.errors[0];
            scr.showAlert(alert, pos);
        }
    }
});

/* Hatena.Star.CommentButton */
Hatena.Star.CommentButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.CommentButton.ImgSrc,
            alt: 'Comments'
        });
        img.style.display = 'none';
        this.observer = new Ten.Observer(img,'onclick',this,'showComments');
        this.img = img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/comment.gif',
    ImgSrcActive: Hatena.Star.BaseURL + 'images/comment_active.gif'
},{
    showComments: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.CommentScreen();
        this.screen.bindEntry(this.entry);
        var pos = e.mousePosition();
        pos.y += 25;
        this.screen.showComments(this.entry, pos);
    },
    hide: function() {
        this.img.style.display = 'none';
    },
    show: function() {
        this.img.style.display = 'inline';
    },
    activate: function() {
        this.show();
        this.img.src = Hatena.Star.CommentButton.ImgSrcActive;
    }
});

/* Hatena.Star.Star */
Hatena.Star.Star = new Ten.Class({
    initialize: function(args) {
        if (args.img) {
            this.img = args.img;
            this.name = this.img.getAttribute('alt');
        } else {
            this.name = args.name;
            var img = document.createElement('img');
            img.src = Hatena.Star.Star.ImgSrc;
            img.alt = this.name;
            with (img.style) {
                padding = '0';
                border = 'none';
            }
            this.img = img;
        }
	new Ten.Observer(this.img,'onmouseover',this,'showName');
	new Ten.Observer(this.img,'onmouseout',this,'hideName');
	if (this.name) {
            this.user = new Hatena.Star.User(this.name);
            this.img.style.cursor = 'pointer';
            new Ten.Observer(this.img,'onclick',this,'goToUserPage');
        }
        if (args.count && args.count > 1) {
            var c = document.createElement('span');
            c.setAttribute('class', 'hatena-star-inner-count');
            Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
            c.innerHTML = args.count;
            var s = document.createElement('span');
            s.appendChild(img);
            s.appendChild(c);
            return s;
        } else {
            return this.img;
        }
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/star.gif'
},{
    showName: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.NameScreen();
        var pos = e.mousePosition();
        pos.x += 10;
        pos.y += 25;
        this.screen.showName(this.name, pos);
    },
    hideName: function() {
        if (!this.screen) return;
        this.screen.hide();
    },
    goToUserPage: function() {
        window.location = this.user.userPage();
    }
});

/* Hatena.Star.InnerCount */
Hatena.Star.InnerCount = new Ten.Class({
    initialize: function(count, e) {
        this.count = count;
        this.entry = e;
        var c = document.createElement('span');
        c.setAttribute('class', 'hatena-star-inner-count');
        Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
        c.style.cursor = 'pointer';
        c.innerHTML = count;
        new Ten.Observer(c,'onclick',this,'showInnerStars');
        this.container = c;
        return c;
    },
    style: {
        color: '#f4b128',
        fontWeight: 'bold',
        fontSize: '80%',
        fontFamily: '"arial", sans-serif',
        margin: '0 2px'
    }
},{
    showInnerStars: function() {
        var url = Hatena.Star.BaseURL + 'entry.json?uri=' +
        encodeURIComponent(this.entry.uri);
        new Ten.JSONP(url, this, 'receiveStarEntry');
    },
    receiveStarEntry: function(res) {
        var se = res.entries[0];
        var e = this.entry;
        if (encodeURIComponent(se.uri) != encodeURIComponent(e.uri)) return;
        e.flushStars();
        e.bindStarEntry(se);
        e.addAddButton();
        e.showStars();
    }
});

/* Hatena.Star.Comment */
Hatena.Star.Comment = new Ten.Class({
    initialize: function(args) {
        this.name = args.name;
        this.body = args.body;
    }
},{
    asElement: function() {
        var div = document.createElement('div');
        with (div.style) {
            margin = '0px 0';
            padding = '5px 0';
            borderBottom = '1px solid #ddd';
        }
        var ico = Hatena.User.getProfileIcon(this.name);
        div.appendChild(ico);
        var span = document.createElement('span');
        with(span.style) {
            fontSize = '90%';
        }
        span.innerHTML = this.body;
        div.appendChild(span);
        return div;
    }
});

/* Hatena.Star.NameScreen */
Hatena.Star.NameScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center'
    },
    containerStyle: {
        margin: 0,
        padding: 0
    },
    handleStyle: null,
    showScreen: false,
    closeButton: null,
    draggable: false
},{
    showName: function(name, pos) {
        this.container.innerHTML = '';
        this.container.appendChild(Hatena.User.getProfileIcon(name));
        this.container.appendChild(document.createTextNode(name));
        this.show(pos);
    }
});

/* Hatena.Star.AlertScreen */
Hatena.Star.AlertScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '240px',
        height: '120px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    }
},{
    showAlert: function(msg, pos) {
        this.container.innerHTML = msg;
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    }
});

/* Hatena.Star.CommentScreen */
Hatena.Star.CommentScreen = new Ten.Class({
    base: [Ten.SubWindow],
    initialize: function() {
        var self = this.constructor.SUPER.call(this);
        if (!self.commentsContainer) self.addCommentsContainer();
        return self;
    },
    style: {
        width: '280px',
        height: '280px',
        overflowY: 'auto',
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        textAlign: 'left',
        padding: '0 10px'
    },
    getLoadImage: function() {
        var img = document.createElement('img');
        img.src = Hatena.Star.BaseURL + 'images/load.gif';
        img.setAttribute('alt', 'Loading');
        with (img.style) {
            verticalAlign = 'middle';
            margin = '0 2px';
        }
        return img;
    }
},{
    addCommentsContainer: function() {
        var div = document.createElement('div');
        with (div.style) {
            marginTop = '-3px';
        }
        this.container.appendChild(div);
        this.commentsContainer = div;
    },
    showComments: function(e, pos) {
        var comments = e.comments;
        if (!comments) comments = [];
        this.commentsContainer.innerHTML = '';
        for (var i=0; i<comments.length; i++) {
            this.commentsContainer.appendChild(comments[i].asElement());
        }
        if (e.starEntry && !e.can_comment) {
            this.hideCommentForm();
        } else {
            this.addCommentForm();
        }
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    },
    bindEntry: function(e) {
        this.entry = e;
    },
    sendComment: function(e) {
        if (!e.isKey('enter')) return;
        var body = this.commentInput.value;
        if (!body) return;
        this.commentInput.disabled = 'true';
        this.showLoadImage();
        var url = Hatena.Star.BaseURL + 'comment.add.json?body=' + encodeURIComponent(body) +
            '&uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        new Ten.JSONP(url, this, 'receiveResult');
    },
    receiveResult: function(args) {
        if (!args.name || !args.body) return;
        this.commentInput.value = ''; 
        this.commentInput.disabled = '';
        this.hideLoadImage();
        var com = new Hatena.Star.Comment(args);
        this.entry.addComment(com);
        this.commentsContainer.appendChild(com.asElement());
    },
    showLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'inline';
    },
    hideLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'none';
    },
    hideCommentForm: function() {
        if (!this.commentForm) return;
        this.commentForm.style.display = 'none';
    },
    addCommentForm: function() {
        if (this.commentForm) {
            this.commentForm.style.display = 'block';
            return;
        }
        var form = document.createElement('div');
        this.container.appendChild(form);
        this.commentForm = form;
        with (form.style) {
            margin = '0px 0';
            padding = '5px 0';
            // borderTop = '1px solid #ddd';
        }
        //if (Hatena.Visitor) {
        //    form.appendChild(Hatena.Visitor.profileIcon());
        //} else {
        //    form.appendChild(Hatena.User.getProfileIcon());
        //}
        var input = document.createElement('input');
        input.type = 'text';
        with (input.style) {
            width = '215px';
	    border = '1px solid #bbb';
            padding = '3px';
        }
        form.appendChild(input);
        this.commentInput = input;
        var img = this.constructor.getLoadImage();
        this.loadImage = img;
        this.hideLoadImage();
        form.appendChild(img);
        new Ten.Observer(input,'onkeypress',this,'sendComment');
    }
});

/* Hatena.Star.EntryLoader */
Hatena.Star.EntryLoader = new Ten.Class({
    initialize: function() {
        var entries = Hatena.Star.EntryLoader.loadEntries();
        this.entries = [];
        for (var i = 0; i < entries.length; i++) {
            var e = new Hatena.Star.Entry(entries[i]);
            e.showButtons();
            this.entries.push(e);
        }
        this.getStarEntries();
    },
    createStarContainer: function() {
        var sc = document.createElement('span');
        sc.setAttribute('class', 'hatena-star-star-container');
        sc.style.marginLeft = '1px';
        return sc;
    },
    createCommentContainer: function() {
        var cc = document.createElement('span');
        cc.setAttribute('class', 'hatena-star-comment-container');
        cc.style.marginLeft = '1px';
        return cc;
    },
    scrapeTitle: function(node) {
        var rval = [];
        (function (node) {
            if (node.tagName == 'SPAN' &&
                (node.className == 'sanchor' ||
                 node.className == 'timestamp')) {
                     return;
            } else if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                return;
            }
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    headerTagAndClassName: ['h3',null],
    getHeaders: function() {
        var t = Hatena.Star.EntryLoader.headerTagAndClassName;
        return Ten.DOM.getElementsByTagAndClassName(t[0],t[1],document);
    },
    loadEntries: function() {
        var entries = [];
        //var headers = document.getElementsByTagName('h3');
        var c = Hatena.Star.EntryLoader;
        var headers = c.getHeaders();
        for (var i = 0; i < headers.length; i++) {
            var header = headers[i];
            var a = header.getElementsByTagName('a')[0];
            if (!a) continue;
            var uri = a.href;
            var title = '';
            // Ten.DOM.removeEmptyTextNodes(header);
            var cns = header.childNodes;
            title = c.scrapeTitle(header);
            var cc = c.createCommentContainer();
            header.appendChild(cc);
            var sc = c.createStarContainer();
            header.appendChild(sc);
            entries.push({
                uri: uri,
                title: title,
                star_container: sc,
                comment_container: cc
            });
        }
        return entries;
    }
},{
    getStarEntries: function() {
        var url = Hatena.Star.BaseURL + 'entries.json?';
        for (var i = 0; i < this.entries.length; i++) {
            if (url.length > Ten.JSONP.MaxBytes) {
                new Ten.JSONP(url, this, 'receiveStarEntries');
                url = Hatena.Star.BaseURL + 'entries.json?';
            }
            url += 'uri=' + encodeURIComponent(this.entries[i].uri) + '&';
        }
        new Ten.JSONP(url, this, 'receiveStarEntries');
    },
    receiveStarEntries: function(res) {
        var entries = res.entries;
        if (!entries) entries = [];
        for (var i = 0; i < this.entries.length; i++) {
            var e = this.entries[i];
            for (var j = 0; j < entries.length; j++) {
                var se = entries[j];
                if (!se.uri) continue;
                if (encodeURIComponent(se.uri) == encodeURIComponent(e.uri)) {
                    e.bindStarEntry(se);
                    entries.splice(j,1);
                    break;
                }
            }
            if (typeof(e.can_comment) == 'undefined') {
                e.setCanComment(res.can_comment);
            }
            e.showStars();
            e.showCommentButton();
        }
    }
});

/* Hatena.Star.WindowObserver */
Hatena.Star.WindowObserver = new Ten.Class({
    initialize: funct


  
 
ログイン ユーザー登録
ようこそ ゲスト さん