IT日々是好日

Webエンジニア。あと色々。

VMware Icons

This document was created using the official VMware icon and diagram library. Copyright © 2012 VMware, Inc. All rights reserved. This product is protected by U.S. and international copyright and intellectual property laws. VMware products are covered by one or more patents listed at http://www.vmware.com/go/patents.VMware does not endorse or make any representations about third party information included in this document, nor does the inclusion of any VMware icon or diagram in this document imply such an endorsement.

f:id:kawapon2nd:20181128032517j:plainf:id:kawapon2nd:20181128032525j:plainf:id:kawapon2nd:20181128032530j:plainf:id:kawapon2nd:20181128032535j:plainf:id:kawapon2nd:20181128032538j:plainf:id:kawapon2nd:20181128032543j:plainf:id:kawapon2nd:20181128032548j:plainf:id:kawapon2nd:20181128032551j:plainf:id:kawapon2nd:20181128032556j:plainf:id:kawapon2nd:20181128032600j:plainf:id:kawapon2nd:20181128032604j:plainf:id:kawapon2nd:20181128032609j:plainf:id:kawapon2nd:20181128032614j:plainf:id:kawapon2nd:20181128032619j:plainf:id:kawapon2nd:20181128032624j:plainf:id:kawapon2nd:20181128032627j:plainf:id:kawapon2nd:20181128032631j:plainf:id:kawapon2nd:20181128032635j:plainf:id:kawapon2nd:20181128032642j:plainf:id:kawapon2nd:20181128032647j:plainf:id:kawapon2nd:20181128032655j:plainf:id:kawapon2nd:20181128032700j:plainf:id:kawapon2nd:20181128032704j:plainf:id:kawapon2nd:20181128032709j:plainf:id:kawapon2nd:20181128032717j:plainf:id:kawapon2nd:20181128032723j:plainf:id:kawapon2nd:20181128032726j:plainf:id:kawapon2nd:20181128032729j:plainf:id:kawapon2nd:20181128032732j:plainf:id:kawapon2nd:20181128032739j:plainf:id:kawapon2nd:20181128032742j:plainf:id:kawapon2nd:20181128032745j:plainf:id:kawapon2nd:20181128032748j:plainf:id:kawapon2nd:20181128032752j:plainf:id:kawapon2nd:20181128032757j:plainf:id:kawapon2nd:20181128032802j:plainf:id:kawapon2nd:20181128032809j:plainf:id:kawapon2nd:20181128032817j:plainf:id:kawapon2nd:20181128032822j:plainf:id:kawapon2nd:20181128032827j:plainf:id:kawapon2nd:20181128032832j:plainf:id:kawapon2nd:20181128032837j:plainf:id:kawapon2nd:20181128032842j:plainf:id:kawapon2nd:20181128032845j:plainf:id:kawapon2nd:20181128032851j:plainf:id:kawapon2nd:20181128032856j:plainf:id:kawapon2nd:20181128032900j:plainf:id:kawapon2nd:20181128032905j:plainf:id:kawapon2nd:20181128032911j:plainf:id:kawapon2nd:20181128032914j:plainf:id:kawapon2nd:20181128032922j:plainf:id:kawapon2nd:20181128032927j:plainf:id:kawapon2nd:20181128032930j:plainf:id:kawapon2nd:20181128032935j:plainf:id:kawapon2nd:20181128032938j:plainf:id:kawapon2nd:20181128032943j:plainf:id:kawapon2nd:20181128032948j:plainf:id:kawapon2nd:20181128032950j:plainf:id:kawapon2nd:20181128032956j:plainf:id:kawapon2nd:20181128032959j:plainf:id:kawapon2nd:20181128033002j:plainf:id:kawapon2nd:20181128033007j:plainf:id:kawapon2nd:20181128033014j:plainf:id:kawapon2nd:20181128033019j:plainf:id:kawapon2nd:20181128033024j:plainf:id:kawapon2nd:20181128033028j:plainf:id:kawapon2nd:20181128033031j:plainf:id:kawapon2nd:20181128033038j:plainf:id:kawapon2nd:20181128033044j:plainf:id:kawapon2nd:20181128033048j:plainf:id:kawapon2nd:20181128033054j:plainf:id:kawapon2nd:20181128033100j:plainf:id:kawapon2nd:20181128033106j:plainf:id:kawapon2nd:20181128033109j:plainf:id:kawapon2nd:20181128033112j:plainf:id:kawapon2nd:20181128033117j:plainf:id:kawapon2nd:20181128033120j:plainf:id:kawapon2nd:20181128033125j:plainf:id:kawapon2nd:20181128033130j:plainf:id:kawapon2nd:20181128033135j:plainf:id:kawapon2nd:20181128033139j:plainf:id:kawapon2nd:20181128033147j:plainf:id:kawapon2nd:20181128033150j:plainf:id:kawapon2nd:20181128033156j:plainf:id:kawapon2nd:20181128033159j:plainf:id:kawapon2nd:20181128033205j:plainf:id:kawapon2nd:20181128033211j:plainf:id:kawapon2nd:20181128033214j:plainf:id:kawapon2nd:20181128033219j:plainf:id:kawapon2nd:20181128033224j:plainf:id:kawapon2nd:20181128033227j:plainf:id:kawapon2nd:20181128033230j:plainf:id:kawapon2nd:20181128033233j:plainf:id:kawapon2nd:20181128033236j:plainf:id:kawapon2nd:20181128033239j:plain

