はてなキーワード: Hatena Inc.とは
APV PDF Viewer
https://play.google.com/store/apps/details?id=cx.hell.android.pdfview
https://play.google.com/store/apps/details?id=com.adobe.flashplayer
ROVIO MOBILE LTD.
https://play.google.com/store/apps/details?id=com.rovio.angrybirds
Advanced Task Killer Froyo
RECHILD
https://play.google.com/store/apps/details?id=com.rechild.advancedtaskkillerfroyo
GOOGLE INC.
https://play.google.com/store/apps/details?id=com.google.android.apps.androidify
ROVIO MOBILE LTD.
ROVIO MOBILE LTD.
https://play.google.com/store/apps/details?id=com.rovio.angrybirdsseasons
Angry Birds Space
ROVIO MOBILE LTD.
https://play.google.com/store/apps/details?id=com.hatena.android.bkuma.girls
Cache Cleaner
JRUMMY16
https://play.google.com/store/apps/details?id=com.jrummy.cache.cleaner
これでキャッシュ削除後、設定からアプリを見るとまだキャッシュが残ってる^^;
https://play.google.com/store/apps/details?id=jp.smapho.battery_mix
CallFilter
https://play.google.com/store/apps/details?id=jp.co.telemarks.CallFilter2
Car Conductor: Traffic Control
DROIDHEN CASUAL
https://play.google.com/store/apps/details?id=com.droidhen.car3d
GOOGLE INC.
https://play.google.com/store/apps/details?id=com.android.chrome
NOUMENA INNOVATIONS
https://play.google.com/store/apps/details?id=com.noumena.ikof
GBookmark
PUTENDAR
https://play.google.com/store/apps/details?id=com.amlegate.gbookmark
Google Chrome to Phone
GOOGLE INC.
GOOGLE INC.
https://play.google.com/store/apps/details?id=com.google.android.apps.reader
GOOGLE INC.
https://play.google.com/store/apps/details?id=com.google.android.inputmethod.japanese
Ks Uninstaller
KUGO
https://play.google.com/store/apps/details?id=com.kugoweb.uninstaller
KINGDOM CONQUEST 【RPG】ロールプレイング
SEGA CORPORATION
https://play.google.com/store/apps/details?id=jp.co.sega.kingdomconquest
Lep's World
NER BROTHERS
https://play.google.com/store/apps/details?id=at.nerbrothers.SuperJump
MX TECHNOLOGIES
https://play.google.com/store/apps/details?id=com.mxtech.videoplayer.ad
My docomo
https://play.google.com/store/apps/details?id=jp.co.nttdocomo.mydocomo
JOHN YOO
https://play.google.com/store/apps/details?id=nadaptrend.nhk
https://play.google.com/store/apps/details?id=jp.nhk.netradio
NicoRo α^2
SHISEI
https://play.google.com/store/apps/details?id=jp.sourceforge.nicoro
ZXING TEAM
https://play.google.com/store/apps/details?id=com.google.zxing.client.android
Shazam
SHAZAM ENTERTAINMENT LIMITED
https://play.google.com/store/apps/details?id=com.shazam.android
SmartTraining
AWWA
https://play.google.com/store/apps/details?id=com.awwa
SMART TOOLS CO.
https://play.google.com/store/apps/details?id=kr.aboy.tools
Whipper+
HAAPPSS
https://play.google.com/store/apps/details?id=jp.HAappss.Whipper2
dメニュー
https://play.google.com/store/apps/details?id=com.nttdocomo.android.docomo_market
iRunner
DROIDHEN CASUAL
https://play.google.com/store/apps/details?id=com.droidhen.irunner
PIXIV INC
https://play.google.com/store/apps/details?id=jp.pxv.android
tSpyChecker
TAOSOFTWARE CO.,LTD
https://play.google.com/store/apps/details?id=jp.co.taosoftware.android.spychecker
https://play.google.com/store/apps/details?id=jp.radiko.Player
TETSUYA AOYAMA
https://play.google.com/store/apps/details?id=jp.r246.twicca
MocoGame
https://play.google.com/store/apps/details?id=jp.mapp.yusha&feature=search_result
エルスの天秤(有料)
いまいちキャッシュ削除に不安が残る。ただ、重い時に最適化を行うと軽くなる。
では~。
「社長、ここは一体……?」
「はてなの中枢だ。
上の社屋などガラクタにすぎん。はてなの技術は、全てここに結晶しているのだ。
お前たちはここで待て。ここから先は社員しか入れない聖域なのだ。」
「なんだこれは?!
f-starがこんなところまで…… 一段落したら全て焼き払ってやる!!」
これこそ、はてなの力の根源なのだ。
素晴らしい。500日もの間、社長の帰りを待っていたのだ!」
これから社長の帰還を祝って、諸君にはてなの力を見せてやろうと思ってね……
「ふはっはっはっはっ……素晴らしい。
最高のショウだと思わんかね?
「何をする!
くそぉ……返したまえ……いい子だから。さあ!
……はっはっはっ、どこへ行こうというのかね?」
「そのセッションCookieを大事に持ってろ! itkzのタッパーと引き替えだ!」
「立て! 鬼ごっこは終わりだ!
……終点がデータセンターとは、上出来じゃないか。こっちへこい!」
「これがデータセンターですって?
あなたにrootは渡さない!
今は、Hatena Inc.がなぜ滅びたのか、私よくわかるの。
シリコンの谷の歌にあるもの。
どんな素晴らしい理想を掲げても、
かわいそうなブックマーカーたちをあやつっても、
京都を離れては生きられないのよ!」
「落ち着いてよく聞くんだ。
……滅びのIDを教えて。ぼくも一緒に言う。」
「えっ……」
「ぼくの左手に、手を乗せて……」
……
「時間だ!答えを聞こう!!」
「「DASM!」」
はてな(笑) 変な会社(笑) 増田(笑) ホッテントリ(笑) Rimo(笑) セルクマ(笑) はてなスター(笑) はてなRSS(笑) はてなグループ(笑) 人力検索(笑) おとなり日記(笑) しなもん会長(笑) ○○欲しい!(笑) はまぞう(笑) 増田(笑) 非モテ(笑) 非コミュ(笑) クネクネ(笑) けまらしい(笑) 断片部(笑) はてな女子(笑) ゴリラブーツ(笑) はてな村(笑) モヒカン族(笑) 無断リンク禁止(笑) 村長(笑) アンテナ登録数(笑) idトラックバック(笑) はてなちゃん(笑) 幕府を作りたいのですが(笑) 快適、安心、シンプルなはてなのブログ(笑) はてなのサービスは風で動いています(笑) 名前を隠して楽しく日記(笑) 増田(笑) 自転車通勤(笑) わんわんワールド(笑) Hatena Inc.(笑) はてなワールド(笑)
Shibuya.ex-Hatena は主に東京近辺のはてな退職者による非営利団体です。各個人の生活の向上を目的に、勉強会ならびにカンファレンスの開催、情報交換などを行うコミュニティを目指しています。
Shibuya.ex-Hatena は株式会社はてなを退職し、新天地へと踏み出すことを望む方であればどなたでも無料で参加できます。
6年。
2001年、近藤淳也の人力検索により開始されたはてなは、「日本のグーグル」などと呼ばれもした、ともすれば過剰とすらいい得る評価を経て、あたりのそこここに満ち充ちていた「Hatena Inc. とは、そして、はてなスターとはなんだったのか」という思いによって、ふたたび曲がり角にさしかかった。
はてなは、日本社会の「あちら側」と「こちら側」とを取り結ぶ、もっとも古くてもっとも新しい、そして、もっとも重要な企業だ。はてなでの時間を総括し、次の10年を自らの手で創り出すために、我々は Shibuya.ex-Hatena を結成した。
2007年11月1日(木)に Shibuya.ex-Hatena 初のイベント、Shibuya.ex-Hatena Conference #0 を開催します。
自己採点は60点? Hatena Inc.が過ごしたシリコンバレーでの1年間:インタビュー - CNET Japan
このインタビューみてて、いままではてなワールドってなんだろーなーと検討もつかなかったんだけどピンときてしまった。
予想する。
はてなワールドはGUIベースの自己認識が可能な状態でのネットブラウジングだ。
以前はみんなそこを目指してきた。
自己の存在が視認できる状態での行動。
RPGも初期の迷路のころは自己視点だけだった。これがWEBブラウジングだ。
RPG2.0とやらはドラクエのように自分が「どれ」だか認識できた状態でアクションをおこす。
もちろんこの傾向はネットにもあった。
卑近としてはセカンドライフもそうだ。
だが、はてなはおそらくセカンドライフのように自己のワールド内にコンテンツを誘致しようとせずにいままでどおり既存のコンテンツを利用するだろう。
ページ内を歩き回るスクリプトがあったように。
はてなの技術レベルはDBもmySQLレベル育ちだしコンパイルできるような言語の土壌があまりない。
MMOのようなワールドの創出はあまり考えられない。
だが、すでにぼくらはその予兆をはてなのテストにより見て取ることができた。
ブログペットが自分のブログから出れない時代はここで終わるかもしれない。
なんてことを思った。だとしたら面白い。リリースが楽しみになってきた。
はてなワールドって何だと思う?
にゃー。
/* 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
近藤さんは日本法人のはてな社長を辞めて新しい人を迎え入れた方が良いのではないか、と思ったりする。
はてなが他のウェブサービスとは一線を画するのは、社長である近藤さんが持ち前の好奇心や向上心で実行動をして日本のリアルネットワークにガンガン顔を出して会社を引っ張っていたからこそと思っていまして、初期の「他のベンチャー会社を一日オフィスにしてみる」なんかは見ていて「おもしろいなあ」と感じられたわけです。
近藤さんはここ最近「そうだ、京都行こう」みたいな日記ばかりで、この前なんかは日本に「来ました」と日本というフィールドには興味をなくしているとしか思えず、はてなが日本でのウェブサービスを向上させていくには近藤さんが社長で居続けることは株式会社はてな成長の障害になりかねないと思ってしまいます(梅田さんなどの他の取締役も日本いないし)
今の日本法人のはてなは、実際の社内活動は知りませんけど、はてなという会社を維持しているだけと見えてしまっていて、個性的な社員の人たちもいるけど、あくまで「社員」という立場でしかないから対外的な活動をするにあたってはあまり期待はできないというか。
積極的な対外活動ができたのは近藤さんが「社長」であるから、他のベンチャー会社も話を聞いてくれたわけで、「はてな社員」が持ち込んだって相手にしてくれるかはわからない。最近会社で「お外に遊び」に行ったりしないんですか?
会社法を知らないので適当に書きますが、はてなホールディングス(HH)を作って、株式会社はてなとHatena Inc.を子会社にしてHHとHatena Inc.を近藤さんが社長、株式会社はてなは日本をフィールドにバリバリと先へ行こうとするようなバイタリティーのある人をトップにして欲しいなあ。
こんなことを書くのは多分はてなが大きくなって「見えなく」なったからなんだろうなあ。大きくなっていることは別に文句は無いのですが。
secondlife「もう我慢できねぇ! こんな会社、辞めてやる!」
naoya「待てよsecondlife! あと少し、もう少しだけでも!」
wanpark「……諦めろよ、naoya」
naoya「wanpark? おまえまでそんなことを言うのか!?」
wanpark「Hatena inc.は失敗し、会長は野生に返り、望夫はあちら側に行ってしまった……お終いだよ……」
wanpark「いまの社長は一行ポエムを生産するだけの機械(マシーン)だ……それはnaoya、おまえがいちばん理解しているはずだぜ……」
naoya「…………」
wanpark「じゃあな。またいつか、どこかで会おうぜ」
riko「あたいもここで降りさせてもらうよ」
naoya「rikoたん……」
riko「このまま一緒に沈没するのはまっぴらごめんだ。あたいは好きにやらせてもらう」
naoya「いままでありがとう、rikoたん」
riko「……あんたたちのこと、嫌いじゃなかったよ」
kiyohero「いってしまいましたね」
naoya「kiyohero、おまえはどうするんだ?」
kiyohero「旅に出てみようと思います。世界各地を見て回りたい。そして多くの人に、はてなで起こったことを伝えたいんだ……」
naoya「そうか。おまえならきっとやれるよ、kiyohero」
kiyohero「ありがとう、naoyaさん。さようなら……」
naoya「だけど社長、俺はずっと傍にいるから……」
naoya「いつまでも傍にいるから……」
Rich is rich.
機能変更、お知らせなど - はてなプレスリリース - Richard ChenのHatena Inc.取締役就任に関するお知らせ
ごーごるに詳しい人がリチャードちゃんの人となりを語りだしたりするのを希望。
「社長、ここは一体……?」
「はてなの中枢だ。
上の社屋などガラクタにすぎん。はてなの技術は、全てここに結晶しているのだ。
お前たちはここで待て。ここから先は社員しか入れない聖域なのだ。」
「なんだこれは?!
はまちやがこんなところまで…… 一段落したら全て焼き払ってやる!!」
これこそ、はてなの力の根源なのだ。
素晴らしい。700日もの間、社長の帰りを待っていたのだ!」
これからHatena Inc.の復活を祝って、諸君にはてなの力を見せてやろうと思ってね……
どぎゃーん!
「ふはっはっはっはっ……素晴らしい。
最高のショウだと思わんかね?
見ろぉ! ブックマーカーがゴミのようだ!!!!」
「何をする!
くそぉ……返したまえ……いい子だから。さあ!
……はっはっはっ、どこへ行こうというのかね?」
「そのUSBメモリを大事に持ってろ! 小娘の命と引き替えだ!」
「立て! 鬼ごっこは終わりだ!
……終点がサーバルームだとは、上出来じゃないか。こっちへこい!」
「これがサーバルームですって?!
ここはお墓よ。あなたとあたしの。
あなたにrootは渡さない!
今は、Hatena Inc.がなぜ滅びたのか、私よくわかるの。
シリコンの谷の歌にあるもの。
どんな素晴らしい理想を掲げても、
かわいそうなブックマーカーたちをあやつっても、
渋谷区を離れては生きられないのよ!」
「ハテナ。落ち着いてよく聞くんだ。
……滅びのIDを教えて。ぼくも一緒に言う。」
「えっ……」
「ぼくの左手に、手を乗せて……」
……
「時間だ!答えを聞こう!!」
「「ダスム!」」