はてなキーワード: classとは
http://chiebukuro.search.yahoo.co.jp/search?fr=common-navi&p=DYM&class=1&flg=0&ei=UTF-8
タイでの全裸騒ぎが報道された日から急激に投稿数が増えているんだけど、SEO的に効果あるんかね。
こんな質問が何百件ってある。
quizletcom/class/2594322/
quizletcom/class/2594324/
quizletcom/class/2594326/
quizletcom/class/2594327/
quizletcom/class/2594329/
quizletcom/class/2594330/
quizletcom/class/2594331/
quizletcom/class/2594333/
quizletcom/class/2595678/
quizletcom/class/2595682/
quizletcom/class/2595683/
quizletcom/class/2595684/
quizletcom/class/2595686/
quizletcom/class/2595688/
quizletcom/class/2595690/
quizletcom/class/2595691/
Masuda A boneを利用します。
http://d.hatena.ne.jp/ku__ra__ge/20080311/p5
下記の設定済みスクリプトをコピペして使えば、Masuda A boneをインストールする必要はありません。
ChromeならTampermonkey、FirefoxならGreasemonkeyをインストールします。
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja
https://addons.mozilla.org/ja/firefox/addon/greasemonkey/
メニューからツール-Greasemonkey-ユーザスクリプトの管理
(もしくはアドオンマネージャのユーザースクリプトをクリック)
var ignore行を編集すれば、好きな言葉を追加できます。
AutoPagerizeに対応していません。
URLが2行連続するとあぼーん対象になってしまうので、本文があればあぼーん対象から除外したい。
// ==UserScript==
// @name Masuda A bone
// @namespace http://www.petitnoir.net/
// @description
// @include http://anond.hatelabo.jp/
// @include http://anond.hatelabo.jp/?page=*
// ==/UserScript==
///////////////////////////////////////////////////////
//あぼーんしたい言葉を「""」でくくって入力します。複数個追加したい場合は「,」でくぎります。
//入力例
// igonore =["あぼーんしたい言葉1","あぼーんしたい言葉2","あぼーんしたい言葉3"]
// var ignore = ["死ね","糞","クソ","くそ","<●>","ばーか","スイーツ(笑)"];
var ignore = ["[0-9a-zA-Z/\-]https?://"];
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
//
var abonemessage = "__";
///////////////////////////////////////////////////////
(function abone(){
//本文
var section = document.evaluate('//div[@class="section"]',document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
for (i=0; i < section.snapshotLength; i++) {
var sec = section.snapshotItem(i);
var p = sec.textContent;
for (t=0; t < ignore.length; t++){
var reg = p.match(ignore[t]);
if(reg){break;}
}
if(reg){
while(sec.firstChild){
sec.removeChild(sec.firstChild);
}
var message = document.createElement('h3');
message.textContent = abonemessage;
}
}
//言及
var refererlist = document.evaluate('//ul/li',document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
for (i=0; i < refererlist.snapshotLength; i++) {
var list = refererlist.snapshotItem(i);
var p = list.textContent;
for (t=0; t < ignore.length; t++){
var reg = p.match(ignore[t]);
if(reg){break;}
}
if(reg){
for(y=0;y < 8 ; y++){
list.removeChild(list.firstChild);
}
var message =document.createElement('span');
message.textContent = abonemessage;
list.insertBefore(message, list.firstChild);
}
}
})();
呼び出し方が変わってきます。詳細は、以下のコードをみてください。
① import MODULE
import decimal y = 0 for i in range(1,10): y = y + decimal.Decimal('0.1')
from decimal import Decimal y = 0 for i in range(1,10): y = y + Decimal('0.1')
from MODULE.CLASS import CLASS_METHOD
とはできない。
http://stackoverflow.com/questions/21347346/python-importerror-no-module-named-datetime
結構簡単にできた。
ここから、ページ切り替えてURLを収集する処理も追加すれば、
クローロング部分は完成。
require 'nokogiri'
url = 'http://ja.aliexpress.com/category/200003482/dresses.html?spm=2114.52010108.6.7.gT0qlW&addpid=32546825642&isOnSale=yes%22'
charset = nil
end
doc = Nokogiri::HTML.parse(html, nil, charset)
num=0
doc.css('a[class = "product "]').each do |product|
p product.attribute("href").text
p num = num+1
end
SIerが欲しがるプログラマーなしでもシステムできちゃう製品あるでしょ。
分岐をアイコンのようなやつでつなげるとか、ものっすごく単純にしたドメイン固有言語をコピペするだけでシステム完成するやつ。
パソコンのノの字も知らないオッサンは、上流の設計をそのまますぐに設定をしてお客に売る。
人月がめっちゃ安くなるよ―!!っていうアイドルと付き合えちゃうくらいなレベルの妄想をもっているらしい。
でもね。
今まで見てきたけど全部燃えてたよ。
ガソリンがたんまり仕込まれている焼夷系の地雷なんだよあれは。
大体お客さんは安い安いとか言っときながら、SIでシステム買おうとしているから絶対に自分らの社内ルールに合わせた複雑な要望を持っている。
社内ルールをパッケージに合せることや、システムの設計と社内のルールを歩み寄らせるというのは理想だが根付いていない。
本来ならばシステム担当役員が企業全体のフローごと改革するような強い権限を持っていればいいが、システムを買う窓口になっているお客サンがわのSEは普通の平だし、ヘタしたら外部の人間だし、
だから企業ごとのカスタマイズが必要になるのだが、あのノンプログラマー大丈夫系製品はほっとんどかゆいところに手が届かない。
ノンプログラマー大丈夫ってことは、プログラミングでの抽象度の高い操作を極力無くしてほぼ設定段階で済ませようとしているのだとおもう。
そしてノンプログラマーでも大丈夫系製品なので本当にノンプログラマーで構成された上流たちが、お客の要望をきいて「できそうじゃね?」「販売元にきいてみっべ」「いざとなれば誰か外注すっか」みたいなノリでやりがち。
で、「仕方ないプログラマ様にきていただぐべ」とかなるんだけれども
プログラマ様も謎の製品について学習するコストもかかってしまって余計時間がかかってしまう。
はっきりいってピュアJavaで書いてくれたほうがわかりやすい。
この手の製品で本当に挙動が分からなくて、サポートに電話しても要領を得なくて、でも上からは「おら、やれよバカ」っていわれて
しかたないからClassをデコンパイルして読んで、できません…っていうこともできないから、結局別プロセスで動かす逐一データを変換するような物をつくらなくちゃならなくなった。
それ誰が面倒を見るの?
納期に迫られてしかたねーしかたねーでとりあえず作ったし、オレは外部の人間だからすぐ抜けちゃうけどさ
こんなことここ五年で4回くらいみた。
簡単にする仕組みは良いよ。
ブラックボックスだし小回り聞かないし、でも色々な要望がでてきて結局袋小路に追い詰められるんだよ。
使って良いのはプログラミング言語の上を覆うくらいのフレームワークまでだね。
あとね。
作っている途中で思い出す感じなんだよ、
そんな状態なのに機能が制限されている簡単ツールなんて使うなよ。
ねえねえ。
私の持てる知識を絞り出してなんとか完成しました。
**************************************************************************************
完成したサイトがこちらです。
LapyNetニュース
**************************************************************************************
私は普段webとは関係ない仕事してます。なんとか休日を利用して、
メインのコードはこんな感じ
----------------------------------------------------------------------------------------------------------------------
App::uses('Sanitize', 'Utility'); class RssfeedsController extends AppController { public $helpers = array('Html','Form','Session','Number','Cache'); public $uses = array( 'Rssfeed', 'Tweet', 'Wadai', 'Rank', 'Oracle' ); ************************************************************************************** public function index() { $title_for_layout = "LapyNetニュース"; $content = "Hello World!!"; $this->set(compact('title_for_layout','content')); if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' = > array( 'and' = > array( 'Rssfeed.time' = > $today, )), 'order' = > 'tweets desc', 'limit' = > '50' ); $this- >set('posts',$this- >Rssfeed- >find('all',$params)); $paramz = array( 'order' = > 'Rssfeed.id desc', 'limit' = > '10' ); $this->set('posts2',$this->Rssfeed->find('all',$paramz)); $paramz = $this- >Rssfeed- >query('SELECT id,title FROM rssfeeds order by id desc limit 10'); $this->set('posts2', $paramz); $parapara = $this- >Oracle- >query('SELECT id,title FROM oracles order by id desc limit 10'); $this- >set('postx', $parapara); $funking = $this- >Rank- >query('SELECT id,frank FROM ranks where creation=(select max(creation) from ranks)'); $this- >set('funking', $funking); } ************************************************************************************** public function mizuno() { $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '30' ); $recent_posts = $this->Oracle->find('all',$parapara); return $recent_posts; } ************************************************************************************** public function wadai() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 4 )), 'order' => 'tweets desc', 'limit' => '100' ); $this->set('posts',$this->Rssfeed->find('all',$params)); $this->set("title_for_layout","2CHニュース-LapyNetニュース"); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postyy',$this->Rssfeed->find('all',$paramz)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '10' ); $this->set('postyx',$this->Oracle->find('all',$parapara)); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function hot() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 3 )), 'order' => 'tweets desc', 'limit' => '20' ); $title_for_layout = "LapyNetニュース"; $this->set("title_for_layout","ニュース-LapyNetニュース"); $this->set('posts',$this->Rssfeed->find('all',$params)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '10' ); $this->set('postxx',$this->Oracle->find('all',$parapara)); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postsxxx',$this->Rssfeed->find('all',$paramz)); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function newnew() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 2 )), 'order' => 'tweets desc', 'limit' => '20' ); $this->set("title_for_layout","エンタメニュース-LapyNetニュース"); $this->set('posts',$this->Rssfeed->find('all',$params)); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '10' ); $this->set('postszz',$this->Rssfeed->find('all',$paramz)); $paramz = $this->Oracle->query('SELECT id,title FROM rssfeeds order by id desc limit 10'); $this->set('postszz', $paramz); $parapara = $this->Oracle->query('SELECT id,title FROM oracles order by id desc limit 10'); $this->set('postzy', $parapara); $funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)'); $this->set('funking', $funking); } ************************************************************************************** public function top() { if(date("G")>0 and date("G") < 7){ $today = date("Y-m-d", strtotime('-1 day')); }else{ $today = date("Y-m-d"); } $params = array( 'conditions' => array( 'and' => array( 'Rssfeed.time' => $today, 'Rssfeed.kubetu' => 1 )), 'order' => 'tweets desc', 'limit' => '20' ); $this->set('posts',$this->Rssfeed->find('all',$params)); $param = array( 'conditions' => array('times > current_timestamp + interval -600 minute and Kubetu = 4'), 'order' => 'tweets desc', 'limit' => '30' ); $this->set('posts2',$this->Rssfeed->find('all',$param)); } ************************************************************************************** public function view($id = null ) { $this->Rssfeed->id = $id; //驥崎ヲ√↑荳譁・i縺励> $user = AuthComponent::user(); $TwimStatus = ClassRegistry::init('Twim.TwimStatus'); $TwimStatus->getDataSource()->setToken(AuthComponent::user()); $statuses = $TwimStatus->tweet(); $rairai = $this->Rssfeed->read(title,$id); $alcol = $this->Rssfeed->read(); $this->set('post', $alcol); $this->set('post2', $user); $this->set('post3', $statuses); $this->set("title_for_layout",$rairai[Rssfeed][title]."-LapyNetニュース"); $paramz = array( 'order' => 'Rssfeed.id desc', 'limit' => '20' ); $this->set('postszz',$this->Rssfeed->find('all',$paramz)); $parapara = array( 'order' => 'Oracle.id desc', 'limit' => '30' ); $this->set('postzy',$this->Oracle->find('all',$parapara)); } ************************************************************************************** public function add() { if($this->request->isPost()){ if($this->Tweet->save($this->data)) { $this->Session->setFlash('seikou'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); }else{ $this->Session->setFlash('sipai'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); } } } ************************************************************************************** public function delete($id = null) { $this->Rssfeed->id = $id; $this->set('set', $this->Rssfeed->read()); $this->redirect(array('controller'=>'tweets','action'=>'delete',$this->data['tweet']['rssfeed_id'])); } ************************************************************************************** public function oracle() { if($this->request->is('post')) { $user = AuthComponent::user(); $TwimStatus = ClassRegistry::init('Twim.TwimStatus'); $TwimStatus->getDataSource()->setToken(AuthComponent::user()); $contents1 = $this->request->data['Rssfeed']['contents']; $contents2 = $this->request->data; $statuses = $TwimStatus->tweet($contents1); if($this->Rssfeed->save($contents2)) { $this->Session->setFlash('成功です。'); $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); $this->redirect($this->referer()); }else{ $this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11)); $this->Session->setFlash('失敗です。'); } } } ************************************************************************************** public function makelist() { $rssfeeds = $this->paginate(); if ($this->request->is('requested')) { return $rssfeeds; } else { $this->set('rssfeeds', $rssfeeds); } } } ---------------------------------------------------------------------------------------------------------------------- rssフィードはこんな感じです。 ---------------------------------------------------------------------------------------------------------------------- #!/usr/bin/php <?php header('Content-type: text/html; charset=UTF-8'); require_once ('/var/www/html/s/magpierss/rss_fetch.inc'); define('MAGPIE_CACHE_AGE', 60*5); define('MAGPIE_CACHE_DIR', '/var/www/html/s/cache/'); define('MAGPIE_OUTPUT_ENCODING','UTF-8'); $urls = array( '*********************************'); $items = getRssList($urls); echo '<ul>'; foreach ($items as $item) { $href = mb_convert_encoding($item['link'], "UTF-8", "auto"); $title = mb_convert_encoding($item['title'], "UTF-8", "auto"); $description = mb_convert_encoding($item['description'], "UTF-8", "auto"); $megami = mb_convert_encoding($description, "UTF-8", "auto"); ************************************************************************************** $all = 'http://urls.api.twitter.com/1/urls/count.json?url='.$href; $Rits = file_get_contents($all); $Olfe = mb_convert_encoding($Rits, 'UTF-8', 'auto'); $data = json_decode($Olfe); $tweets = $data->count; ************************************************************************************** $checkman = db_check_urls($href); $checkman2 = db_check_pr($title); $nowtimes = date('Ymd'); if($checkman == 0 &amp;&amp; $checkman2 == 0){ #$hrefs = urlencode($href); db_put_urls($nowtimes,$href,$title,$description,$tweets); echo "<li><a href=$href>$title</a><br>$megami<p>$tweets</p><p>$checkman</p></li>"; }else{ } } echo '</ul>'; ************************************************************************************** function getRssList($urls) { $rssitems = array(); foreach ($urls as $url) { $obj = fetch_rss($url); $rssitems = array_merge($rssitems, $obj->items); } return $rssitems; } ************************************************************************************** function db_check_pr($japanese){ $moji = mb_substr($japanese,0,2); if($moji == 'PR'){ return 1; }else{ return 0; } } ************************************************************************************** function db_check_urls($href){ require '/var/www/html/s/database_conf.php'; try { $db = new PDO($dsn, $dbUser, $dbPass); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'SELECT count(*) AS count FROM rssfeeds WHERE urls = :language'; $prepare = $db->prepare($sql); $languages = array($href); foreach ($languages as $language) { $prepare->bindValue(':language', $language, PDO::PARAM_STR); $prepare->execute(); $result = $prepare->fetchColumn(); if ($result > 0) { return true; }else{ return false; } } } catch (PDOException $e) { echo 'エラーが発生しました。内容: ' . h($e->getMessage()); } function h($var) { return htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); } } ************************************************************************************** function db_put_urls($nowtimes,$href,$title,$description,$tweets){ require '/var/www/html/s/database_conf.php'; try { $db = new PDO($dsn, $dbUser, $dbPass); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sikibetu = 5; $moto = "アニゲー速報VIP"; $sql = 'insert into rssfeeds (id, time,urls,title,contents,tweets,times,kubetu,teikyo) values (?, ?, ?, ?, ?, ?, ?, ?, ?)'; $prepare = $db->prepare($sql); $prepare->bindValue(1, 0, PDO::PARAM_STR); $prepare->bindValue(2, $nowtimes, PDO::PARAM_STR); $prepare->bindValue(3, $href, PDO::PARAM_STR); $prepare->bindValue(4, $title, PDO::PARAM_STR); $prepare->bindValue(5, $description, PDO::PARAM_STR); $prepare->bindValue(6, $tweets, PDO::PARAM_STR); $prepare->bindValue(7, 'cast( now() as datetime)', PDO::PARAM_STR); $prepare->bindValue(8, $sikibetu, PDO::PARAM_STR); $prepare->bindValue(9, $moto, PDO::PARAM_STR); $prepare->execute(); } catch (PDOException $e) { echo 'エラーが発生しました。内容: ' . h($e->getMessage()); } } ?>
---------------------------------------------------------------------------------------------------------------------
**************************************************************************************
参考にした書籍
CakePHP2 実践入門 (WEB+DB PRESS plus)
CakePHP2 実践入門 (WEB+DB PRESS plus)
作者: 安藤祐介,岸田健一郎,新原雅司,市川快,渡辺一宏,鈴木則夫
発売日: 2012/09/29
購入: 5人 クリック: 165回
Webアプリ開発を加速する CakePHP2定番レシピ119
Webアプリ開発を加速する CakePHP2定番レシピ119
**************************************************************************************
一番難しいところはtwitterログインとwebサイト連結でした。
ツイート数でランキングしてます、ネットの話題を見つけられます。
ホームページビルダーを使用しています。
今のホームページビルダーは昔と違って高機能ですね。
テンプレートも何種類もあって今はすごいです。
に分かれています。
今更cakephpを使っている人は少ないかもしれませんが、
twitterアカウントあるといつでも参加できますので、
無能なら黙っておけばいいのに!(でも、無駄口だけは叩きたくなるんだよね、どうしてだろねwww)
(他人ごと勢)
htnmiki めんどくさいからEさん以外はクビで
class-11-design 運よくどのタイプも遭遇してなくて良かったです・・・。
xevra 全部クビでいいんじゃまいか? メンドクセー
(ディスり勢)
tamtam3 わざわざ悪い面を見ず、その人の長所や良い面を見るだけも、大分仕事はやりやすくなるわけだが・zanac-ai これは居酒屋でドヤ顔で語るべき内容で、ネットに放流すべき内容ではないと思う。
penguaholic これあれだ、出来の悪い自己啓発系ののにおいがぷんぷんする。出来はすごく悪いと思う。
minaka_saikyo これを読んでいたらイラっとしてきた。「思いどおりにはいかないよ」と誰もから言われるようなタイプだったんじゃないか?
luccafort なんだこのゴミ記事以上の感想が出てこない。
higejr 飲み屋で上司から話されたら「まじですかすごいです勉強になります」って相槌打ちながら帰りたくなるタイプの話題
IzumiMihashi この中で問題のある主張をしているのはセクハラ人間だけで、他は全部まっとうな主張なので、むしろ上司というだけで自分の言うことを従順に聞かせられるものだと考えているブログ主に問題があるんじゃないかね。
(よく読めば補足を加えてる勢)
mojo_nobu 手持ちのカードを書き換えようとするのはあまり良くないんじゃないの?管理職のことはよくわからないけど。
kaz_the_scum 年上の部下といっても、階級差がある場合(正規と非正規)と異なり大変なんだろうなぁ・・・まぁ・・・私のような雑魚労働者は使えない年上の部下になることしかないので、精精雑魚としておとなしく働こう。
sakura_123 だいたいこういう場所に回される「年下の上司」って、『厄介者のクビ何人か切っておいてね。汚れ仕事の代わりに役職あげるから。何人クビ切ったかでお前の今後も決まるけど』ってパターンだと思ってました。
(ディスらない勢)
・よくできてる。攻略は実際にはなかなか難しいけど、「心を開きたくない年下の上司のタイプ」も当たってると思う。
・目指しているのはここなのだが…対象の価値観が学歴・家柄みたいな権威なので今からだと難易度高い “業績、技術、資格等の絶対的な能力で(ry”
・部下なしだけど。その通りと思うことも多々。もちもん自分にも、上司・先輩にも。
・“自分が辞めると会社が潰れると大きな勘違いをしている。残念なことにこういう人が辞めると大体会社は業績が上がり人が育つ。” ああ……
・これから先、人口分布の関係でこのような『年上の部下』を抱える企業は特定の業種に限らず増えていく筈なのだが、なぜかそれへの対処法を説いた書物は少ないので、貴重な指南ブログ。
点滅するカーソルを見るのが苦しい。
個人的にはCapsLockがCtrlになっていないこと以上に辛い。
…
Windowsなら「コントロールパネル→キーボード→カーソル点滅速度」をなしに振り切ることで、
gnomeなLinuxなら「設定→キーボード→テキストフィールドでカーソルを点滅させる」のチェックを外すことで、
ArchLinuxなら/sys/class/graphics/fbcon/cursor_blinkの中身を0にすることで
FreeBSDならXを入れないことで、
gvimなら.gvimrcに「set guicursor=a:blinkon0」と書き加えることで、
…
止められることには止められるけれど、
例えば、こういうクラスがあったとする
/** ** ゲームキャラのクラス **/ class Character { /** * 歩行の状態にする。 * @param $place 歩行する場所。 */ private function _walk($place){ $this->_state = Const::STATE_WALK; $this->_place = $place; } /** * 山を歩いている状態にする。 */ public function walkInMountain(){ $this->_walk(Const::PLACE_MOUNTAIN); } }
「walkIn~~ってメソッド名長くね?」
「良く使うメソッドだから、あんまり書くと、ソースが読みづらくなるんだよね。」
という突っ込みが入ったとする。
対応として、
walkInMountain → walkInMt
とかやってもいいけど、逆に分かりづらくなる。mtってなんやねんと。
/** ** 歩行クラス **/ class Walk { private $_chara = null; public function __construct($chara){ $this->_chara = $chara; } /** * 歩行の状態にする。 * @param $place 歩行する場所。 */ private function _walk($place){ $this->_chara->state = Const::STATE_WALK; $this->_chara->place = $place; } /** * 山を歩いている状態にする。 */ public function mountain(){ $this->_walk(Const::PLACE_MOUNTAIN); } }
とすれば、呼び出し元からは
$chara = new Character(); $chara->walk->mountain();
みたいに、
主語->動作->述語
という構文で記述できるので、すっきりすると思う。
before) $chara->walkInMountain(); after) $chara->walk->mountain();
でも、やりたいことはそういうことだ!
つたわれ!俺の思い!
int write() { int numberWritable = 0; : }
こんなのは、
int write() { int number = 0; : }
にしてしまえ!
みたいな。
class Obj{ HashMap<String,Double> v = new HashMap<>(); public double distance(Obj o){ double s = 0; for(String k:v.keySet()){ s += (o.v.containsKey(k))?(Math.pow(o.v.get(k)-v.get(k),2)):(0); } if(s == 0)return 0; return Math.sqrt(s); } } Obj p1 = new Obj(); Obj p2 = new Obj(); p1.v.put("X",1.0); p1.v.put("Y",2.0); p1.v.put("Z",3.0); p2.v.put("X",3.0); p2.v.put("Y",4.0); p2.v.put("Z",5.0); System.out.println(p1.distance(p2));
ううううつくしい!
1. 括弧の省略
PHPにおいてはif文やwhile文において、1行であれば括弧を省略することができます。
<?php if (...) hoge(); while(...) hoge();
これは、保守性・管理性を上げたいのであればやってはいけません。括弧がつくことで視認性が下がることなどありません。むしろインデントに騙されてしまい、ミスが増えます。例えば下の例です。
<?php $a=0; $b=0; while ($a < 10) $a++; $b++;
さて、このとき $a はいくつですか? $b はいくつですか?
答えは $a が 10、 $b は 1 です。$b は while のスコープにはないので、ループしません。
括弧でくくられていればこのようなミスを防げます。括弧はきちんと書きましょう。
2. 三項演算子
ネストしすぎると可読性が損なわれるため注意が必要ですが、うまく使うとスマートに書けます。うまく活用しましょう。
3. switch文
条件分岐が多い時にうまく使いましょう。
ただし if 文で素直に書いた方が速度は速いという噂もあります。
実用上の違いはほとんどありませんので、チームの方針に従いましょう。
4. ループ文
PHP にはループ制御構文が用意されています。主に下記の3つを用途にあわせてうまく使い分けましょう。他にもループに関する構文や関数はありますが、基本的には下記で事足りるでしょう。
主に回数でループさせたい場合は for 文を利用するといいでしょう。
<?php for ($i=0; $i<10; $i++) { //
現実問題 中身を実装するとこういうことだよねぇ。
class { bool nullable, bool value, bool operator == (NULL){ if(nullable){ return true; } return false; } bool operator == (bool){ if(nullable){ throw; } if(value){ true; } return false; }
というオーバーヘッドとフットプリントを許容してまでクラス化するようなものなんだろうか?
便利そうだけど すっげぇ 気になる。
C#だからいいような気もするが、 bool演算一つのために 関数コールして ifステートを複数回判定するのはオーバーヘッドが大きすぎる気がする。
俺は請負で業務アプリを作成する残念なお仕事をするプログラマーだ。
最近はJavaとかJavaScriptを書いてたりする。
先日PHPのコードを久々に書いたのだがあまりのすごさに手が震えてきた
$hoge = new Hoge(); $hoge.execute();
これが動かない。なぜだ。
メソッドの呼び出しが「->」と気づくのに数分の時間を要した。
"hello world".split(" ");
勿論これは動かない。
現れる警告文。
この関数は PHP 5.3.0 で 非推奨となりました。 この機能を使用しないことを強く推奨します。
ほう。なにを使えと。
。。見当たらない。。。
下のほうの注意に書いてあるなぜここなのか。
なるほど正規表現がいらないなら「explode」を使えとな。
毎回悩む、なぜ爆発なのかと。
あれ?そういえば「explode」ってマルチバイト対応してなかったな。
なら「mb_split」か?
「split」が非推奨なんだから非推奨だろうがヒントはあるだろうし、一応見ておくか。
非推奨じゃない!
非推奨じゃない!
mb_splitは非推奨じゃないんだ!
俺は考えるのをやめた。
「preg_split」にオプションで「UTF8」をつけるのが正解だったような。
俺は考えるのをやめて爆発の呪文を唱えた。
Symfony2はDIをサポートしているからInjectするようにしようか。
たぶんAutowiredくらいあるだろう。
class Service { /** * @var \PDO */ protected $pdo; /** * @param \PDO $pdo * @Inject */ public function setPDO(\PDO $pdo) { $this->pdo = $pdo; } }
・・・・?
俺は震える手を押さえながらそっとパソコンの電源を切った。
守備力だとか、耐性だとかは、モンスターの属性なので、影響はモンスター側で面倒見てもらいたいから、
攻撃でHPを減らすのは、モンスターのメソッド経由になると思う。
結局、
class 勇者 : method attack(モンスター: monster): monster.attackedBy(self.attackPower)みたいなコードになると思うんだけど。
ぐうの音もでません、その通りですね。
攻撃方法の実装もわかりました。
遅延攻撃や即死攻撃に対応したい場合、例えば次のように変更すればよいでしょうか。
interface 攻撃方法: /** 対称を攻撃 */ method apply(攻撃対象: atackee);
それで、その他のクラスは下記のような感じに。
class 勇者 : // 中略 method attack(モンスター: monster): self.currentAttackMethod.apply(monster) class 即死攻撃 : implements 攻撃方法 method apply(攻撃対象: atackee): atackee.kill class 通常攻撃 : implements 攻撃方法 // 中略 method apply(攻撃対象: atackee): atackee.attackedBy(self.getAttackPower)
小一時間考えてみましたが、通常攻撃は
new 通常攻撃(player)
より
new 通常攻撃(player.getAttackPower)
の方が良いかもしれませんね。攻撃が放たれたら、その攻撃を誰が行ったかは関係なくなる、とした方が情報の流れがすっきりすると思います。
攻撃者 → 攻撃方法(突撃・斬撃・ジャンプ・即死攻撃) → 攻撃対象