はてなキーワード: HELLO WORLDとは
See you again! はないんだよ
期待に夢膨らませた開発者の卵がC言語で「Hello World」して、
そこをうまく伝えられないもどかしさがある
LINEが元ライブドアの人たちが作ったみたいなことをホリエモンが言ったらしく
誰が作っても同じようなものが作れるって反応があったんだよ
実際のところLINEは出したタイミングが絶妙で運の要素が強いと思うけど
あのクオリティのアプリを作れるプログラマがどれだけいるんだろうね
同じようなものは確かに作れるよ、でも運用も含めてあのクオリティは凡百には出せない
どうしたらお客さんとかディレクターにそういうの伝わるんだろうね
絵とかだったらわかりやすいんだろうけどね
でもデフォルメを手抜きとか言っちゃう人もいるからそうでもないか
一回何かしらのプロジェクトをやらせてみないとわからないのかな
まあHello Worldすらできないだろうけど
出社後、少し時間ができたので、ふと、過去に在籍していたベンチャー企業のホームページを見た。
入社時、そこの社長は声高らかに、打倒 google を謳っており
若く、身の程を知らない自分は根拠のない高揚感に包まれ入社した。
自分がjoinした時は、立ち上げ間もなかった頃で資金も潤沢。R and D に勤しんでいた。
だが、半年経ったころ、ふと気付いた。
しかも全員、ちょっとプログラムをかける程度。ましてや、自分以外はPHPで"hello world"なレベル。
ある日社長に問いただす。
「勝てると思ってるの?数も資金も技術力もノウハウも、比較にすらならないのに」
その返答に戦慄した。
出資者からの資本金引き上げも相次ぎ、入社当初4億近かった資本金は3000万まで下がった。
ついには受託開発に手を出し始めた。
運用はどうする?インフラはどうする?そんなことも決めないまま、訳のわからない受託案件が飛び込む。
受託に慣れていない社長と営業は、3人月で100万とか、どこの会社にも見向きもされれないブラック案件ばかりをとってくる。
今は200人くらいの中小企業の開発部でマネージャをしている。
昔は大きくはないが、ちゃんとしたビルに入っていたのに、なんとかマンションの302号室。
いや。ほんとに辞めてよかった。
転職時は、年齢的にもギリギリだったが、あの時、歯を食いしばって動いた自分を褒めてやりたい。
さて、仕事頑張ろう。
プログラムは最初に「Hello world」と表示されるのを見て「なにこれ」みたいな反応か「おもしれー」みたいな反応かで、適性があるかわかるな。
そういうことだ。
もう誰も覚えていないと思うけど、3年ほど前、ここに、"Hello world!"というタイトルのエントリを投稿した。あの話の続きをしようと思う。
※このお話はたぶんフィクションです。実在の人物や団体とはあんまり関係ありません。
※前回のあらすじ:高校中退→工場派遣→プログラマ→ホームレス→自立支援施設→プログラマ→海外放浪→職業訓練→世界一周アプリを作る
あれから3年、いろんなことがあった。またプログラマとして働いたり、またホームレスになったり、福島で除染作業員をしたり、本当にいろいろあったけど、 今回の主題にはあんまり関係ないのでざっくりはしょる。今回の主題は世界一周についてである。
僕はいつか世界を巡る旅をする。10年くらいかけて。わりと本気で。その計画を立てるためのアプリケーションも作った。でもそのアプリは正式リリース以降、開発が頓挫している。開発を進めるにあたって、致命的な問題があることがわかったからだ。それは、開発者である僕自身が、この世界について何も知らないに等しい、という問題だ。
開発者は、システム化する対象に関して、誰よりも精通していなければならない。業務用アプリケーションの開発なら、 その会社の業務フローについて、社内の誰よりも詳しくなくてはいけない。システム開発とはそういうものだ。そして今度の対象は世界だ。すべての国だ。それを僕自身が知らなくてはならないのだ。
しかし世界は巨大で、そして複雑だ。
国連加盟国は現時点で193か国。それぞれの国の下に州や省や県があり、その下に市区町村があり、そういった階層的な行政単位以外にも、歴史的背景から自治区になっているところや特別行政区、連邦直轄領もあり……。
そういや連邦ってなんだろう。なんとなく知っているようでいて、詳しくはわからない。王国と共和国ってどう違うんだろう。国の形ってなんでこんなにいろいろあるんだろう。いやそもそも国ってなんなんだ。どうすれば「国」になるんだ。
国連に加盟していればいいのか。いや国連非加盟の国もあるじゃないか。国家の三要素(領域、人民、主権)を満たしていればいいのか。しかしそれを満たしていることを誰が認定するんだ。他国からの承認があればいいのか。その他国は誰が国だと承認したんだ。政治的問題から国なのか国じゃないのかはっきりしない地域だってたくさんある。国とか国じゃないとか最初に言い出したのは誰なのかしら。
それは世界一周アプリの開発中に国データをちまちま作っていたときにも思ったことだ。もしかして「国」というのは、僕が思っていたほど絶対的で、はっきりしたものではなく、相対的で、曖昧なものなんだろうか。
わからない。わからないことだらけだ。こんなもの本当にシステム化できるのか。複雑ってレベルじゃねーぞ。これが仕事だったら「うんこー☆」とかいいながら全力で投げ出しているところだ。しかしこれは仕事ではない。これは仕事ではないので、真剣に取り組まなければならないし、投げ出すわけにはいかないのである。
だけど、 どうしたらいいんだろう。世界はあまりに巨大で、複雑で、茫洋としている。何かとっかかりが必要だと思った。基点が必要だと思った。人でも物でも事柄でもいい。それをとっかかりにして、基点にして、少しずつ裾野を広げていけばいいのではないか。そう思って、自分の記憶を探ってみる。僕の基点、時間軸と空間軸の原点、それは子供のころ、ブラウン管の向こうに見た、落書きだらけの大きな壁だった。
1989年11月、ベルリンの壁が崩壊した。僕が9歳のときだった。ニュースは連日連夜、この話題で持ちきりだった。興奮気味に壁を壊す人たち、全身で喜びを表現する人たち、泣きながら抱き合う人たちもいた。世界中が大騒ぎになっているようだった。僕はその映像を、意味もわからずただぼんやりと見ていた。
それからしばらくして、社会科の教科書の世界地図が大きく書き換わった。ソ連という国がなくなり、新しい国がたくさんできたのだという。国がなくなる? 国が新しくできる? その意味もまたよくわからなかった。
時間軸は一気に飛び、ベルリンの壁崩壊から20年以上たったころ、僕は生まれて初めて日本を出た。半年かけて海外を放浪した。特に目的もない旅だった。だからその場所に行ったのも、ほんの気まぐれだった。
ベトナムのホーチミン市にある戦争証跡博物館。ベトナム戦争の記憶を後世に伝える博物館だ。旅の途中にふらりと立ち寄ったそこで見たものを、僕はいまでもフラッシュバックのようにありありと思い出せる。
銃器、対戦車地雷、その他さまざまな武器弾薬が「こうやって使われていたんだ」といわんばかりに、実際に使用している場面の写真と並べて展示されている。銃を突きつけられて悲壮な顔をしている男性、道ばたで血まみれになって死んでいる子供、虫の死骸のように雑多に並べられた人の死骸、そんな凄惨な写真がこれでもかと並ぶ。
何か、自分の中で価値観が急速に書き換わっていくのを感じた。頭の中がぐちゃぐちゃになって、いろんな言葉が浮かんでは消えていく。
「資本主義」
「共産主義」
「イデオロギーとは何だ?」
そのとき同時に頭の中に浮かびあがってきたのが、子供のころに見たベルリンの壁崩壊のニュース映像だった。あれから20年以上たってようやく僕は、あの人たちがどうしてあんなに泣いたり喜んだりしていたのか、少しだけ理解できたのだ。
あの博物館で僕がもっとも強く感じたのは、「戦争は悲惨だ」という事実ではなく、「どうしてここまでのことになったのか?」という疑問だった。人が人を虫けらのように殺す、その理由が知りたい。そこには絶対にそれなりの経緯があるはずである。東西冷戦とは何だったのか、僕はまずそれを知らなければならない。
しかしこうなるともう最初から世界史をやり直したほうが早いんじゃないかと思った。よし、時間軸を一気に人類の歴史の始まりまで巻き戻そう。
まずは大河流域で文明がおこる。チグリス・ユーフラテス川、ナイル川、インダス川、黄河。うわー、すげー懐かしい。そして農耕が発達する。食料を安定して収穫・保存できるようになると権力が生まれる。そこからは世界各地で似たような権力闘争が延々と繰り返される。
特に印象深いのが「カノッサの屈辱」だ。十代のころ、学校でこれを習ったときは意味がわからなかった。この人たちは何をそんなに必死になっているんだろうと思っていた。いまならわかる。目的は、権力そのものなのだ。人の頭を踏みつけること、人を思い通りに動かすこと、それ自体が目的であって、権力によって得られる富や名声は二の次なのだ。それは自分の経験を振り返ってみてもわかる。ヤンキーの世界でもエリートの世界でも、どんな場所でもどんな階層でも、人間が集まれば、始まるのはいつも頭の踏みつけあいである。それが直接的か間接的か、下品か上品かという違いはあれど、やっていることは同じだった。だから世界史に記されたこのくだらない争いの数々も、いまは実感を持って理解できる。
そして絶対的な権力者である神によって凍結されていた歴史が、ルネサンス以降、急速に動き始める。宗教改革、名誉革命、フランス革命。それまで聖職者や王侯貴族が持っていた権力が少しずつ引き剥がされていく。そしてフランス王国はフランス共和国に。ああそうか、王国と共和国の違いって「王様」がいるかいないかなのか。さらに現代の「国」という概念、国民国家というのも、このころに生まれてきたもののようだ。人類の歴史から俯瞰すれば、ここ200年くらいの「流行」にすぎないのだ。
しかしフランス革命って華々しいイメージだったけど、こうして改めて調べてみると、革命政権の恐怖政治によって何万もの人間が処刑されていたり、何度も王政に戻っていたり、混沌としすぎていて、華々しいなんてとてもいえない血まみれの革命だったのだと気づかされる。
そんな混沌の中、産業革命を経て、歴史はさらに加速する。権力のあり方も変わる。聖職者や王侯貴族に変わって資本家が台頭してくる。資本主義が加速する。貧富の差が拡大していく。賃金労働者は悲惨な労働環境で搾取され続ける。暗澹とした空気の中、社会主義・共産主義という思想が台頭し始める。ロシア革命が起こる。世界初の社会主義国、ソビエト連邦が誕生する。
いままで社会主義ってあまりいいイメージはなかったけど、こうして順序立てて成立の経緯を追っていくと、歴史の中での必然性がわかる。みんな、もう誰も頭を踏みつけあわずにすむ世界が欲しかったのだ。だから既存の権力や富や労働のあり方を強制的に変える。そしてそれが国の形を変える。そうか、国の形ってこういうふうに決まるのか。
しかし計画経済ってなんだろう。どうしてそんなものが必要になったんだろう。と思って、初心者向けの経済学の本を何冊か読んでみた。めちゃくちゃおもしろかった。経済ってこういうものなのかと思った。市場経済では必ず景気は好況と不況を繰り返し、いつかどこかで恐慌を引き起こす。そんな繰り返しをさせないために、計画経済では政府の計画にしたがって商品を生産する。そうか、そんな経済の形もあるのかと思った。ずっと現代日本で生きてきた僕にとっては、市場経済があたりまえすぎて、市場の自由がどうの規制がどうのといわれても、これまでピンとこなかった。「あたりまえ」のことは、対比されるものがないと、それを知覚することさえできないものなのだと知った。
その市場経済へのアンチテーゼとしての計画経済は、しかし破綻する。いつ、どこで、誰が、何を、どのくらい欲するか、なんてことを計算し尽くすには、リソースが足りなさすぎたのだ。結果が出ているいまだからいえることなのかもしれないけど、少数の頭のいい集団の演算能力よりも、多数の平凡な人間の無意識的な分散コンピューティング(見えざる手)のほうが演算能力は遥かに高いのである。
そして社会主義自体も破綻する。ソ連型の社会主義では一党独裁を必要とする。しかし絶対的な権力は絶対的に腐敗する。それは歴史が証明している。独裁政権は必然的に暴走していく。これも僕は経験として知っている。「いじり」がいつも「いじめ」に発展するのと同じだ。他人をおもちゃにできる、自分の思い通りにできる、これは権力である。そして「いじり」は場の空気によって正当化されるので抑制がない。抑制のない絶対的な権力は暴走する。だから 「いじり」はいつも「いじめ」に発展する。企業内のハラスメントや家庭内の虐待も同様だ。人間は好き勝手にできる状況に立たされたとき、好き勝手に振る舞うものなのだ。そうか、チェックアンドバランスってそのために必要なのか。絶対的な権力は絶対に生み出してはならない。権力は絶対的に抑制されなければならないのだ。三権分立を唱えたモンテスキューさんマジパネェすわ。
こうして自由主義・資本主義の矛盾への疑問から生まれた社会主義・共産主義は、自身に内包していた矛盾によって自壊していく。そして時間軸と空間軸はまた原点に戻る。冷戦の象徴であり、永遠に世界を二分し続けるかのように思われていたベルリンの壁が、ささいな行き違いからあっけなく崩壊する。ほどなくしてソビエト連邦から次々に構成国が離脱し(国が新しくできる)、連邦は解体される(国がなくなる)。
天秤の片方から社会主義・共産主義が脱落したことにより、その後、世界はまた自由主義・資本主義へと大きく傾いていく。混合経済の社会主義的な部分が次々と取り払われていく。その結果が、派遣法改正だったり、リーマンショックだったりするのだ。そしてそれらは僕の人生にも多大な影響を与えている。そうだ、これはひとごとではない。遠い昔にあった「歴史」でもない。僕がいま生きている「現代」の話なのだ。
そうか、世界ってこういうふうに動いていたのか。少しずついろんなことがわかってきた。国とは何か。イデオロギーとは何か。なぜ法の支配が必要なのか。なぜ憲法が必要なのか。しかしそれよりも何よりも、ひとつ重大な事実を確信した。それは、世界のすべてを知ることは絶対にできない、ということだ。
ミクロの領域――個人の感情や行動、これはわかる。マクロの領域――世界の市場や情勢、これもわかる。しかし両者がどのように関連しているのか、個人の感情や行動が、どのように影響しあい、どのような力学が働いて、世界の市場や情勢を動かすのか、逆に、世界の市場や情勢が、個人の感情や行動にどのような影響を与えるのか、それを計算し尽くすことは、誰にもできない。それは人間の演算能力の限界を遥かに超えているからだ。
「俺は世の中の仕組みをわかってる」「裏の論理まで知ってる」と嘯く人にはたまに出会うけど、そういう人が本当に世界の仕組みを知っていたことは一度もない。本当にただの一度もなかった。陰謀論はマクロとミクロの間にある巨大で複雑な回路をショートさせただけの反知性主義にすぎない。僕はそんなチートに興味はない。僕は真正面から、正攻法で、その回路を解析したいのだ。そうでなければ意味がない。
ああ、そうか、経済学とは、それを解き明かそうとする学問なのだ。マクロとミクロの間にある巨大で複雑な回路。それを解析するのが、経済学や、その他の社会科学なのだ。僕はそれを、もっと深く学ばなければならない。
進むベき方向性は見えてきた。しかしここからどうするか。独学ではもうこのへんが限界のような気がする。つぎはぎだらけの学習じゃなく、もっと体系的に学びたい。でもどうやって学べばいいのかがわからない。僕はまず、学び方を学ぶ必要があるのだ。それには、どうしたらいいのか。
大学に行く。どうしてそんな選択肢が浮かんできたんだろう。これまで僕の中にそんな選択肢は存在していなかった。そのはずだった。これまでずっと金も時間もなく、ただ日々の生活に追われるばかりで、そんなことを考える余裕は一切なかった。そんなことを考えるくらいなら明日の飯の心配をしたほうがいい。ずっとそう思って生きてきた。
何より僕には自信がなかった。自分みたいな中卒の人間が高等教育を受けたところで何の意味もないと思っていた。そんなの僕にはまったく関わりのない知識階級の人間の世界だと、大学なんて僕にはまったく何の関係もない、別の世界に存在するものだと思っていた。
でも思い返してみれば、その認識は少しずつ変化していた。いろんな仕事をしたり、あとさき考えず旅に出たり、プログラムを組んだり、文章を書いたり、そしてそれを不特定多数の人の目に晒したり、ずっと何かに追われるようにそんなことを繰り返してきたけど、その過程で、僕は何か大切なものを拾い集めてきた気がする。それはたぶん、自尊心と呼ばれるものだ。幼いころに失い、ずっと欠けたままだったそれを、僕はこの歳になって、ようやく取り戻すことができたのだ。
だからいまは自分が高等教育を受けることに意味がないだなんて思わない。大学が別の世界に存在するものだなんて思わない。ああそうか、だからいま、このタイミングで、「大学に行く」という選択肢が、僕の前にあらわれたのか。
あとはこの選択肢を選び取るかどうかだ。
いまの時代、大学に行くなんてそんなにたいしたことじゃないのかもしれない。だけど少なくとも僕にとってそれは、とてつもなく勇気とエネルギーが必要なことだ。ホームレスになることよりも、右も左もわからないまま海外に飛び出すことよりも。
現実的な問題もたくさんある。資金、学力、人生の残り時間。いろいろと考え始めると、解決しなければならない問題が多すぎて、わけがわからなくなってくる。もうどうでもいいじゃないかと投げ出したくなってくる。でも僕の中の何かが、そうさせてくれない。僕の中の何かが、そうじゃないだろうと責め立てる。
これには覚えがある。この熱には覚えがある。これは、あの旅の途中、自分の中に発見した、マグマのような熱量だ。感情になる前の感情。行動になる前の行動。名前なんてつけようもないほどプリミティブな衝動。僕はいままさに、それに直面している。そしてその熱量からは、どうあがいても逃げられない。それだけは確信できる。
だったらもう、覚悟を決めるしかない。本当にもう、そうするほかどうしようもない。
僕は大学へ行く。
そうやって覚悟を決めてみると、ものすごく気が楽になった。気分が軽くなった。
ああどうしていままでこんな簡単なことに気づかなかったんだろう。その想いはずっと自分の中にあったのに。
私の持てる知識を絞り出してなんとか完成しました。
**************************************************************************************
完成したサイトがこちらです。
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アカウントあるといつでも参加できますので、
この記事見て思ったんだけど、
はてなブックマーク - 週刊「しょうもないWebアプリをつくる」創刊号 – アクセスカウンター | CreativeStyle
http://b.hatena.ne.jp/entry/kadoppe.com/archives/2015/04/syomonai-1st-access-counter.html
タイトルがキャッチーだよね。ディアゴスティーニとかあの辺の雑誌を思い起こさせる。でも記事の中身はどうも全然違ってるみたいなんだ。
ディアゴスティーニは、毎週1つ部品が付録についてきて、それを全部組み合わせると一個の製品が出来上がるってものだけど、このブログはそんなのではなく、毎週1つアプリをリリースするんだって。
ここでちょっと話を置いといて、今プログラミング教育だなんだとネットでアピールされていて、無料で学べるサイトまとめや有料レクチャーの宣伝記事なんかが人気エントリになったりしてるよな。無料で学べるサイトなんかはいくつか覗いてみたりしたけど、ずぶの素人としては最初のページで挫折しちゃうわけだよ。「こうすれば"Hello World"と表示できます」ってその通りやってみても何の達成感も得られないんだよな。だから何なんだって。こういう基礎部分が重要だってことは分かるんだけど、意味が分からずこんなことやってもつまんないよな。結局Hello World表示させるだけでいつも飽きちゃうの。
で、最初の話に戻るんだけど、ディアゴスティーニみたいに「週刊 プログラミングでWebアプリを作る」なんてレクチャーサイトがあったらいいのになぁって思うんだよ。「週刊 スマホ用パズルゲームを作る」でも「週刊 ブラウザゲームを作る」でもいいけど。
毎週ソースコード?が数行アップされて、それを全部コピペしていくだけで、1つのアプリが完成するの。記事ではコードの他に、使われている構文の基礎的な解説や、何のためにその構文が書かれているのかとか解説されるの。
最終的にできるアプリは実用的に遊べたり使えたりするもの。そうでないと単にコピペ作業するだけだとしても、モチベーションが上がらないからね。
コピペしただけで何も身につかないとか言う人もいるだろうけど、「プログラミングでアプリを完成させた」という流れを全て体験することが重要だと思うんだ。最初にそういう流れを体験しとけば、その後のHello Worldみたいな基礎的な勉強への苦手意識がずいぶん減るのではないかと。少なくとも俺は減る。
そんなわけでプログラミング学習したいから本当に「週刊 スマホアプリを作る」みたいなの出ないかなぁ~。そういう無料サイトが出る前に、ディアゴスティーニが電子書籍で発売しそうだ。それでもいいけど。
「publicてなに?staticってなに?voidってなに? mainはメインなんだろうけど []ってなに?argsってなに?なんでint main?str mainとかあかんの?たまに*印ついてるのなに?全部意味が分からんし解説もなしにおまじないって言って飛ばしてるケースも多いしなんか詳しく言ってるっぽいのもあるけどその分かる人だけが分かるような言い方やめて私のライフはもう0よ!なんで一言「やぁ!」っていうのにどれだけのことを理解せなあかんのよ!」
スクリプト言語だろうとその辺の物でてくるだろ。
C++とかだってpubclicだとstaticだの最初に出てこないし。最初からは[]もargsも必要ないし。voidもまあ要らんし。
つまりは色々細かいこと出来ないけどなんとなくインタラクティブに"「はろーわーるど」と出力"としたらはろーわーるど、って出したい、
ってだけだろ?
そしたらターミナル立ち上げてシェルでecho Hello World!とかやるのが一番手っ取り早いだろ。
それ以上やりたいなら中途半端なスクリプト言語やっても詰まった時にわからなくなるからC++とかやった方がよっぽどきちんと覚えやすい。
都会と田舎とか、あちら側とこちら側とか、セックスとか失恋とか。誰もがなんか言えるというのがミソでブクマもコメント付きのものが多くなる。
あと機能不全家族、毒親、病気、家族の死、障害、精神疾患、社会人の愚痴、家庭の不和、うんこあたりも鉄板だが、量も多いので良いエントリを書かないと埋もれる。強烈でかつ人に言いにくい実体験があればそれを素直に平易に淡々と書くのが良い。ただ、あまりにも文章が下手だと変なの呼び込んで自分が傷つくだけなのでやめたほうが良い
増田は夕方以降、どうでもいいものもふくめて流量が多くなるので、良いエントリは流されてしまう。昼間は以外にPVはあるみたいだが流量は少ないので1ページ目に滞留しやすいようだ。しかも1~2ブクマつけばはてブのトップページにも滞留する。ライバルエントリが少なくかつ、PVが多いというのははてブを稼ぐ基本である。しかしけっこう昼間にも会社員がみてんだなー俺もだけど
できなかったら、どっかから借りてきたのとか、流行ってる文句を改編するのとかでもいい。
釣り師がよくやるやつ。
1と4の合わせ技+タイトルが3にあてはまる
もうみんなdisってるようなのをdisるならよっぽど一言でうまくdisらないと駄目。え?それ?みたいなのを狙うのがたぶんよい。
何いってんのかわかんない煽りが来たら即座に「黙れやハゲ」くらいやるといいかもしれない。
穏やかでもっともな内容のTBが来たら、流量が多くなる夜に返事をすると、TBツリーが伸びて多くの人の目に元エントリが触れやすくなる
わかってないひとは「なるほど」となるし、当事者は「そうそう」となるので比較的穏やかに無言はてブが成長する
言語化するときは出来る限り、カテゴリに分ける、時系列を箇条書きにする、などのライフハックエントリメソッドを活用するとよい。
韓国の話が混じっているとなおよいが、はてなの場合嫌韓はあまり人気がないのであくまでも客観的に事実を書くことが大事。一番大事なのはエビデンス。
語学力があると強い。なお上の二つは相互作用でブクマ数が増えた模様。ココらへんは完全に運。
増田文学といえば文学なのだが、とにかく熱量があるエントリは好まれる。
またファンが書いた熱量のすごいエントリも結構な割合ではてブを稼ぐ。
もうすこしタイトルを工夫すれば200くらいいけたかもしれないが、この人の場合、これでいいんだろうな。
無料で商品サービスを提供し、困ってる人を助けてスキルを高めるSNS
『Query』
ほんとは他にやりたいことあるんだけど、なかなか仕事を変えることが難しい人って多いと思います。
今までの経験だったり年齢だったりで新しいことにチャレンジしようと思っても諦めてしまったり、
自分がその仕事でやっていけるのかとか、不安などもあって現状を変えられないことが僕には多々ありました。(今年31歳)
そこで
と思い色々と考えました。
ということで、
まず思いついたのがランサーズなどのクラウドソーシングサービス、プロに作ってもらうのが手っ取り早い。
しかし収益化して制作費を回収できるか分からないし、お金も無いしなので自分で作ることにしました。
HTMLはかろうじて分かるレベルです。作りたい気持ちはあっても全く作れない・・・
スキルの無さを嘆いても仕方ない、ここは最もハードルが低くても実現可能な方法を探そう。
ということでWordPressを使って作ることにしました。(クオリティは置いといてまずはコンセプトを形にしたかったので)
PHPはもとよりWordPressですら分からないことだらけです。WordPressについては多くの人がブログ等で情報発信しているので
分からないことがあれば質問もできるし、何かと情報収集は助かりました。何回も質問攻撃をしても丁寧に教えてくれる人ばかりで、
リアルな社会では人の冷たさに傷ついていた僕は人の優しさに触れた気がしました。・゚・(ノД`)・゚・。
また実装したいこともプラグインとして既に用意されているものが多いので、
まずは形にしたいという方にはWordPressで製作することがいいんじゃないかと思います。
正直ど素人丸出しのサイトを公開することは恥ずかしかったです、笑いものにされるだろうし。(そもそもアクセスがありませんが・・・)
でもこんな世の中にしたいっていうメッセージを表現することは僕自身大切なんじゃないかと思っています。
個人による物販やスモールビジネスが何かと話題になっていますが、
今までの経験を使って個人が別のサービスを創造できるプラットフォームにしていきたいです。
GWが普段より長い休日という意味しか持たないオタク社会から断絶されたぼっちリーマンにとって、
部屋整理をするうちに出てきたニトロプラスの0年代のゲームは、たぶん格好の時間つぶしなのだろう。
飯も食わずに斬魔大聖デモンベインをぶっ通しでやり続け、
Dr.ウェストに腹を抱えて笑い、エルザの攻略ルートが本当になかったのか、かつてと同じように悩んでしまう。
今日は「鬼哭街」CD-ROM版(もちろんリメイクする前)だ。
インストール時にドライブが立てる掃除機のようなあのけたたましいブオオオォォっという音は何度聞いてもいいものだ。
下のバナーが「Hello World」の宣伝で、やべー懐かしいと独り言のように繰り返してしまった。
Startしてから先、いきなり女性が襲われているが、抜けないので次へ。次へ。
行き過ぎて、ホイールロックを回したら更に先へ進んでしまった。
先へ進んだ。
後戻り機能ないぞ、これ。
序盤なので、再インストールし直した。
Cの入門書なんかで#include <stdio.h>を「今はとりあえず、おまじないと思っておいてください」みたいな説明してるとマニアックな人から糞本扱いされるけど、じゃどんな説明するのが正解なんだろうか。
hello worldを書いてる初心者に、プロトタイプとかマクロとかから説明するのだろうか。
なぜプロトタイプみたいのが必要かって言うと、printf()は分割コンパイルでライブラリというものに入っていて……とか初心者が納得のいくまで説明をしなきゃならないのか。
「stdio.hというファイルにprintf()を使うための情報が入っているのでそれを取り込む命令です。詳しいことはおいおいわかりす」って簡単に説明するなら「今はおまじないとおもっていてください」と大差ないし。
バシッと納得のいく説明の例を教えてほしい。
俺は請負で業務アプリを作成する残念なお仕事をするプログラマーだ。
最近は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; } }
・・・・?
俺は震える手を押さえながらそっとパソコンの電源を切った。