はじめて救急車で運ばれました。

こんにちは。かわぽん (id:kawapon2nd)です。

先日、生まれて初めて救急車に乗りました。 意識が薄らいでいて、よく覚えていないのですが。 気づくと、救命救急センター

点滴で体が冷えました。 そのせいか、ものすごい尿意でしたが、ずっと真横になっているので尿瓶にはできませんでした。

入院中、自分の健康と古参IT企業の問題を考えていました。


一緒に仕事をしたい人
実務ができ、上流とか、本を買って独習しているところ。めちゃイケ

一緒に仕事をしたくない人
実務は卒業とか言ってる。必要な変化を極端に嫌う人。٩( ๑ '﹏ ' )و

年上の皆さん、勉強を続けてください。 ファシリテーションスキルを磨いて自分磨きをしてください。

tech.nikkeibp.co.jp

次回からは、ちゃんとITネタです。

さくらVPSにwdCalendarを組み込んでみたメモ

さくらVPS(CentOS5.5)上に wdCalendar を設置したので、そのメモ。

本来ならiPhoneでスケジュール管理をする場合、GoogleカレンダーiOS4以降で実装されたEventKitを使うのが一般的だと思いますが、用途によっては、「なんちゃってGoogleカレンダー」も必要になるかと思います。

使い方ですが、ほとんどのことは検索したら出てきたのでした・・・。

参考サイト:
wdCalendarをCentOS5.5にインストールしてみた - 気の向くままに・・・
wdCalendarを日本語で使ってみる - 子だぬきの技術習得ノート

Webサーバ、PHPMySQLの設定が終わっていれば、セットアップそのものは、SSHでコマンドを叩くだけであっけなく終わります。

この、wdCalendarは、1つのデータベースと1つのテーブルを使用します。

生成されるテーブル(jqcalendar)の構造は、このようになります。

カラム 種別 ヌル(NULL) デフォルト値 コメント
Id int(11) いいえ
Subject varchar(1000) はい NULL タイトル
Location varchar(200) はい NULL
Description varchar(255) はい NULL
StartTime datetime はい NULL
EndTime datetime はい NULL
IsAllDayEvent smallint(6) いいえ
Color varchar(200) はい NULL
RecurringRule varchar(500) はい NULL

iPhoneのネイティブアプリから、サーバ上のデータベースにアクセスするには、少し工夫が必要が必要です。次はその一例を書こうと思います。

今さらだろうけど jquery-week-calendar かなり使えそう

こんばんは。

2週間ほど前、iPhoneアプリ用のサーバーとして、さくらVPS借りたんですが、

クラウドベースでデータ共有したいね」

みたいな話が降って沸いて、Webアプリの経験が無い僕は、かなり焦ってしまいました。

