
はてなキーワード:WEB+DB PRESSとは
anond:20240324030115 へつづく
ヤバいといっても、見た目の特徴のことじゃない。
普通の見た目なのに、「なんでこんな人が社会で生きていけるの?」という人は確実にいる。
そんな人がクライアントになることはある。絶対に避けられないし、事前には見抜けない。
そして、人は慣れる。
慣れたときに「あなたを大切にしない人のことを、大切にする必要はない」といわれても、判断するのは難しい。
そこでチェックリストを用意した。
以下のチェックリストに3つ以上当てはまったら、次の仕事は断った方がいいだろう。
いくつかわかりにくい箇所があるので説明しよう。
"相場を知らない"、"値切られた"あたりは論外なので説明しない。
仕事を頼まれる前に値切られたことがあり、値切り前の相場が半値だった、という地獄のケースもある。
(あなたが地方在住の普通のフリーランスプログラマなら、4500円/時×あなたの地元の最低賃金 /東京都の最低賃金 が相場だ。)
"昔プログラマ/Webデザイナーなどだった"は異論があると思う。私がいいたいことは、半可通はヤバいということだ。
とにかく意味のないところにこだわって、その割に品質が低いので「これ私が作りました」と言いづらい。
"契約書がない"、"仕事の進め方が決まっていない"あたりも論外だ。
ただし、社内にIT担当者がいないのでITの仕事の進め方がわからない、といった場合は別だ。
(なお契約書がない場合、契約書を作っても契約内容を守らない輩が多い。)
"締め切りがない"というのは、請負なのに事前に見積もりできない案件だ。
「何を作るのか決まっていないが、金額は固定で最終的な納期もASAPで」という案件は実際にある。
こんな仕事を知人だからというだけで請けてしまったら、次からは断ろう。
"仕様がよく変わる"は悪いこととは限らない。そのたびにお金がもらえるのなら。
もし「仕様が変わったので直してほしい」と言われたら、「いくら出す?」と聞こう。そして、メールや音声は証拠としてとっておこう。
——これは最悪なケースだが——過去にクライアントの社内メールシステムでやりとりしていたら、プロジェクト終了時にアカウントごと消された例があるのでNDAに気をつけつつ証拠はとってほしい。
"顧客第一主義"というのは、顧客に振り回されてあなたの都合を大切にしない主義のことだ。
ましてフリーランスなのだから、スケジュールを押さえずに「ちょっと待って」を繰り返されたら、他の仕事もとりづらくなる。
"誤字脱字が多い"も、相手があなたを大切にしていないポイントだ。
他にも"収入印紙を2枚とも買いに行かせる"、"レベニューシェアを持ちかけられる"、"常に電話で返信される"、
"返信に3日以上かかる"、"仕様追加をバグ修正といって無料で済まそうとする"などがある。
説明は以上だ。
ところでこれは、WEB+DB PRESS Vol.100の"あのときの自分へ"へのリスペクトだ。
文中の「あなた」は5年前の私のことだ。
タイトルに(田舎で)と入れたのは、関東の田舎で起業した自分が最初に出会ったのがこのタイプの人だから。
でも続けるかどうかは、あなたが選べる。相性が悪ければ、穏やかに断ろう。
この文章を関東の田舎にいた5年前の自分と、中部地方の田舎にいる知人のフリーランスプログラマーに送る。
お前は他人を大切にしすぎるから、自分という他人も大切にしてくれ。
(あと遠慮してないで、仕事くださいって言え。)
レジンキャストミルク (電撃文庫)藤原 祐
☆社会福祉の思想と歴史―魔女裁判から福祉国家の選択まで (MINERVA福祉ライブラリー) 朴 光駿
絶対に解けない受験世界史 (大学入試問題問題シリーズ)稲田義智
99歳ユダヤのスーパー実業家が孫に伝えた 無一文から大きなお金と成功を手に入れる習慣 矢吹 紘子
女子マネージャーの誕生とメディア―スポーツ文化におけるジェンダー形成高井 昌吏
世界一即戦力な男――引きこもり・非モテ青年が音速で優良企業から内定をゲットした話菊池良
愛についての感じ 海猫沢 めろん
借金の底なし沼で知ったお金の味 25歳フリーター、借金1億2千万円、利息24%からの生還記 金森 重樹
☆猫背を伸ばして新装版 (フレックスコミックス)押切蓮介
こんな上司が部下を追いつめる―産業医のファイルから (文春文庫)荒井 千暁
フルーツ果汁100% 第1巻 (白泉社文庫 お 3-1)岡野 史佳
☆「個性」を煽られる子どもたち―親密圏の変容を考える (岩波ブックレット)土井 隆義
予備校なんてぶっ潰そうぜ。 花房 孟胤
コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)西尾 泰和
☆九月、東京の路上で1923年関東大震災ジェノサイドの残響加藤 直樹
そこに僕らは居合わせた―― 語り伝える、ナチス・ドイツ下の記憶 グードルン・パウゼヴァング
クリスマスに少女は還る (創元推理文庫)キャロル オコンネル
Three Essays on theState of Economic Science Tjalling C. Koopmans
TheElements of Style, Fourth EditionWilliam Strunk Jr.
☆船に乗れ!〈1〉合奏と協奏 藤谷 治
11/22/63 上 スティーヴンキング
システム×デザイン思考で世界を変える慶應SDM「イノベーションのつくり方」 前野隆司
追われ者―こうしてボクは上場企業社長の座を追い落とされた松島 庸
グロースハック予算ゼロでビジネスを急成長させるエンジン 梅木 雄平
To Repairthe World:Paul Farmer Speaks to theNext Generation (California Series in Public Anthropology) Bill Clinton
☆社会心理学講義:〈閉ざされた社会〉と〈開かれた社会〉 (筑摩選書)小坂井 敏晶
Making the Modern World: Materials and Dematerialization VaclavSmil
高校教育のアイデンティティー―総合制と学校づくりの課題 (「教育」別冊 (9))小島 昌夫
☆名作はこのように始まる〈1〉 (ミネルヴァ評論叢書・文学の在り処)千葉 一幹
グラミンフォンという奇跡 「つながり」から始まるグローバル経済の大転換 [DIPシリーズ] ニコラスサリバン
☆天涯の武士―幕臣小栗上野介 (1之巻) (SPコミックス―時代劇画)木村 直巳
ぐいぐいジョーはもういない (講談社BOX) 樺 薫
LEAN IN(リーン・イン)女性、仕事、リーダーへの意欲シェリル・サンドバーグ
鬼畜のススメ―世の中を下品のどん底に叩き堕とせ!! 村崎 百郎
私の持てる知識を絞り出してなんとか完成しました。
**************************************************************************************
完成したサイトがこちらです。
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 functionindex() {$title_for_layout = "LapyNetニュース";$content = "Hello World!!";$this->set(compact('title_for_layout','content'));if(date("G")>0 anddate("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('SELECTid,title FROM rssfeeds orderbyid desc limit10');$this->set('posts2', $paramz);$parapara = $this- >Oracle- >query('SELECTid,title FROMoracles orderbyid desc limit10');$this- >set('postx', $parapara);$funking = $this- >Rank- >query('SELECTid,frank FROM ranks wherecreation=(selectmax(creation) from ranks)');$this- >set('funking', $funking);} **************************************************************************************public functionmizuno() {$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 anddate("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 wherecreation=(selectmax(creation) from ranks)');$this->set('funking', $funking);} **************************************************************************************public function hot() {if(date("G")>0 anddate("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 wherecreation=(selectmax(creation) from ranks)');$this->set('funking', $funking);} **************************************************************************************public function newnew() {if(date("G")>0 anddate("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('SELECTid,title FROM rssfeeds orderbyid desc limit10');$this->set('postszz', $paramz);$parapara = $this->Oracle->query('SELECTid,title FROMoracles orderbyid desc limit10');$this->set('postzy', $parapara);$funking = $this->Rank->query('SELECT * FROM ranks wherecreation=(selectmax(creation) from ranks)');$this->set('funking', $funking);} **************************************************************************************public functiontop() {if(date("G")>0 anddate("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 functionview($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 functionadd() {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 functiondelete($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 functionoracle() {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<?phpheader('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 ($itemsas $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><ahref=$href>$title</a><br>$megami<p>$tweets</p><p>$checkman</p></li>";}else{}}echo '</ul>'; **************************************************************************************function getRssList($urls){$rssitems = array();foreach ($urlsas $url) {$obj = fetch_rss($url);$rssitems = array_merge($rssitems, $obj->items);}return $rssitems;} **************************************************************************************functiondb_check_pr($japanese){$moji = mb_substr($japanese,0,2);if($moji == 'PR'){return 1;}else{return 0;}} **************************************************************************************functiondb_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 WHEREurls = :language';$prepare = $db->prepare($sql);$languages = array($href);foreach ($languagesas $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) {returnhtmlspecialchars($var, ENT_QUOTES, 'UTF-8');}} **************************************************************************************functiondb_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()asdatetime)', 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回
**************************************************************************************
一番難しいところはtwitterログインとwebサイト連結でした。
ツイート数でランキングしてます、ネットの話題を見つけられます。
ホームページビルダーを使用しています。
今のホームページビルダーは昔と違って高機能ですね。
テンプレートも何種類もあって今はすごいです。
に分かれています。
今更cakephpを使っている人は少ないかもしれませんが、
twitterアカウントあるといつでも参加できますので、
Playbooks — Ansible Documentation
railsbox - Fast and easy Ruby on Rails virtual boxes
Ansible入門 (全15回) - プログラミングならドットインストール
Amazon.co.jp: 入門Ansible eBook: 若山史郎: Kindleストア
Amazon.co.jp: Ansible Configuration Management 電子書籍: Daniel Hall: Kindleストア
Red HatがITオートメーションのAnsibleを$150Mで買収へ…OpenStackデプロイをDevOpsのために簡易化
Git Clone (スタートアップスクリプトID:112600117316)
指定のGitリポジトリをcloneし、指定の実行ファイルを自動的に実行します。
https://github.com/philc/terraform
fog - The Ruby cloud services library
A list of base boxes for Vagrant - Vagrantbox.es
Discover Vagrant Boxes | Atlas by HashiCorp
https://github.com/ryotarai/itamae
Itamae - Infra as Code 現状確認会 // Speaker Deck
Amazon.co.jp: Chef実践入門 ~コードによるインフラ構築の自動化 (WEB+DB PRESS plus): 吉羽 龍太郎, 安藤 祐介, 伊藤 直也, 菅井 祐太朗, 並河 祐貴: 本
Docker - Build, Ship, and Run Any App, Anywhere
[翻訳] Dockerについてよくある勘違い | TechRacho
Puppet Labs: IT Automation Software for System Administrators