はてなキーワード: THUMBとは
最近うちにも来た~
「先日来たのですがお留守だったので~」とまず嘘から入ってきた
https://note.com/haruaki12/n/n223484230f1a
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11150577056
https://question.realestate.yahoo.co.jp/knowledge/chiebukuro/detail/10289380920/
ググったら似たような手口が古いのから出てくるなあ
人の家にいきなり凸ってきて説教とか何考えてんのか分かんないけど
Rules of Thumbとして
「チラシなり名刺なりポストに入れておいてください。何かあったらこちらから連絡しますので」
が鉄板』
と覚えておいてね~
公開してみる
スカ好き増えろ
あとおススメ教えてください
1, 東京スカパラダイスオーケストラ/ ルパン三世’78
2, 東京スカパラダイスオーケストラ/ DOWN BEAT STOMP
4, 東京スカパラダイスオーケストラ/ Come On!
5, 東京スカパラダイスオーケストラ/ スキャラバン(CARAVAN)
6, 東京スカパラダイスオーケストラ/ 太陽にお願い
7, 東京スカパラダイスオーケストラ/ 勇者の証~Brave Eagle Of Apache~
8, 東京スカパラダイスオーケストラ/ フィルムメイカーズ・ブリード~頂上決戦~
9, 東京スカパラダイスオーケストラ/ 5 days of TEQUILA
10, 東京スカパラダイスオーケストラ/ MONSTER ROCK
11, 東京スカパラダイスオーケストラ/ Glorious
12, 東京スカパラダイスオーケストラ,さかなクン/ Paradise Has No Border
13, 東京スカパラダイスオーケストラ,宮本浩次/ 明日以外すべて燃やせ-feat.宮本浩次
16, Adhesivo/ Skabullido
18, Adhesivo/ Dia De Rutina
19, Bad Manners/ Inner London Violence
20, Brooklyn Funk Essentials,Laço Tayfa/ Ska Ka-Bop
21, Desorden Público/ Allá Cayó
22, Desorden Público/ Todo Está Muy Normal
24, EGO-WRAPPIN’/ くちばしにチェリー
27, Gypsy Ska Orquesta/ Toston Swing
31, HEY-SMITH/ We sing our song
32, KEMURI/ P.M.A(Positive Mental Attitude)
34, KEMURI/ O-zora
35, Kingston Rudieska/ Giant Moment
36, Kingston Rudieska/ Captain J
37, LÄ-PPISCH/ RINJIN
38, Laurel Aitken/ Jesse Jackson
40, Los Calzones/ Todos Te Prometen
41, Los De Abajo,Diego Benlliure,José Grela / War 4 Peace
43, Markscheider Kunst/ Ku
44, Melbourne Ska Orchestra/ Get Smart
45, Melbourne Ska Orchestra/ Lygon Street Meltdown
46, Nancy Ska Jazz Orchestra/ Hatcha!
47, Nancy Ska Jazz Orchestra/ Démineur
48, Nancy Ska Jazz Orchestra/ Tom Thumb
49, New York Ska-Jazz Ensemble/ Boogie Stop Shuffle
50, New York Ska-Jazz Ensemble/ Bopicana
51, Oi-SKALL MATES/ Bring on Nutty Stomper fun
52, Oi-SKALL MATES/ Skinhead Running
53, Oi-SKALL MATES/ Soul brother stomp together
54, Oi-SKALL MATES/ Justice Calling 69
55, Oi-SKALL MATES/ Nutty Sound Oi-SKALL MATES
56, Oi-SKALL MATES/ SKANKIN' CLASS ERO
57, Out Of Control Army/ Global Ska
58, Out Of Control Army/ Dancing
59, Out Of Control Army/ El Diablo
60, Out Of Control Army/ Fuck the police
61, Out Of Control Army/ Skaloween-En Vivo
62, Out Of Control Army,Inspector/ Siempre Fingiste Amarme
63, Pannonia Ska Orchestra/ Sahara
66, Rotterdam Ska-Jazz Foundation/ Backlash
67, Rotterdam Ska-Jazz Foundation/ No More Sorrow
68, Rotterdam Ska-Jazz Foundation/ Tunisia
69, Save Ferris/ The World Is New
70, SCAFULL KING/ Strutting Bonin’
72, SHOW-SKA/ Scooted Scorpion
78, Skassapunka/ Il pianto dell'asino
79, St.Petersburg Ska-Jazz Review/ Volga River Boat Man
80, The Busters/ Scooter Maniacs
81, The Fenicians/ Sac-O-Woe
82, The Locos,Bersuit Vergarabat/ La Bolsa
83, The Mighty Mighty Bosstones/ The Rascal King
84, The OLDTONES/ THE WEEKEND GIRLFRIEND
85, The Ska Flames/ Samurai
86, The Ska Flames/ Tokyo Shot
87, The Ska Vengers/ Vampire
88, The Ska Vengers,Rie Ona,Shirish Malhotra/ Mancini Skank
89, The Skankaroos/ Expedition To Ska
91, The Specials/ Little Bitch
92, The Super Glasses Ska Ensemble/ Keep Skanking
94, Tinez Roots Club/ High Jump
95, Tinez Roots Club/ Crazy Mule
96, Tinez Roots Club/ Chimpanzee
98, Two Tone Club/ Beware Of The Tiger
99, Two Tone Club/ Three Little Words
100, Киоск/ Чудеса
一晩経ったら伸びててビックリ
・スカパラから入った浅いファンなので,厳密なスカの定義とかよく知らないんです.ご教授いただけると嬉しいです
・運転中に聴くことが多いのでアップテンポ,テンション高めの曲が多いです
・ホーン強めの曲が好き.なんならボーカルはなくても可
・Spotifyのプレイリストからの引き写しです.タイトルに「スカ」「SKA」両方が入っているプレイリストはそんなにないので見つけにくくはないかと
・おススメいっぱいありがとうございます!ポチポチ追加しております
パソコン画面右上のアイコンで選ぶ表示スタイルを一番右の「ヘッドライン」表示にしといてな
/* ヘッドライン表示を切り詰める */ /* #container 指定でCSS優先度を上げる必要がある */ body[data-entrylist-layout="headline"] #container .entrylist-main{ padding-right: 0 !important; } body[data-entrylist-layout="headline"] #container .entrylist-contents{ padding-left: 0 !important; } body[data-entrylist-layout="headline"] #container .entrylist-contents-users{ position: static !important; } body[data-entrylist-layout="headline"] #container .entrylist-contents-users{ top: 14px !important; } /* ヘッドライン表示にサムネイルを追加 */ body[data-entrylist-layout="headline"] #container .entrylist-contents-main{ display: grid; grid-template: "users body title" 28px "bookmark body domain" 20px / 60px 120px 1fr; } body[data-entrylist-layout="headline"] #container .entrylist-contents-users{ grid-area: users; } body[data-entrylist-layout="headline"] #container .entrylist-contents-users a span{ margin-right: 0; } body[data-entrylist-layout="headline"] #container .following-bookmarks-container{ grid-area: bookmark; position: absolute; left: 20px; bottom: 2.5px; } body[data-entrylist-layout="headline"] #container .entrylist-contents-body{ grid-area: body; } body[data-entrylist-layout="headline"] #container .entrylist-contents-title{ grid-area: title; z-index: 99; } body[data-entrylist-layout="headline"] #container .entrylist-contents-title > a{ margin-left: -120px; padding-left: 120px; margin-bottom: -28px; padding-bottom: 28px; width: 890px; white-space: nowrap; display: block; } body[data-entrylist-layout="headline"] #container .entrylist-contents-body{ display: block !important; } body[data-entrylist-layout="headline"] #container .entrylist-contents-thumb{ position: static; } body[data-entrylist-layout="headline"] #container .entrylist-contents-thumb span{ width: 100px; height: 50px; } body[data-entrylist-layout="headline"] #container .entrylist-contents-thumb{ background: #f0f0f0; width: 100px; height: 50px; background-position: 50%; background-size: cover; border-radius: 4px; } /* 2行目に、総合ではドメイン(domain), サイト内一覧ではカテゴリと時刻(meta), マウスホバー時はいずれも概要文(description) */ body[data-entrylist-layout="headline"] #container .entrylist-contents-domain, body[data-entrylist-layout="headline"] #container .entrylist-contents-meta, body[data-entrylist-layout="headline"] #container .entrylist-contents-description{ grid-area: domain; display: block; opacity: 0; padding: 0 !important; } body[data-entrylist-layout="headline"] #container .entrylist-contents-meta > li{ vertical-align: top; } html[data-stable-request-url^="https://b.hatena.ne.jp/entrylist/"] body[data-entrylist-layout="headline"] #container .entrylist-contents-domain, html[data-stable-request-url^="https://b.hatena.ne.jp/site/"] body[data-entrylist-layout="headline"] #container .entrylist-contents-meta{ opacity: 1; } body[data-entrylist-layout="headline"] #container .entrylist-contents:hover .entrylist-contents-domain img.favicon + span, body[data-entrylist-layout="headline"] #container .entrylist-contents:hover .entrylist-contents-meta{ opacity: 0; } body[data-entrylist-layout="headline"] #container .entrylist-contents-description{ opacity: 0; position: absolute; top: calc(40px - 3px); left: calc(180px + 16px + .5em); height: 20px; line-height: 20px; color: #999; min-height: auto !important; padding-right: 0 !important; width: 890px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } html[data-stable-request-url^="https://b.hatena.ne.jp/site/"] body[data-entrylist-layout="headline"] #container .entrylist-contents:hover .entrylist-contents-domain, body[data-entrylist-layout="headline"] #container .entrylist-contents:hover .entrylist-contents-description{ opacity: 1; } /* 増田調整 */ body[data-entrylist-layout="headline"] #container a[href^="/entry/s/anond.hatelabo.jp/"] .entrylist-contents-thumb{ background-image: url('https://cdn-ak-scissors.b.st-hatena.com/image/square/b1638cdb5807a4788e4ba3c1109a984166e095fc/height=288;version=1;width=512/https%3A%2F%2Fanond.hatelabo.jp%2Fimages%2Fog-image-1500.gif'); } /* マウスホバー時にサムネも反応させる見た目調整 */ .entrylist-contents-title:hover ~ .entrylist-contents-body .entrylist-contents-thumb{ opacity: .90; }
松本人志以外も消える
// ==UserScript== // @name hatebu-matsumoto // @version 1 // @grant none // @include https://b.hatena.ne.jp/ // ==/UserScript== var startTime = new Date().getTime(); var t = setInterval( () => { const list = document.querySelectorAll(".entrylist-contents-thumb,.entrylist-issue-thumb"); list.forEach(x => x.style.opacity = "0"); if (new Date().getTime() - startTime > 10000) { clearInterval(t); } }, 10 );
document.cssRulesを加工するかMutationObserverを使えよ。 これだと一瞬松本の顔が映るだろ
足で人を指ささないし、足で薬を混ぜたりしないのに手と同じ名前をつけられているのは違和感がある。
多分誰もが違和感があるだろうに、誰も足指専門の名前を考えなかったのは不思議だ。
そもそも手と足は役割も全く違うのに同じ指と名付けているところから違和感がすごい、いつまで手と足に大差ない四足歩行気分でいるんだ。
英語では違う名前がついていて分かりやすいかと思いきや、手の親指は指として数えないせいで、手の薬指はthirdなのに足の薬指はfourthでこっちもけっこうややこしかった。
親指は不器用という意味で用いられたり、英語では気の毒な扱いを受けている、親指がないと様々なことができないのに何故だろう。
手の親指:thumb
手の中指:middle finger
手の薬指:third finger
手の小指:little finger
足の親指:first toe
足の薬指:fourth toe
足の小指:fifth toe
ヨッピーがはてブに返信させろって言ってるけど、それではてブがちょっとはマシな存在になるのか?って言うと全くそんな風には思えないんだよな。
かつては、idコールって機能があって、頻繁に難癖付けてくる奴がいたし、そう言った連中に不愉快な思いをしてた人って少なくないんじゃないのかなって思う。
往々にして、このidコールは非建設的なやりとり、罵倒の応酬に成り下がってたよね。100文字で的確に反論できないと、嫌味の一つも飛ばしたくなるんだろう。
で、しょっちゅうブログで人をおちょくって馬鹿にしてたHegexが低脳先生に殺されてしまって、この不毛な口喧嘩になりがちなidコールも問題視されたと。
Hagexはいずれネットでデカいしっぺ返しを受けて当然と思ってたけれど、だからって実際に殺されていいはずがない。
そんな経緯から言って現状のまま返信機能追加はあり得ないと思うけど、もしもはてブを改善するとしたら、何が出来て、どの程度の効果が見込めるだろうか?
以下に個人的に考える例をあげてみるけど、皆さんはどう思うかな?
ヤフコメなんかでも、thumb downの反応が出来るが、それを導入して人気ブコメの評価を下げられれば改善されるだろうか?
それはないだろうね。
はてブってのは、今や絶滅危惧種のサヨクが集まる限界集落で、リベラル傾向のあるコメントが評価を集めやすい構造になっている。
BAD評価、はてなブラックスター、みたいなものが出来たとしても、はてなサヨクの集団投票でよりリベラル傾向が強くなるだけだと思うよ。
例えば、東京オリンピックの際にアスリートに向かって「人殺しの顔をしろ」と言って罵倒しつつ、自分はライブに行っちゃう人のコメントが星を集めるんだからさ。
人生賭けて来たアスリートに、「人殺しの顔をしろ」って言える人たちは、応援コメントにthumb downしちゃうでしょ
これが正解だろう。コメントに優劣を付けない事で余計な論争も、しょうもないコメントに星が集まる事でリンチされてる感も消える。
ただ、この場合、はてなブックマークってサービスそのものが人気なくなりそう。
今は、このスターの機能のおかげで、限界集落のサヨクが連帯感を感じられて居心地良い訳だろうしなw
俺は、これをやって欲しいと思ってる。はてなブックマーク及び、はてなのサービスの最大の欠点は、誰もが簡単に複垢を作れてしまって
それを使ってコメントにスターを付けたり、コメントを増やしたり出来るって所にある。
全てのアカウントに携帯電話番号を紐づけたら、もしかしたら有効なアカウント数は半分以下になるんじゃないかと思える位だ。
携帯番号を抑えられてたら殆どのユーザーは大人しく、常識的に振舞うようになるだろう。ヤフコメの正常化は、これが大きいと思うよ。
例えばTwitter やインスタとの連携が義務化されるか、連携してるアカウントのブコメ以外は人気コメントに載せない様にしたらいい。
手斧の投げ合いは、そっちで出来るだろうし、手斧を投げ合う気がない奴らは過激なコメントを差し控える様になるでしょう。
例えば、とある、はてなサヨクのフェミおばさんは、人のアカウントのブックマークページに、罵倒のブコメを日々書き込んでるよね。
こういう行為に対する通報とか、苦情って、相当数寄せられてると思うんだよね。
Now look at them yo-yo's, that's the way you do it
You play the guitar on the MTV
That ain't workin' that's the way you do it
Money for nothin' and chicks for free
Now that ain't workin' that's the way you do it
Lemme tell ya them guys ain't dumb
vanillableep1618 ラ面カイダー ケボット刑事ロー ダカイキー01 ガジンマーZ ……いくらでもでてくるな(笑)
sps1uw サガセターン
nikunonamae “sun太郎” つまり「日輪の長子」が、”キラリーman” すなわち「輝く益荒男」の称号を冠しており、非常にまばゆい。
uchiten これ系では「コーモン・デグレ」が最強だと思ってる。
ashrae クターすださい☆
uchiten これ系では「コーモン・デグレ」が最強だと思ってる。
GEKIGANGAA モット・チャンチー
ken-skatan 太ラリーサン・キ太郎 伊武雅刀ファンホイホイなインターネッツはここですねwwwwwand
u4k ジョン・ベンソン、ジャイケル・マクソン、ヌワス「パパーーーーーっっ!!!!!」
mag-x こなさん みんばんわ>ジャンキー大山ショー https://www.youtube.com/watch?v=olnZywXLM_s
mr_yamada けつだいらまん
cozy3cs マラサキムンコ
nonameblog 「プロ猿ファーゴル」を世界で最初に思いついた人をリスペクト
oitomo ジャイケル・マクソン
nori__3 シマチョウ課耕作
entryno001 スプーナリズムって言うんだよね。海外にいた幼少期に「Billy has a whistle on his thumb (ビリーの親指には笛がある)」>「Whilly has a thistle on his bumb (ウィリーの尻にはトゲがある)」というのが絵本に載ってていたく気に入っていた
easy-breezy タッコミのブク
Dicer ドキがむねむねする
nekoashicable れき・たんたろう
PrivateIntMain サガシターン・セロ(1件/0.19秒)
teebeetee パッキング・パク
hiromi163 生まで朝テレビ!
fellfield 「けつだいらアウォード」を思い出した。「てっかほっかほい」とか大好きだった http://sledge-hammer-web.my.coocan.jp/ketsu-gaward.htm
kanan5100 80年代のフジテレビ「いきなりフライデーナイト」に、しりすえもんじコーナーというのがあってな。けつだいらまんが最高傑作。
kiyo_hiko 太鼓のタシヅン思い出した
d346prt こなさんみんばんは!
FlowerLounge Perfumeのラジオにラジオネームがヤカタナスタカって人がいたな
kingate パークマンサー。
aobyoutann どつカキコ……はも……
lostnamer 金年三組・B八先生
gendou ひろみやもとし
matsuedon "キラリマン・恋次郎"との一致はありません。検索結果 (引用符なし):氷川きよし 恋次郎旅姿 - YouTube
Lagenaria ぶてなハックマーク
これからWordpressを始める方、あるいは始めている方が
Wordpressのプラグインを探す際に便利になるかな、と思いまとめてみました。
(1)基本的なプラグイン
2011年版!絶対にインストールしたいWordPressプラグイン45個|Vanilla Rock
http://vanilla-rock.com/blog/wordpress/45-absolutely-install-wordpress-plugin/
Wordpressを始めた人が最初に見ておくと、何かと便利かと思います。
WordPressでブログを作ったら入れるべき27個のプラグイン|AUTHORITY SITE
http://www.authority-site.com/2010/04/wordpress/27-wordpress-plugin.html
記事内やサイドバー内で、PHPを扱うことができるものなどの紹介。
使用中のおすすめWordPressプラグイン15個 | Webクリエイターボックス
http://www.webcreatorbox.com/tech/recommended-wordpress-plugin/
フォーム用キャプチャのプラグインReally Simple CAPTCHAや、
管理画面に行かなくてもタイトルや本文、カテゴリー名などを編集できるFront-end Editorなどの紹介。
WordPressプラグイン 必須なものから便利なちょっとしたものまで(Webデザインレシピ)
http://webdesignrecipes.com/my-favorite-wordpress-plugins/
記事中の画像を1枚だけ取得してサムネイル表示してくれるPost Thumb Revisitedや、
携帯電話から記事を投稿できるKtai Entryなどの紹介。
あまり知られていないかもなSEO関連のWordPressプラグイン集:phpspot開発日誌
http://phpspot.org/blog/archives/2011/03/seowordpress_1.html
かなりマニアックなSEOに関するまとめです。検索対策にこだわりたい方向けです。
クライアントに頼まれやすい機能を補えるWordPressプラグインいろいろ-かちびと.net
http://kachibito.net/wordpress/plugins-for-commercial.html
アップロードした画像を一括で記事内に挿入できる、File Galleryや、
管理画面TOPにメモを加えるQuickNotes on WP Dashboardなどの紹介。
特集記事や新着記事を見栄えよくスライドショーしてくれるWordPressプラグインまとめ « Web制作覚え書き
http://webdevtoolsoboegaki.wordpress.com/2010/06/22/%E7%89%B9%E9%9B%86%E8%A8%98%
E4%BA%8B%E3%82%84%E6%96%B0%E7%9D%80%E8%A8%98%E4%BA%8B%E3%82%92%E8%A6%8B%E6%A0%84%
E3%81%88%E3%82%88%E3%81%8F%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC/
イメージをフェードイン・アウトしてくれるプラグインWordPress Content Slideなどの紹介。
(URLが長いので繋げてアクセスするか、記事名で検索するかしてください)
WordPressでサイトを構築した際に活用したプラグイン5個+α - id:HolyGrailとid:HoryGrailの区別がつかない日記
http://d.hatena.ne.jp/HolyGrail/20110228/1298889864
会員登録時に必要な項目を追加する、Cimy User Extra Fieldsなどの紹介。
WordPress 3.0対応のとっても便利なプラグイン集|コリス
http://coliss.com/articles/blog/wordpress/plugin/best-plugins-for-wordpress-3.html
管理画面のメニューに好きなアイテムを追加できるFavorites Menu Manager
や、投稿編集ページにカスタムフィールドのHTMLを挿入できるInsertMeta ShortCodeなどの紹介。
WP Social Bookmarking Light | NINXIT-BLOG
http://www.ninxit.com/blog/2010/06/13/wp-social-bookmarking-light/
はてぶ、Facebook、Twitter他、表示させたいものは各々で選択可
WordPress用Twitterコメントシステムプラグインリリース!– [Mu]ムジログ
http://musilog.net/webdesign/wordpress/twitter-anyware-comment-system.php
RTしてくれたTwitterの呟きがコメント欄に全文表示されるプラグイン “BackType Connect”がとても良い!
[WordPress] [Twitter] [net] | No Second Life
http://www.ttcbn.net/no_second_life/archives/1144
1つ上のと同じような機能です、お好みでどうぞ。
WordPresプラグイン「Twitter tools」のバージョンアップ版のインストールと設定、使い方を日本語で解説!:WordPress|アマモ場
http://logsoku.com/thread/academy6.2ch.net/english/1259371295/
466 :名無しさん@英語勉強中 :2010/03/16(火) 18:01:25
名称-----*見出し語---token----word family----type
1.SVL-----12,000--12,000 (11,811)--8,543--11,996 (11,807)
2.LDAE----22,065--24,458 (23,105)--11,658--17,423 (16,116)
3.RHWIED--15,775--16,849 (15,718)--10,631--14,337 (13,259)
4.NVA-----24,055--27,700 (25,030)--12,129--20,186 (17,727)
Longman Dictionary of American English (LDAE)
Random House Webster's Intermediate English Dictionary (RHWIED)
token 延べ語数
個々の語をそれぞれ1語と数える
type (異なり語 (数))
個々の語が2回以上繰り返された場合、1回のみ数える
lemma 基本形+活用形
wait, waits, waited, waiting:1語
society, societies, society’s, societies’:1語
leak, leaks, leaking, leaked, leaky, leakiness, leakage, leaker:1語
468 :名無しさん@英語勉強中 :2010/03/16(火) 18:09:38
How many words do native speakers know?
At present the best conservative rule of thumb that we have is that up to a vocabulary size of around 20,000 word families, we should
expect that native speakers will add roughly 1000 word families a year to their vocabulary size. That means that a five year old
beginning school will have a vocabulary of around 4000 to 5000 word families. A university graduate will have a vocabulary of around
20,000 word families (Goulden, Nation and Read, 1990).
http://www.fltr.ucl.ac.be/fltr/GERM/ETAN/bibs/vocab/cup.html
471 :名無しさん@英語勉強中 :2010/03/16(火) 18:23:03
語彙習得速度
native speakers will add roughly 1000 word families a year to their vocabulary size.
http://www.fltr.ucl.ac.be/fltr/GERM/ETAN/bibs/vocab/cup.html
img_passがimg_pathの間違いなんじゃないか、と思う以外は別にそんなに分かりにくいと思わないけどなぁ。
俺も同じようにすると思う。
Thumbnail, thumbnail, thumbnailsが紛らわしいと思うなら、
thumb_array = array.new(); while(img_path = gets()) thumb = Thumbnail.new(img_path) thumb_array.add(thumb) end
とすればよろし。
ギークではないし、どちらかといえば下手なのですが。
http://anond.hatelabo.jp/20090324005857
例えば、サムネイルを作る makeThumbnails という関数なら、
result = array.new() while(src = gets()) result.add(Thumbnail.new(src)) end return result
かもしれないし、例えばサムネイルを一覧表示時のアイコンに使うなら、index_iconsとか、gif化してアニメーションするならframesとかつけるかも。
ちなみに、perlなら $frame = shift @frame だ。
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
user: ユーザID password: パスワード ids_file: ids.txt done_file: ids_done.txt movies_dir: movies log4r_config: pre_config: global: INFO loggers: - name: app type: Log4r::Logger level: INFO outputters: - STDOUT - FILE outputters: - name: STDOUT type: Log4r::StdoutOutputter formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%H:%M:%S" - name: FILE type: Log4r::FileOutputter filename: "#{LOGDIR}/sangels.log" formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%Y-%m-%d %H:%M:%S"
require 'fileutils' require 'logger' require 'mechanize' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_movies") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log class IDFile def initialize(file) @file = file unless File.exist?(@file) Fileutils.touch(@file) end end def ids(contains_comment = nil) File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty? nil elsif contains_comment true else not /^\s*\#/ =~ x end } } end def add(id) ids = ids(true) unless ids.any? {|x| x == id} write(ids + [id]) end end def delete(id) ids = ids(true) if ids.any? {|x| x == id} write(ids - [id]) end end def write(ids) File.open(@file, "w") {|io| ids.each {|x| io.puts x} } end end $log.info("BEGIN #{$0} ================") exit_code = 0 begin ids_file = IDFile.new($config.ids_file) done_file = IDFile.new($config.done_file) movies_dir = $config.movies_dir wget = WGet.new sangels = SAngels.new sangels.login($config.user, $config.password) ids_file.ids.each {|id| begin movies = sangels.movies(id) rescue SAngels::Movies::InvalidMoviesError $log.warn("invalid movie id: #{id}") next end dir = File.expand_path(id, movies_dir) movies.each {|link| wget.retrieve(link.href, dir) } expected = movies.movie_links.map{|x| File.basename(x.href)} actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)} if (expected - actual).empty? done_file.add(id) ids_file.delete(id) end } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
require 'fileutils' require 'logger' require 'mechanize' require 'ostruct' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_images") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log $log.info("BEGIN #{$0} ================") exit_code = 0 begin movies_dir = $config.movies_dir sangels = SAngels.new sangels.login($config.user, $config.password) thumbnails = sangels.thumbnails Dir.glob("#{movies_dir}/*").each {|dir| next unless File.directory? dir id = File.basename(dir) url = thumbnails.url(id) unless url $log.warn("#{id} is not found") next end path = File.expand_path("00_thumbnail#{File.extname(url)}", dir) next if File.exist? path $log.info("retrieving #{url}") thumbnail = thumbnails.get_file(id) File.open(path, "wb") {|io| io.write(thumbnail)} } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
BASEDIR = File.dirname($0) require "#{BASEDIR}/util" $config = load_config(BASEDIR) movies_dir = $config.movies_dir Dir.glob("#{movies_dir}/*") {|dir| next unless File.directory? dir name = File.basename(dir) files = Dir.glob("#{dir}/*.wmv").sort File.open("#{movies_dir}/#{name}.m3u", "w") {|io| files.each {|file| io.puts "#{name}/#{File.basename(file)}" } } File.open("#{dir}/00_movies.m3u", "w") {|io| files.each {|file| io.puts "#{File.basename(file)}" } } }
require 'mechanize' require 'hpricot' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" class SAngels HOST = "real2.s-angels.com" LOGIN_URL = "http://#{HOST}/member/" INFO_URL = "http://#{HOST}/teigaku/item.php" THUMBNAILS_URL = "http://#{HOST}/teigaku/" THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/" def initialize() @agent = WWW::Mechanize.new end def login(user, password) login_form = @agent.get(LOGIN_URL).forms.find {|form| form.fields.any? {|field| field.name == "frmLoginid"} } login_form.frmLoginid = user login_form.frmPw = password @agent.submit(login_form) end def movies(id, no_validate = nil) Movies.new(@agent, id, !no_validate) end def thumbnails Thumbnails.new(@agent) end class Thumbnails def initialize(agent) @agent = agent doc = Hpricot(@agent.get_file(THUMBNAILS_URL)) elems = doc.search("div[@class=realthum]/a") @links = Hash( elems.map {|elem| href = elem["href"] id = $1 if /ID=(.+)/ =~ href url = elem.search("img")[0]["src"] [id, url] }) end def get_file(id) @agent.get_file(url(id)) end def url(id) @links[id] end def exist?(id) url(id) end end class Movies class InvalidMoviesError < StandardError end def initialize(agent, id, no_validate) @agent = agent @id = id if !no_validate && !valid? raise InvalidMoviesError end end def info_page_url "#{INFO_URL}?ID=#{@id}" end def info_page @agent.get(info_page_url) end def movies_page @agent.click(info_page.links.find {|link| /P=10/ =~ link.href}) end def movie_links movies_page.links.select {|link| /wmv$/ =~ link.href }.sort {|a, b| File.basename(a.href) <=> File.basename(b.href) } end def valid? info_page.uri.to_s == info_page_url end def each(&block) orig_links = movie_links orig_links.each {|orig_link| link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)} block.call(link) } end end end
require 'log4r' require 'log4r/yamlconfigurator' require 'singleton' require 'fileutils' require 'ostruct' def Hash(a) Hash[*a.flatten] end def load_config(basedir) OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)}) end def new_logger(name) Log4r::Logger.new("app::#{name}") end def prepare_logger(basedir, logdir = nil) logdir ||= basedir Log4r::YamlConfigurator["LOGDIR"] = logdir Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml") end class NullObject include Singleton def method_missing(message, *arg) NullObject.singleton end end class WGet class << self attr_accessor :log def initialize super @log = NullObject.singleton end end def log self.class.log end def retrieve(url, dir) FileUtils.mkdir_p(dir) file = File.expand_path(File.basename(url), dir) if File.exist?(file) log.info("already retrieved #{url}") return true end tmp = "#{file}.part" log.info("retrieving #{url}") ret = system("wget", "-c", "-O", tmp, url) if ret log.info("retrieving succeeded #{url}") File.rename(tmp, file) else if $? == 0x020000 # Ctrl-C exit($?) else log.error("retrieving failure #{url} (#{$?})") end end return ret end end