で、考えた末に「初歩的なPHPと、SQL文で何とかする。無いものは見つけてくる」という
結論に至りまして、あーだ、こーだ。していたら何とかなりそうな気がしてきました。

とりあえず、Google API関係と、jQuery(jQuery UI)最強って感じてます。

中でも、ウケがいいのが、「jquery-week-calendar」週間のカレンダーってiPhone標準の
カレンダーアプリにも有りませんが、日本人なら週間のカレンダー欲しいです・・・

Link: https://github.com/robmonie/jquery-week-calendar


画面はこんな感じ。ウィンドウのサイズに中身が追従します。

古いブラウザだと重いんですがCSSハックの完璧でIE6も対応ずみ。
あとは、自分の使い方に合わせてローカライズやカスタマイズすれば安定してそうです。

他力本願、大切ですね。これまでも・・・ずっと、これからも・・・

ゆるゆるスマートフォン開発の初歩的なTips

役に立たないスマートフォン開発のTipsを定期的に書いていくことにしました。

其の壱:スマートフォンのUI(ユーザーインターフェース)を考えるとき

iPhoneのInterface Builderなどで、画面を設計するには手間がかかります。Andoroidならなおさらです。
いきなり作っても出来が良くないと作業の出戻りになるので紙でイメージしてからUIの実装に取りかかります。

使うのは、無印良品で売っている「貼ったまま読める透明付箋紙」ってやつ。
リンク:貼ったまま読める透明付箋紙 140x95mm・20枚(税込525円)

この大きめの付箋紙に画面を書いて並べれば画面遷移のイメージがつかみやすくなります。

写真が見づらいですが、実際には壁にペタペタと貼っていく感じです。


其の弐:帳票が必要になったとき

迷わず、EXCELの帳票テンプレートを使い回します。
おそらく、帳票なんてものは元のテンプレートあるはず。
まずEXCELで帳票を開いてからWebページとして書き出します。
そのファイルを元にHTML内の不要な要素を消したり、CSSを修正して
PHPなどでアクセスできるWebページとして仕上げます。

私は元を取らないといけないのでDreamweaverを使っています。

その辺にあるものを使い回して楽しましょう!!

僕なりの社会との交わり方、働き方(プログラマー回顧録)

いきなりだけど、僕には持病がある。

だからといって何かを求めているわけではないけど、身体がキツイときはあるし、週一回は病院通いなど「めんどくさい身体」とセットになっている。

そんな僕の一応の肩書きは「フリープログラマー」。

なんの役に立つか、誰が為か分からないけど、自分のことを話してみようと思う。

幼少期:
僕は、「さぬきうどん」しか知られていない四国・香川県で生まれた。
たしか5歳くらいのときは絵を描くのが好きで、思い浮かんだものを裏紙などによく描いていた。
その頃、スーパーカブに乗って、よく家にやって来ていた叔父さんに絵を見せたところ、「おー上手いな」とか「何でもいいから、そうして続けることが大事だぞ」などと言われ、ちょっと嬉しくなっていた。
今、考えると、うちの家族は根気がないことを間接的に言っていたのかもしれない。

小学生:
ある日、学校に行くと掲示板のところに「NECプログラムコンテスト賞金10万円」みたいな張り紙がされていた。
ちょうどその頃は、パソコンってものは自分で思ったとおりに動くものすごい機械だと勘違いしていたので、先生に参加したいといったが、プログラムなんて分かる先生はいなかったのでコンテストは簡単に諦め、その代わりに電機店でパソコンを触るようになった。店に通って触るだけ触って、その店で買ったものはフロッピーディスクだけ。
まさしく営業妨害だった。

中学生:
ようやく、パソコンを長い時間触れるようになった。美術部に入ったが、コンピュータ部みたいなのが無かったので非公式に作った。
パソコンはシャープのものすごく古い機種と、富士通のFMVが触ることができたが、なぜかシャープの古いのばかり触っていた。

我が家は自営業(建設業)で2、3ヶ月収入がないのは当たり前の生活だったけど、自分のパソコンを買ってもらうことにも成功した。当然の成り行きでシャープ製品だった。
スクリプトみたいなものから、簡単な機械語まで、ひたすらプログラムを作った。
学校でも、とびっきり頭のいいクラスメイトが遊びに来て自分が作ったゲームを遊んでくれたり
数学を教えてくれたり(結局わからなかったけど)してすごく嬉しかった。

そして、この頃、「ドラクエ」や「風来のシレン」でおなじみのCHUN SOFTの中村光一さんが、
同じ香川県出身で高校時代から有名なプログラマーだったと知って憧れるようになった。

高校生:
家の事もあったので、進学校へ行くことは最初から考えず、工業高校に入った。
親は進学校へ行って欲しいと思っていたかもしれない。
ただ、仲のよい友達が、ほとんど進学校へ行ってしまったのでそれは少し寂しかった。

工業高校ではコンピュータ部があったので、即効入った。
当然ながら、詳しい先生もいて、環境的には恵まれていた。
この頃になると、開発言語はC言語。
先生から作るように言われたのは基本情報技術者試験などで出てくる「CASL2エミュレータ」。
自分で作っていたのは、とあるアニメのキャラクターが登場する「CPU対戦型のオセロゲーム」などだった。
文化祭用に作っていたアドベンチャーゲームは見事に失敗した。

コンピュータ部の部長でもあったし、おそらくコンピュータについては結構やっていたと思う。
だから、情報系に関してだけは学校でも上位だった。
そうは言っても、どこにでもある工業高校。就職、進学には推薦が必須。
当然ながら、職種はプログラマーで親を安心させたいという気持ちもあったので、
横浜にある大手電機メーカー系のソフトウェア会社に就職した。

社会人:
会社に入ると、それはそれは優秀そうな人がいっぱいいたり、プログラマーらしく(?)ちょっと変な人がいたり、いろいろ経験した。
僕は体調が悪くなり、仕事が出来る状態ではなくなったので、会社を辞めることにしたが、いまでも、その頃の同期の人とはSkypeなどで話すことが多い。
最新のAndoroid端末のことや、半導体業界の裏話などが聞けて面白い。

完全なるニート時代:
色々なところが悪くなり入院したり、ただただ寝たりする日が続いていた。
病院にいても点滴に頼って無理やり眠る感じなのだけど、時々、深夜の病棟が慌ただしくなる。
病院では元気になって退院する人と同じくらい、力尽きてしまう人もいる。
現実から逃げ出したい気持ちでいっぱいだった。
退院が許されても、その気持を完全に忘れることは出来なかった。

模索の時代:
まるで期待もしていなかったが、持病があることを言いつつハローワークなどに行ってみたりした。
そしてそこで言われたのは「十分な加療をし、働ける状態にあるという医師の診断書が必要」というつれない返事だった。
「終わった」・・・本当にそう思った。

職業訓練
ぼくはTwitterを始めたとき、できるだけIT系の人をフォローしようと考えた。
アイコンはともかく情報系の人が多いことはすぐにわかったし、文系の人は話が面白かった。
そして、Twitterで刺激を受けながら、職業訓練を受けることにした。
職業訓練というのは、たとえばWebデザイナーになるための最低限の知識を習得したり、就職に有利になる資格の取得を目指すものだ。しかも、生活費を支給してもらえる。
一応、職業訓練といっても立場は学生なので、学割が使えたりする。
僕はもらったお金が生活のために大切なお金だったが、無理して「Adobe CS5 Web Premium」を買った。
学割で75%の値引きと言っても、12万円くらいする恐ろしいソフトだ。
でも、なにかにつけてPhotoShopや、IllustratorFlashが必要に感じていたので頑張って買った。

その他、お金で買った物がMac Book Pro 13inch(2010 late.)だ。
これは、どちらかと言えば、iPhoneのアプリケーション開発がやってみたくて買った。
iPhoneのアプリはObjective-Cという聞いたこともない言語がメインで使われていて、最初は何が何だか分からなかった。
後に他の開発言語も使うようになったけど、iPhoneアプリはカメラとか、GPSとか、ネットが不安定とか、バッテリーが無いとか、電話がかかってくるとか、通常のパソコンのアプリとはまるで違ったことを勉強する必要があった。
こんなことをしてて仕事に繋がるのかと思うと、とても厳しく感じたし辛かった。

Twitterの力:
ときどき、IT系のことをつぶやいていた僕のところにDMが届いた。
「近くでSOHOの人のイベントがあって、Webデザイナーとかプログラマーが集まるから参加してみない?」
というものだった。
今の自分が、参加して大丈夫か心配だったが、Webデザインでは目立てそうにないので、
iPhoneのゲームを作って、そのイベントで見てもらった。
「どうやって作っているのか?、絵はどうしたの?、音楽は?」色々聞かれたので包み隠さず話した。

そうして、5時間にも及ぶイベントが会場になっている喫茶店閉店時間ということで終わった。
参加者の中にiPhoneアプリを作っている人がいて、とても抱えきれないほどの仕事の依頼が来ているんだと言って、
僕に「ここに電話してみて。気さくな会社だし、なにか出来る仕事があるだろうから」といって一枚の名刺を渡してくれた。

その名刺をくれた人はフリープログラマーで、温厚で物静かな素敵な人だった。
僕は一週間かけて、ゲームの完成度を高めて、その会社を訪問した。
最初は派遣社員とかの登録に来たのかと思っていたようだったけど、自作のゲームを見せ、
自分の今まで考えていたアイデアを話したら、「ある程度、自由に作ってもらえる在宅の受託開発のほうがいいかな」と
言ってもらえた。
通院などが欠かせない自分にとって在宅というのは魅力的だった。

みんなに感謝:
僕はプログラムしかやったことがない。現時点では、とても一人ではやっていけない人間だ。
それでも、すでに2つほどお仕事の依頼が来ている。
この仕事を探している段階で、低学歴の履歴書や、エントリーシート、業務経歴書、病気のことなどを
担当者が重要視したとしたら、確実に門前払いだったと思う。

しかし、そんな紙よりも自前のiPhoneiPadでデモした自作ゲームのインパクトが強かったようで
企画から開発、最終的な品質確保まで一貫してできること、開発工数(時間)を押さえていることを評価してもらえた。

今、iPhoneなどスマートフォンアプリの開発者は大手ソフトウェア会社でも、地方の小さい会社でも、
圧倒的に不足しているのが現状のようだ。なにせ、ここ2年ぐらいで大幅に需要が増えたのだから。

プログラマーを目指す人はGoogleで「iPhone 受託開発」等のキーワードで、ちょっと調べてみたらどうだろうか。
独学が前提だけど、仕事は確実にあるはず。

Google検索や2chでは、「受託開発」についても、社会人時代の大手電機メーカーについても、
ネガディブなことばかり書かれているかもしれないが、僕を紹介してくれた同じ年くらいの人は
立派なマンションに住んでいる。

給料制じゃないから、頑張り次第なのだ。

さいごに:
今日のこのブログは、何かの宣伝ではない。

自分の身体にハンデがあっても、学歴にコンプレックスがあっても、
スーパーカブの叔父さんが言っていたように「何でもいいから、続けることが大事」で、
自分の作品を次々アウトプットしていけば、どこかの誰かが声をかけてくれるかもしれない。

「この人なら任せてもいいかな」位に思ってもらえれば、少なくとも
ご飯を食べていける程度の仕事になるチャンスはある。

だから、みんなも自暴自棄になったりせず、自分の信じたことを続けることと、
自分からPRすることを忘れないでほしい。

どうなるかは分からないけど、何もしないで不平不満を言っているより、
馬鹿にされてもいいから、何か活動を続けていたほうがいいと思う。

生意気なことを言ってすいません。

Corona SDKを使ったお気軽ゲームを多数の人に見てもらった

ひょんなことからWeb制作に関わっている方々の交流会に誘われました。

初参加なので自己紹介・・・と思ったのですが、ニートです。」で終わってしまいそうなのでデザインのセンスがないプログラマ寄りの人間であることを知って欲しくてサンプルゲームを見てもらうことにしました。

アクションゲームが熱かろうということでCorona SDK物理エンジンを使って書いてみました。

ゲーム画面がコチラ

Andoroid風(NexusOne)なシミュレータ画面になってますが、iPhoneiPadでも動くようになってます。
プログラムはLua言語で書かれていて非常に短いコードです。

メインのコードはこんな感じです。
ファイル名:main.lua

local physics = require("physics")
physics.start()

local screenW, screenH = display.contentWidth, display.contentHeight
local friction = 0.8
local gravity = .09
local speedX, speedY, prevX, prevY, lastTime, prevTime = 0, 0, 0, 0, 0, 0

local background = display.newImage( "BackGround.png" )
background.x = screenW / 2
background.y = screenH / 2

local player = display.newImage("Player.png");
player.x = screenW / 2
player.y = 240
physics.addBody( player, "static", { friction=0.5, bounce=0.3 } )

-- Falling object.
local function newCrate()
	rand = math.random( 100 )
	local j

	if (rand < 33) then
		j = display.newImage("Udon.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=0.9, friction=0.3, bounce=0.1 } )
	elseif (rand < 66) then
		j = display.newImage("Cake.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=1.4, friction=0.3, bounce=0.2 } )
	else
		j = display.newImage("Rock.png");
		j.x = 60 + math.random( 160 )
		j.y = -100
		physics.addBody( j, { density=0.3, friction=0.2, bounce=0.3 } )
	end
end

-- Move character.
local function startDrag( event )
	local t = event.target
	local phase = event.phase

	if "began" == phase then
		display.getCurrentStage():setFocus( t )
		t.isFocus = true

		-- Store initial position
		t.x0 = event.x - t.x

	elseif t.isFocus then
		if "moved" == phase then
					
			t.x = event.x - t.x0
			-- t.y = event.y - t.y0

		elseif "ended" == phase or "cancelled" == phase then
			lastTime = event.time

			display.getCurrentStage():setFocus( nil )
			t.isFocus = false
		end
	end

	return true
end

-- Run games.
player:addEventListener("touch", startDrag)
local dropCrates = timer.performWithDelay( 500, newCrate, 120 )

うん、短い。70ステップぐらい。
0.5秒おきに上からモノが降ってくる処理と、画面をタップしてキャラクターを動かす処理だけです。

続いて、アプリケーションの定義ファイル。
ファイル名:config.lua

application =
{
	content =
	{
		width = 320,
		height = 480,
		scale = "letterbox" -- zoom to screen dimensions (may add extra space at top or sides)
	},
}

画面の解像度を設定しています。iPadのような高解像度の端末でも低解像度のものに合わせます。

そして、画面の向きの定義ファイル。
ファイル名:build.settings

settings =
{
	orientation =
 	{
		default = "landscapeRight",
 		supported =
 		{
 		"landscapeLeft", "landscapeRight"
		}
	}
}

端末を横長の方向で動かすように定義しています。
このファイルが無い場合は、画面は縦長の方向となります。

自分で用意するファイルは、これらのコードと背景やキャラクターの画像ファイルです。

触っているうちに気になったこととして、iPhone系とAndoroid系の双方で動かすためのポイントがいくつかあります。

  • iPhone系、Andoroid系どちらか一方しかサポートしない関数を使わない
  • ハードによる差を吸収するため座業は絶対値ではなく仮想のスクリーン座標を使う
  • Mac OS Xでは文字コードUTF-8、改行コードLFを使い、Windows版では文字コードShift-JIS、改行コードCR+LFを使うのでファイルコピーする場合は注意
  • Windows版のCorona SDKは、まだベータ版

iPhone版をApp Storeに登録しようと考えている方は、いずれにせよMacが必要なのでMac版の方がいいでしょう。

交流会での反応としては、3DCGを専門にやっている方とかスマートフォンアプリの開発に興味がある方にはおおむね好評。
絵がバリバリかける人、ニーズをつかんでいる人、いろんな意見出して何か作りたいねって感じで閉幕しました。

ニートが久しぶりに対話らしい対話したので疲れました。