2014年12月16日

linuxのcronをどこに書くかやっと判った話。

 linuxで定期的にコマンド実行した時は、「cron」に書きますが、今まで書く場所を間違っていたような気がしました。

 crontabを使って書いていたのですが、これだた実際のファイルがあるわけではなく、linux上に設定を直接書いている感じなんですよね。

 ちょっと調べたら、ちゃんとありました。
決まったディレクトリにファイルを置いて実行してもらやり方が。

/etc/cron.dディレクトリにcrontabで書いていたものと同じ記述をしたファイルを置くことでいいんですね。
いやー、最近知りました(動くことを優先して真面目に最適な方法を調べてませんでした。反省)


このサイトを良く見ます。
https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html


余談ですが、cronで最近やらかした失敗を一つ。

設定ミスなんですが、下のような記述をしました。

* 4 * * * root 何らかのコマンド

4:00に何らかのコマンドを一回実行したかったのですが、時間のところを「*」にしたものだから、1分毎にコマンドが実行されてしまったようです。
このコマンドの中にメールを送信するというのがあったので1分ごとのメールが送信されていました。
それも、自分でない人に対して。
自分のところに送るようにしていれば、直ぐに気づいて修正したのですが…。とほほです。


2014年12月9日

CakePHPで不思議(超怖い)な現象が発生

 CakePHPのモデルのreadメソッドを使うと何故か関係ないレコード(ループ内の中で更新しているので全然会計ないわけではないですが)がUPDATEされてしまう現象が発生してしまっています。

何をしているかといいますと、
 複数のコントローラーから共通の更新処理をしたいのでコンポーネントの中でモデルを操作しています。
 (コンポーネントのinitializeメソッドで呼び出し元のコントローラを引き継いでいます。)

 コンポーネントに引き継がれているコントローラーのモデルのreadメソッドを使うと、何故かそのレコードの全項目が更新されてしまうようなのです。
readメソッドをやめて、findByメソッドを使うようにしたら上手くいったのですが、原因不明でものすごく気持ち悪いです。


public function initialize(Controller $controller) {
    $this->controller = $controller;
}

$rs = $this->controller->XXXXX->read(null, $id);


$rs = $this->controller->XXXXX->findById($id);



何か情報を持っている方いましたら、ご連絡をお待ちしております。

環境を書き忘れました。
簡単に。

CakePHPのバージョンは、2.5.3です。
データベースは、MySQL 5.6.21 (AWSのRDSを使っています。)

2014年12月7日

アリバイ工作的な作業をする人はバイバイ

 アリバイ作り的な仕事の仕方をする人は、去ってほしい。
ここでいうアリバイとは、「ある作業をしたはいいが、正しくされていないことをいっています。
仕事(作業)したくない人は、「作業したフラグ」をオンにすることが仕事だと思っているようです。

 今回発生したことは、データコンバートの作業が必要なのですが、古いデータでデータコンバートをしたり、データの不備を指摘しているのにその改善をせずにそのまま使っているのです。
(そもそも、最新データを送ってきたのは、アリバイ工作的仕事をした人なのに…)
 10,000歩譲って、納期来てしまったから送ってしまっただったら、まだわかるような気もしますが(先に相談がない時点でNGですが)、既に納期なんてとうの昔に過ぎているのでぜんぜんダメです。

 なんか、嫌がらせをされているのでしょうか?

大抵、この状態で出てくる言い訳は、「ちゃんと納品したじゃないですか!!(怒)ただちょっと間違っていただけですよね!!(怒)」的な言葉になるんですよね。
 確かに間違うことはあると思います。人間ですし、ルーチンワークでもないので。
でも、限度ってものがあると思うんですよね。

 以前、ここにも書きましたが、間に合わないんだったら「早めに上司や、先方に相談すれば大抵のことは大きな問題にならない」んですよ。

2014年12月2日

名言ができたので発表します

発表しますっ!


「こたつの周りに使いたい道具を集めたようなシステムは破綻する」


どういう意味かというと

 今その瞬間にしたいことや欲しいものを周りに集めてしまうとどれが重要かわからなくなりやりたいことが直ぐにできなくなってします。
 もっと言うと別の人が使おうとした時に使えなくなる。
ただ散らかっているだけに見える。
 とか、なんでこんな機能がここにあるの?とかクライアントが言い始めることも。
(最近実際にあったんですよ。絶対必要だからと言っていたから頑張って設定して実装までしたのに。後で使う可能性があるから残しておいてと言っているが絶対に忘れる。)


 どうですか?こんなシステムを要求されたことは無いですか?

こんな場合は、やはり受けるのではなく、理論的に説明できるようになっている必要があります。
また、もしかするとそのクライアントの業務改善が先なのかもしれませんね。
実は、クライアントは自分たちの業務をわかっているようでわかっていないのです。
わかっているのは、自分の手の動かし方だけかもしれません。


 皆さん、気をつけてシステム開発をしましょう。

バイバイ!デスマーチ。

仕事を遂行することで一番大切なことは?

 皆さんは、人と仕事をする上で大切なことは何だと思いますか?
納期?クオリティー?楽しいかどうか?ちゃんと支払がされるかどか?犯罪ではないか?

どれも大切だと思いますが、一番大切なのは

『トラブルが発生した時に直ぐに関係者に連絡する』

だと思っています。

自分で解決できると思っても

こんなのは当たり前だと思いますが、なかなか世の中そうでもなかったりします。

  • 納期までにクオリティーの低すぎるものを納品してみたりとか
  • 遅れまくっているのに誰もなにも言わないことをいいことに黙っていたりとか
  • 更には、蕎麦屋の出前の今出ました的に、聞くと今やろうと思っていたとか
  • 客の担当が居なくなったから進まないだとか

こんなもんやらない理由だからいくらでも出てきます。

 トラブルの予兆があったら、直ぐに動けるように準備するとかいろいろすることはあると思うんですけどね。
 ここには、悪循環の種というのも存在します。
そのトラブルを発生させようとしている担当の上司が「トラブル的な話を聞きたがらない」雰囲気を出しているとそのことが上に伝わらなくなってしまします。

 こんなスパイラルです。(こんな絵色んな本に載ってますよ)

  1. 「トラブル」が発生しそうになる
  2. 解決できるかも(叱られるのが嫌)だから黙っておく
  3. トラブルが発生する
  4. 対応するために時間が足りなくなる
  5. 人を総動員して対応する
  6. 人が減った他のプロジェクトがトラブり始める
  7. 1.に最初に戻る


 さらに悪いことにその組織のトップがそれをやっていると、もうどうにもならない。
一人社長をするんだったら原因を他に転嫁するのではなく自分で先に動くようにしてほしいものです。

 直近のプロジェクトでそんなことが起きています。
「女性の社長で従業員がなし」そんなことはどーでもいいんです。
それを理由にできないんだったらさっさと会社を畳んで欲しいです。大きな問題にならないうちに。


さぁ、みなさんもトラブルの予兆を発表しまくりましょう!

 だって、発表して何もおきなかったら、おきなくてよかったねとなって終わりですもんね。
もし、やばそうだったとしても早めに対処できるし、手伝ってもらった人は他の人に手伝ってもらえるかもしれませんしね。

2014年11月21日

はてなが沢山浮かぶよ

 会議が終わった後には、議事録やまとめた結果を出すのがあたりまえだと思うのですが、それができないのは、とっても問題があると思いますよね。

 長時間会議した後に直ぐにまとめを出しなさいとは言いませんが、次の日くらいにはなにかアクションを起こしてほしいわけです。
 悪い意味での依存心を持っている人は悪でしかないと思います。

そういうまとめを出さない割には、SNSで記事を投稿したりしていてアホらしくなります。
さらに、その中で、この人はすごいとかという評価を受けていると、「はっ?実体はどんな人か判ってます?」とか言いたくなります。

 「まとめないと困るのは、自分でしょ?」くらいに思われているような気がしまして…。

腹立たしいのですよ。

Googleのハングアウトで会議

 以前から気になっていたGoogleのハングアウトでお客さんと5時間の会議をしてみました。

 ITの展示会やGoogle Appsの説明会でよくデモをしているのを見かけていたので実際の業務でどれくらいできるのかを試したくてうずうずしていました(まぁ、一人で仕事してるので近くに試せる人がいないのです)。

 体験した感じでは、使える!でした。
たまに音が聞こえなくなったりすることがありました(PCの何かの設定をいじったのか原因不明)が、音質はクリア、画像はHDなので問題はありませんでした。
 同じ資料を共有して見たりできます。
ドキュメントツールとして、GoogleDriveのスプレッドシートやドキュメントを使えば同時に編集もできるしとても良いと良いのではないかと思います。
 実際の距離感としては、東京と新潟間でやってました。

 Google+でハングアウトのイベントを作っておくことで招待した人は簡単にハングアウトに参加することができます。

 ハングアウトの内容をビデオとして録画することも可能です。
その動画は、YouTubeに限定でアップロードされます。
実験ではやってみたのですが、本番会議ではやっていません。

まとめ


 良い点はこんな感じです

  • 無料でシステムを使える
    ヘッドセットを準備するくらいの出費
  • 画面の共有ができる(見るだけ)
    自分が持っている資料を表示してそれを簡単に共有してみてもらうことができます。
    例えば、画面の操作など見てもらうことができます。
  • Wifiでも我慢すれば使える
    ビデオを止めれば音品質もよるなるのかも

注意点はこんな感じでしょうか?

  • 周りが静かなところで会議を行う。
    マイクの感度にもよると思いますが、雑音がうるさくて何を言ってるかわからなくなる。
  • ヘッドセットを使って話す
  • PCのマイクは止めておく。
    止めておかないと2箇所から音を拾ってエコーがかかったみたいになる。
  • 会議の参加者は、近くに寄らない
    別の人の声を拾って聞きづらくなる。

実際に使ったヘッドセットはこれ

2014年11月18日

JQueryUIのaddClassが動作しない場合がある

 Webシステムで画面の操作をするのにJavaScriptを使用していると思います。
そこで、一般的に使用されているJQueryを使ってJavaScriptを書いています。

 今回、JQueryのよく使うメソッドのaddClassでバグらしい動作を発見しました。

JQueryのバージョンは、「2.1.0」を使用しています。
JQuery UIのバージョンは、「1.10.4」を使用しています。

現象
$(funciton() { });内で書いたロジックが正常動作していない。


やりたいことはidがitemの項目に、"readonly"というclassを付ける処理

$(function() {

  $("#item").addClass("readonly");

});

この場合、readonlyというclassは付きません。メソッドチェーンを書いた場合、その後ろも動作していないようです。


OKパターン
$(function() {

  $("#item").addClass("readonly", 1);

});
JQuery UIで拡張されたaddClassの二個目の引数(duration)を設定(1ms)設定することで動作しました。


NGパターンが絶対ダメかというとそういうわけではなく、何かのイベント(changeイベントなど)で実行した場合は正常動作します。
※それだから、解決まで時間がかかりました。

ただ、新しいバージョンの適用やJQuery自体のロジックの調査は今のところ考えていません。時間ができたらやってみようかと思っています。
JQueryとJQueryUIのバージョンの問題の可能性もありそう…。


2014年11月6日

嫌なことがあったときの対応策

 生きているといろいろなことがありますが、目線を変えて考えるといろんなことを消化できていい方向に向くことができます。

 仕事の対人間でなにかあってもここれを考えることですこくは楽になります。
(もっと前から知っていればもっと楽になれたかも…)

嫌なことがあったら、
・自分目線
・相手目線
・神様目線+自分の葬式で言ってもらいたい言葉
でそのことを見ることで、相手を理解し、なぜその試練を神は与えたかを考えて、消化することができるよ。


 さぁ、「レッツ、トライ、トライ、トライ、摩訶不思議」!

2014年11月4日

仕事で初めての体験をしています

 すごいです。
目の前で自分の仕事を放棄して逃げようと画策している人がいます。
この人と仕事をしています(こわいでしょー)。

 脅しを仕掛けてきたり(怖い脅しではなく、時間なくなるけどいいですかー?ハハハみたいな)、あの件はどうなったかを確認すると、「もう時間が無いので電話切りまーす」とか。
 あと、こっちに対して「貴方がすれば?」みたいな言い方してくるし。

 あまりにもアホすぎで閉口してしまいました。

もう、退場してもらうしか無いかもしれませんな、これは。
そのほうが、お互い幸せなのかもしれない。


こんなコンサルに出会って仕事してる人いませんか?
どうやって対応するか話を聞きたいです。

2014年11月3日

セミナーズフェスタのチケットもらった

 あるところからセミナーズフェスとのチケット(S席)を2枚プレゼントされました。
そこに登壇する人が世界的に有名な人ばかりです。
 今回、会わなかったら生で見ることはもうないんではないかという人もいます。

一応チケットに以下の人が登壇されます。

  • ジェームス・スキナー(経営コンサルタント)
  • ジム・ロジャース(投資家)
  • トム・ピーターズ(経営コンサルタント)
  • ジェイ・エイブラハム(経営者)
  • ジム・コリンズ(衛星生中継)
  • 和仁達也
  • 竹中平蔵
  • 堀江貴文
  • 神田昌典
  • 近藤太香巳
  • 細川佳之
  • 池松耕次(←のセミナーには何回か出たことがあります。)


3日間あるのですが、だれがいつ登壇するかが公開されていないのです。
なので、3日間全部行かないと聞きたい人の話を聞けないシステムになっています。
(タイムテーブル非公開なんてひどい…。)
 まぁ、3日間この人達を拘束するとなるとギャラも半端ないでしょうしね。

ホントは、15日は別の用事があるのですが、キャンセルして泊まりで行こうかと考えています。


チケットが2枚あるので意識の高い人と行きたいと思っています。
一応声をかけようとしている人はいるのですが、3日間なので結構厳しいですよね。
でも、意識が高かったら、優先順位を替えて来ると思います。
そもそも、S席じゃなくて、VIP席とか、Diamond席を自分で買って聞きに行くかもですが…。
高いチケットは、ランチセッションにも参加できるようです。


セミナーズフェスタ 2014 Autumn at 幕張メッセ

意識がしてないとやばい話。

 あるSNSのことですが、知人からDVDを焼いてもらっちゃったというメッセージとともにそのDVDの写真を投稿している記事を発見してしまいました。
 そのDVDの表面にもちゃんとプリンタで印刷されてるのできっちりやってるなーって思ったりもしました。

 まぁ、嬉しくて自慢したかったのだと思うけど、誰が見てるかわからないとこに投稿するのはどうかと思いますね。

 やっぱり、「コピーして配るは悪い」という意識が無いのが問題!
ばれなければ良いとか、みんながやっているから良いというのを変えていかないとですよね。
目先良ければと思っていると全然解決はしないです。

 更にいうと、それを問題かどうかわからない子供が親がやっているから問題ないんだと思って、同じことをしてしまうことだと思っています。

 まぁ、永久に無くならないと思いますが…。

2014年10月24日

カレンダーの祭日が変わることでITの仕事が発生する

こんな記事を見つけました。

 自民党は23日の合同会議で、「7月の第3月曜日」と定められている「海の日」について、制定当初の7月20日に戻す祝日法改正案を了承しました。

 昔、カレンダーの祭日を自動的に計算する仕組み(ハッピーマンデー対応とか言ってたと思う)をいれるという改修があったと思いますが、この法案が通ると、7/20は祭日という設定を入れないとですね。
 海の日を計算するロジックの削除して、7/20は、海の日で祭日というデータの設定。

 何のために、休日を変更するんでしょうかね?
IT業界に仕事を発生させるため?

2014年10月20日

MySQLテーブルのレコードサイズとか出すSQL

 データ量の見積をするために、テーブルのレコードサイズを必要があったので、SQLで出力できる方法を探しました。


SELECT
  table_name,
  engine,
  table_rows as tbl_rows,
  avg_row_length as rlen,
  floor((data_length + index_length) / 1024 / 1024) as allMB,
  floor((data_length) / 1024 / 1024) as dMB,
  floor((index_length) / 1024 / 1024) as iMB
FROM
  information_schema.tables
WHERE
  table_schema = database() AND engine IS NOT NULL
ORDER BY
  table_name
, (data_length + index_length) desc;
こちらから拝借しました。
http://d.hatena.ne.jp/sho-yamasaki/20120405/1333640589

2014年10月19日

IT Pro EXPO 2014観てきました

 久しぶりの展示会でしたがIT Pro EXPOを観てきたので忘れないうちに記録、記録。
覚えてるのだけですが…。

 やはり、クラウド関連の展示が一番大きかったと思います。
特に、awsは、いろいろな業者が展示をしていました。
他にもいろいろありましたけどね。
では、興味があったものを列挙しておきます。


SONY DPT-S1(デジタルペーパー)

 ソニーのデジタルペーパーです。
実際に書いてみましたが、ちょっと遅れて線が表示されるような感じでした。
そこが気にならなければ自由に文字や絵を書くことができました。
 一筆書きの感じで図形が確定するので、消すと一筆書きしたものが一度に消えてしまいます(データ量を減らすためにやっているのでしょう。ベクタ形式というのかな?)。
 ペンを話さずにずーっと書かないほうが良いと思います。
説明してくれる人が言ってたのですが、そのあたりは、改善するように次期バージョンを開発中だそうです。
 持った感じは、300g位なので非常に軽かったです。
 デモはやってなかったようですが、会議ソリューションサーバーというのがあって、データの共有もできるようです。

ちょっと使ってみたいと思いました。でも、90,000円はちょっと手が出ない。

EPSON スマートチャージ

 固定料金で結構の枚数までを印刷できるというプリンタのレンタルサービスです。
印刷方式は、インクジェットプリンタプリンタでした。カラーの印刷のでもをしていまして、印刷直後でも滲みなどもありませんでした。ちょっと薄かったので、インク少なめ印刷だったのかもしれませんが。
 良いところは、プランの枚数を超えない限り、10,000円と電気代だけで済むことです。
インクは一般的に売っているものではなく、袋にたっぷりのインクが入っている形式でした。
10,000円以内だったら絶対なくならないそうです。

4つのプランがあります。
一番安いスタンダードBプラン。
月額基本料金:10,000円(税別)
モノクロ:2,000枚  カラー:600枚までがプランに組み込まれています。
この枚数を超えると、モノクロ:1.5円/枚 カラー:5円/枚です。

 あと、最初の契約で、50,000円かかると言っていたような気がします。長く使うところはお得ですね。

サイボウズ kintone

 サイボウズが提供しているクラウドのアプリケーション作成プラットフォームです。
プログラミング不要でエントリ画面を作成することができます。
 このプラットフォームの競合はどこか確認したところ、notesと言ってました。
途中まで話をしてくれていた営業の人を押しのけて、開発者(?)のおねえさんが出てきてアプリケーションの作り方の説明をしてくれました。
 入力コンポーネントを画面に貼り付けて画面レイアウトを作っていくとそのままデータベースができていく感じでした。
 よくあるのヘッダ/明細形式の画面はどうやって作るかと聞いたところ本来の意味のヘッダ/明細の形式はできないようです。
メインで作ったデータの中に明細をもたせる形式なでした。

 データ同士をキーなどで関連付ける機能もありませんでした。
例えば、サブ画面(マスタ等)でデータを選択して、メイン画面に反映するときは、キーではなく、値そのものを持ってくるというものでした。
 なので、マスタの内容が変わってもメイン側に設定した内容は、マスタに合わせて変更されることはありません。
 仕組み上仕方ないのでしょう。
 他には、API、プラグイン、JavaScriptなどのプログラミング言語を使って処理を書くこともできるようです。
価格は、
 ライトコース:780円/1ユーザー
 スタンダードコース:1,500円/1ユーザー
です。
他にもいくつかのオプションもあります。

 ちょっと興味があるので、30日間の無料お試しをしてみたいと思います。

Pnasonic Let's note

 すごく小さいPCが展示されていました。
RZ4シリーズでわうか、770gくらい。
10インチのタッチパネルですが、解像度がWuXGA(1,920×900)で十分に広いように感じます。
本体の両端は、いろいろな入出力端子がありました。
アナログRGBとHDMIが付いているので、3画面で使うことができます。画面が狭くて仕事にならないという問題はないと思います。
アナログRGBは、プロジェクタへの接続の要件があるからまだ付いているそうです。
 液晶ディスプレイを本体の裏に持って行くことでタブレットPCに早変わりです。キーボードを保護するカバーもあるのでキーボードの状態を気にするひとも安心です。そもそもキーボードが机に当たらない工夫はされているんですけどね。
 店頭販売モデルは、スペックが低くてあまり手が出ないのですが(値段は安い)、スペック重視の自分としては、ネット販売もでるは、結構いい値段はしますが、スペックはだいぶよくなります。
 メモリは、最大8MBですが、16MBまでいらないでしょう。そんなヘビーな使い方はしないと思うので。
 ほしいですが、B10がまだ現役なので手が出ません…。(MacBook Airも気になってるし)

 頑丈モデルのビデオを流していました。
雪の中でスノーモービルで引きづっても壊れませんよというのをやっていました。
厚みも、重さも半端ないです。
エピソードとして、頑丈モデルが銃の弾丸を止めたという話をしていました。残念ながら液晶は割れたそうですが。
 頑丈モデルのいろいろなサイズのタブレットも出ていました。
Windows8.1とAndoridのそれぞれのバージョンが出ていました。当然、店頭には並びません。

トレンドマイクロ AWSとTrend Miro Deep Security

 オンプレミス環境と同等の正キュリティを実現するという製品でした。
ウィルス対策、IPS/IDS、Firewall、変更監視、ログ監視を一括に担う製品です。
Auto Scalingに対応するためにホスト型(インスタンスにインストール)でセキュリティ対策等をしてくれます。
 ゲートウェイ型だと、SPOFとなりえるのでよろしくないと言っていました。
1インスタンスあたり213,500(初年度)なのでちょっと使ってみたいということはなかなかできないかも。
 マネージャとエージェントで構成される製品ですが、11月位にエージェントのみの製品もでるようです。マネージャは、トレンドマイクロの管理サイトで共通的にしようできるようになるようです。


Amazon Web Service関係の展示

 いろいろありました。ほとんど忘れました。
一個だけ、TOKYU HANDSの10分間セミナー(一番人気があったセミナーのようでした)が印象的でした。
 ほんの一部を残して、すべてのサーバーをawsに移行する予定だそうです。
なえ、クラウドはどこが良いのかといろいろなところに聞いてみたら、「awsだと思うよ」という回答がほとんどだったそうです。
 その話していた人は、いろいろ机上でやるよりも実際にawsでやってみるほうがいろいろなことがわかって良いと言っていました。
 確かに、固定料金がかかるわけではなく、スペックを上げたり、下げたり、構成を変えたりいろいろできます。インスタンスを止めれば、お金はかかりません。
確かにそのとおりだと思いました。

 この話を聞いたおかげで、現在携わっている仕事のサーバーは、awsがいいということに革新が持てました。
 その会社は、10人程度の人が使うシステムですので、それほど大きな構成にする必要もないので試しにやってみる価値もあります。
 もしうまく行かなくても(そんなことはないと思いますが)、インスタンスをすべて止めて、他に行けばいいだけですし。

 最後の最後にawsの会社の人(?)と話す時間があって、awsで気になっていることを聞くことができて、自分が考えている構成のアイディアをもらうことができました。
 あとは、お客さん用に提案書を書いて確認してもらうだけです(よかった、よかった)。

 仕事に対する目標が一つできました。awsのパートナーになることです。無料パートナーではなくて有料のパートナーですよ。
 要件もちょっと厳しいところもありますが、頑張って要件を板いたいと思います。


 awsラブな感じになってしまいましたが、これからWebシステムを作る必要が出てきたら、awsをゴリ押しして行こうかと思いました。


2014年10月6日

どっちが本当かわかりませんが

 現在開発中のシステムの可動の日が今月はじめだったのですが、やるべきことがぜんぜん進んでおらず、止まっている状態です。

 一般的によく聞く話が、プログラムができていないから「テスト以前の話」というものです。
自分も、過去にそういったものを数々見てきたのでそれだけは絶対に避けようと思ってこの仕事をしてます。
 遅れる可能性が大きくなった時は、事前にクライアントに伝えて調整をいれるなり、順番を変えるなりして対応します。
 一番ダメなのは、そんな状況になっているのにできるかもしれないと思ってどこにも状況を伝えないで進めることです。
 特に悪い情報ほど共有しなければなりません。逆に予定通りの情報なんてしらなくて良いんです。
 悪い情報を聞きたがらない上司なり、リーダーは失格だと思います。悪い情報を聞くと怒鳴り散らしたり、自分たちで改善せよ、俺は知らないとしか言えないようなところにはいたくないです。


 ちょっと前置きが長くなりましたが、今日、エンドユーザーに状況を確認してみました。
(実は、越権行為とは思いましたが、コンサルの動きがあまりにも悪いので。)
すると、仕事の中間にいるコンサルの動きが悪いということが判明しました(3社で話さないと本当の所はわかりませんが)。
 エンドユーザから打ち合わせの要請をしないとそのコンサルは動かなかったり、連絡がないと催促すると「あぁ、そうでした。」と忘れていたりするようでした。
 エンドユーザの社長と話すといろいろと問題が見えてきたような気がします。
当初は、自分でも開発はできると言っていたが、徐々に自分がボトルネックになるからやりませんと言ったりしてるそうです(いやいや、そもそもできないんでしょ?って話)。

 このままではまずいとだいぶ前に全体をリスケしないとまずいのでエンドユーザに伝えてリスケをお願いしたいたのですが、それすら話題に出てきていないです。
 依頼したことをいつになったらできますか?と確認すると、「私も忙しいんですよ。そんな依頼されてもできません。」とか逆ギレな感じに言ってきたりします。
 何がそんな忙しいのかと思って聞いてみたら、「他社に常駐の仕事をしていて遅くまで作業しているので時間が取れない。」とか言っているのです。
 他の会社に常駐しているのは別にいいと思います(別に私は、その人の管理者でも何でもないので)。だからといって今手掛けている仕事をほっておいていいなんていうルールは、全然ありません。

 自分は、コンサルの人を仲介に相手に依頼したことが全然行われていないという印象でした。ですが、エンドユーザの社長もほぼ同じような印象でした。
 ということは、中間にいるコンサルの人の動きが悪いのではないかという答えになってしまいます。

 実際は、近いうちにあるだろ(コンサルの人のスケジュール確認中)3社の打ち合わせで本当のことがわかると思います。
 コンサルを外れてもらうのかこのまま続けて反省してもらうか、プロジェクトが中断するのか(これが一番困る) 
 ワタクシ的には、居ないほうがやりやすいのです。エンドユーザの話している内容を取りこぼさずに聞けるし、誤った解釈とかの訂正もし易いので。


(実際のところ、エンドユーザの社長が言っているのが正しいのか、コンサルの人が正しいのかわからないんですけどね。)


 まずは、そのコンサルからの折り返しメールがいつ来るのかと3社の打ち合わせをした時に何が起きるかが楽しみです。

2014年9月23日

困る

 システム設計をちょっとかじったことがある人が設計の真似事をしたものを考慮しながら真面目に設計しようとするとあれはどうしたいの?これはどうしたいの?というのがボロボロと出てきて無駄に時間が過ぎる。

 また、現行のシステムのことや、実際に使っている現場の人のことを考えずに表面上のことばかり考えるからダメダメになってしまう。
 大抵は例外処理の考慮が全然ないので運用がしにくくなってしまいます。

 さらには、何でもできるようにとか言い始めてしまう。現場の人間は分かっていないので、何でもできるようにして欲しいと言ってくるが、そういった場合は、逆にできることを制限して必要最低限のもののみ入れて置いたほうが良いのです。
(余談ですが、一般の方にHTMLを教える時にあることを教える時にいろんなやり方や簡単にできるショートカット的なことを沢山はなしす人がいますが、あれは、かえって混乱をきたします。教えている本人は意外と気づかない。沢山喋れば伝わると思ってしまう。)

 なので、お客が言ったことをちょっとまとめて、あとは課題として聞くしかないかな。

2014年9月21日

売上大事だけど、それを中心に仕事すると失敗するという話

 会社をやっていると売上は大切だと思います。えぇ、とっても大切です。
でも、そこ(売上)を中心に仕事をするとプロジェクトが進まなくなるという状態にはまっています。

 間に入っているコンサルの人は、適切な見積を出さずに「やります」なんていうから、他の仕事をして(売上をあげるため)スケジュールを守ることができなくなるんですよね。

 その理由がお客が話が解らない人だからとか、お客の仕事が忙しいからとかとかになったりするんです。
 そもそも、そのお客の動きがわかっているはずなのだから(1年も前からお客と次のシステムの話をしているらしいので)、これくらい時間を取られるからこれくらいの見積を出さないとスケジュールに間に合わなくなるなとか考えるわけですよふつーは。
 それなのに、「自分はシステムを作らないから」とか、「お客が言ったことを伝えるだけだから」とかと単純に思って安い見積もりなんて出すから、他の仕事をしないとダメだになって、変な言い訳がでるんですよ。
 (思い込みかもしれませんが、プログラミングは必ずスケジュールオーバーするのが当たり前だと思ってるのかもね。そうじゃない人も居るのですよ。)

 打ち合わせに入りましょうか?と聞くと入らないほうがいいので、私でやりますとか言い出す(プロジェクトの最初のころの話です)。
 今では、どうやってプロジェクトを進めるかの議論を始めると面倒臭がって、いろんな言い訳をしはじめたり、打ち合わせに入っていいですよ(怒)みたいな話になってくるんですよ。
 どう思います?

 エンドユーザーの社長のすごいのは(嫌味ですが…)、「貴方はスケジュールを守りますか?」とかを一番最初に言ってきたんですよね。
 「てか、自分たちが守れない動きしてるんじゃねーの?」って返したいですわ。
 

今回の起きている問題

エンドユーザー

  • 自分たちの業務を回すためのシステムを作っている意識がないらしい。(←一番問題)
  • お客が作ったシステムのテストをしないらしい。
  • 今までのシステムと違うから理解できないと言っているらしい。
  • 動かしてみないとイメージができないと言っているらしい。
    (修正してしたところを見ないと先に進めないらしい。アホか

コンサルティングのひと
  • 他の仕事で忙しいとか言って動かない(←一番問題)
  • プロジェクトを終了させるための動きができない
  • エンドユーザーが言っていることの本質をとらえられないからおかしなことを平気で言う
    (だから郵便番号と住所の入力方式で1時間も議論してしまう)
  • 営業のことをバカ(直接的には言わないが)という
  • リスケしてと言っても、責任を持ちたくないからリスケすら検討しない。

自分
  • スケジュールに間に合わないからといってコンサルを追い詰める(←一番問題)
    このままではまずいと思って言ってるのですが、文句に聞こえるらしい
  • メールでいちいち気持を逆撫でしているらしい。
  • 売上一番、仕事二番と考えている人の気持を理解する気持がない


対応案

  • コンサルの人はお金だけ回す人にする(抜けてもらう)
  • 自分が直接、エンドユーザーと話す
    自分が素晴らしい人間と思っているわけではなく、実際はどうなのかを感じたいということです。
  • エンドユーザの社長は、「鶴の一声」呪文を唱える
    ここは、結構なワンマン社長らしいので、これで営業の人も従うのではないかな?


 このプロジェクト2月ごろから始まって、10月カットオーバーの予定がいつ終わるのかがわからなくなっている状態。



一番気になるのは、このコンサルの人を慕って集まる人がいるのが不思議。
とっても世渡り上手なのか、集まってくる人たちが実体を知らないのか(一緒に仕事すればわかると思うケド)。

2014年9月19日

SONY DPT-S1 デジタルペーパー欲しい

 仕事柄(?)システム設計をする前に、いろいろと考えたり、メモしたりするのですが、印刷に失敗した裏紙を使うのですが、その紙を整理するのがとても大変だったります。
 間違って捨ててしまったり、どこかに紛れて見つからなくなったりしてしまいます。
打ち合わせとかに行くときはルーズリーフを使って打ち合わせ内容を書き留めたりもしてます。

 なにか、ひとつにまとめてたり、検索できたり簡単にできる方法はないかと考えていたら、ソニーが出していました。
個人で使うには結構高価ですが、ちょっと興味があります。


レビューの動画がありましたのでリンクを貼っておきます。
https://www.youtube.com/watch?v=tfxsRlX9cwE
https://www.youtube.com/watch?v=zJB4_wUsypY

ソニー デジタルペーパー DPT-S1

2014年9月11日

仕事用のホームページを作り直してみた。

 仕事用のホームページをWordPressで作りなおしてみました。
元々は、GoogleAppsのサイトで作っていたのですが、なんか上手く作ることができなくて、変な感じのまま放置していました。
 「こんな状態だったら、無い方がマシだわ」と思っていたのですが、この仕事をしているのに自分を紹介するホームページすら持っていないのは、ダメだなと思い、作りなおしてみました。

 内容とかデザインがかっこいいかというと全然そんなことはなく、伝えたいことだけをちょっとまとめただけなので何の見本にもなりませんが…。

 とりあえずは、今後のためのベースを作りましたというところでとどめておきます。

そのホームページはこちら↓
www.bs-factory.jp



環境とかやったこと

さくらインターネットのレンタルサーバーを借りてやってみました。
大規模なサイトを作るわけではないので、ディスク容量も沢山あるので複数のサイトを作ることができるようにしてみました。

 なかなか勝手がわからないので、WordPressの問題なのかさくらインターネットの問題なのかが解らないのがとても困りました。
 ですが、グーグル先生に聞いてみるとやっぱり同じことをされている方は沢山いるようで答えがありました。
 その参考にしたサイトのみの紹介をしたいと思います。


こちらのサイトを参考にさせていただきました。
http://lab.sonicmoov.com/know-how/wordpress-multisite/

2014年9月6日

今上映している映画がひと目で分かるアプリ

 久しぶりにAndroidアプリを作ってみました。
相変わらず、練習中なの?みたいな域を脱していないのですが、自分でもちょっと欲しかったアプリです。

 映画が好きなのでよく観に行くのですが、毎回映画館のサイト(通常はユナイテッド・シネマしか行きませんが)を見に行って何がやっているかな?ってのを観るのがちょっと面倒だったのです。

 じゃぁ、映画館のサイトの情報をちょっと整理してアプリで簡単にチェックできるようにすればいんじゃね?ってことで、ある技術の練習(Webスクレイピング)も兼ねて作ってみまいた。

内容は、映画紹介のページの構造を解析して、その情報(予告動画や公式サイト等)をDBに保存しておいて、Androidアプリで劇場毎に簡単に見られるようにするというものです。

あっ、ちなみにユナイテッド・シネマオンリーですので…。

ダウンロードは、こちらから

画面はこんな感じ


チェックしたい劇場を選択して


チェックしたい映画のサムネイルをタップしたり、ビデオカメラのマークをタップして、予告動画を見たりできます。

ダウンロードは、こちらから

2014年8月26日

便利ツール:Everything紹介

 ローカルディスク(NTFS)のファイルを超超高速に検索するツールです。
ダウンロードはこちら→http://www.voidtools.com/downloads/

 秀逸なのは、インクリメンタルサーチや、ファイルやフォルダ名に正規表現を使っての検索ができることです。
例えば、正規表現では、検索エリアに「2014[0-9]{2}01」と入力すると20140201や、20140801等、パターンマッチしたフォルダやファイルが超高速で一覧表示されます。

 初めて起動した時は、インデックスを作るので、ちょっと時間がかかりますが、インデックスができた後は、素晴らしく高速です。

 よく、ファイルを作るけど、直ぐどこに置いたか忘れてしまうような方にはうってつけではないでしょうか?

 ちなみに、ETPサーバという機能を使うと、複数のコンピュータでネットワーク上のPCにあるファイルの検索もできるようです(まだ、試していませんが)。
 ファイルサーバーにWindowsServerを使用している方は、便利ではないでしょうかね?遅いプロトコルでファイル検索をしなくても良くなるので。


2014年8月19日

CakePHPで設定を簡単に切り替える方法の提案

 システム開発をしている時に開発環境やテスト環境によってデータベースの接続先やログイン名が違うのが普通です。

 環境毎の設定ファイルを持つことで対応することも可能ですが、現在の実行環境の設定を変えることで簡単に設定を変更することができるようになったらいいと思いませんか?
 さらには、同じ設定は書かずに継承して使いたいですよね。

CakePHPで持っているConfigには、database.php、email.phpがあります。
database.phpを例に説明します。

以下のようにdevelop(開発環境)、test(テスト環境)、staging(ステージング環境)、production(本番環境)などのように、複数の設定を書いておきます。
各設定は、$defalutと違う部分のみ設定を入れておきます。
例では、開発環境のデータベースの接続先が違うので'host'の設定を入れてあります。

どこで設定をコントロールするかというと、Configureで設定された「environment」を読み込むことでDBの接続先を切り替えます。
enrivonmentは、bootostrap.phpの先頭(わかりやすいとこ)に書くことでそこだけ変更すれば、実行環境の設定を簡単に切り替えることができます。
実行環境がたくさんある場合は、設定を追加して__constructメソッド内で追加した設定を追加することで対応できると思います。

bootstrap.phpファイルの書き方の例
/**
* 
* Choose environment
* 
* production : 本番環境
* staging    : 準本番環境
* test       : テスト環境
* develop    : 開発環境
* 
*/
Configure::write('environment', 'develop');

database.phpの書き方の例
class DATABASE_CONFIG {
 // デフォルト設定
 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,
  'host' => 'db-server',
  'login' => 'DBのログイン名',
  'password' => 'DBのログインのパスワード',
  'database' => 'データベース名',
  'prefix' => '',
  'encoding' => 'utf8',
 );

 // 本番環境
 public $production = array(
 );

 // ステージング環境
 public $staging = array(
 );

 // テスト環境
 public $test = array(
 );

 // 開発環境
 public $develop = array(
  'host' => 'localhost',
 );

 public function __construct() {

  $environment = Configure::read("environment");

  $this->develop = $this->develop + $this->default;
  $this->test = $this->test + $this->default;
  $this->staging = $this->staging + $this->default;
  $this->production = $this->production + $this->default;

  if(!empty($this->{$environment})) {
   $this->default = $this->{$environment};
  }

 }
}

これで、違う環境で動かして、動かねーとか言ってんじゃねーよとかいって叱られなくて住みますよね。

2014年8月18日

iptablesにハマるの巻(MySQLにつながらない…)

 MySQLを使う必要があって、CentOS6.5にソースからインストールして見ました。
(なぜソースからというと新しいのが使いたかったからなんです。練習にもなるし)

 インストールが終わって(これも一時問題がありましが…)、ローカルホストからの接続は確認できたので、別のPCから接続を試みたとろこ繋がらない…。
 ちゃんと、CentOS側では、3306のポートは開けています。でも、繋がらない。

何がまずいのかわかりませんが、iptablesの設定の順番を変更することで解決しました。


filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [34:5744]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 3306 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [34:5744]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

なにが違うかというとハイライトしている行の設定を書く位置を変更しました。

なるほど、-A INPUT -j REJECT --reject-with icmp-host-prohibitedの後ろに書いたのは、全てREJECTされるらしいです。
なので、REJECTの行を後ろに移動したら動いたんですね。うん、うん。

教えて!gooに同じことで悩んでる人がいました。
http://oshiete.goo.ne.jp/qa/7530019.html


ほんとにこの書き方でいいのか、何が問題かはこれから調べて自分の知識にしていく必要がありんす。
もう少し真面目に本とか呼んで意味で覚えないとダメだなこれは。

2014年8月15日

タスクタイムカード(androidアプリ)を機能強化しました

 日頃やっている作業毎の時間を記録するためのアプリです。
久しぶりに機能強化したので紹介してみました。

 せっかく記録したタスクの情報をファイル化してメール送信などして取り出すことができるようにしました。


使い方は、予めアプリにタスクを登録しておき、そのタスク(作業)を開始したら、そのボタンを押すだけです。
新しいタスクが開始されると直前にやっていたタスク時間の記録は止ります。


 人間はマルチタスクで作業をしているようですが、結局は同時にできることは、一つなのでシングルタスクなんです。
 なので、なにか別の作業を始めたら前のタスクは終了です。

ダウンロードはこちら↓↓
https://play.google.com/store/apps/details?id=jp.bsfactory.android.tasktime


さぁ、このアプリを使って、自分の日頃の時間配分を測ってみよー。

はっ、ダウンロードできるまで時間がかかるから告知はまだしないほうが良かった…。
ちなみに、最新バージョンは、1.10です。

2014年8月9日

Amazon Web Servicesつかてみた

 お客様のWebサービスを自分のVPSサーバーで運用していたのですが、専用サーバーを準備してそこに移行しましょうという話になっていたので、1年間は無料で使えるサーバとしてawsにその環境を作ってみました。

 OSのインストール(awsは、OSインストールはワンタッチでできる。感覚としては、OSの入ったディスクを持ってくる感じ)から環境を作ることができる人であれば特に問題なくできるだろうということがわかりました。
 自分も、人に教えるほど知識を頭のなかに保持しているわけではないですが、ちょっと調べながらでもできる人だったら挑戦しても良いのではないかと思います。

 完全にGoogle先生だけに頼ったわけではなく本も見てますよ。下に紹介しておきました。
具体的に何をやったかはあとで纏めて見ます。

やはり、1年間無料(最小スペックでも)でサーバーを使えるというのはいいですよね。

ここもとても良いと思います。
Amazon Web Services入門 (http://dotinstall.com/lessons/basic_aws)




2014年7月30日

操作マニュアルいらないから安くしてと言われたから

 今作ってるシステムは結構大きめのシステムなんです。
機能もいろいろあるし(いや、そうでもないかな?)。

 で、受注する時に少しでも安く済ませたいから操作マニュアルとかは必要ありません。って言われたので作ってません。
 (多分、エンドユーザの人は、操作マニュアルと運用マニュアルを混同しているんだと思います。または、なんとなく使っていればわかるものだと思ってるのかも)

 
 エンドユーザと自分の間にコンサル的な人(残念ながらあまり有効に動いてない…)が入ってるんですが、この人も必要ないっていってるいうんですよ。
 でも、作った機能をエンドユーザに説明する人はこのコンサル的な人なんですよ。

 でも、作られている機能が何をすればどういう動作するとかをどうやって説明するんでしょうかねー?って感じなんです。
 自分の首を絞めるのに気づいてないんだろうか?とちょっと心配になります。
そのことを言っても、自分でやりますと引かないんですよね。もし、やっぱり、操作マニュアルを作ってくださいと言ってきたら当然有料になりますけどね。時間もかかりますし。

 何が心配かというと、間違った説明をした時に、それはそういうことではないいのですよといちいち説明しないとになるんですよね。
 この前なんて、画面項目の意味もわからないのにユーザが不要と言ったのかどうかわからないけど、「◯◯項目は不要」という指摘をしてきました。
 で、そのことを指摘するとちょっと逆切れ気味に「全ての指摘を修正してくれなんて言って無いじゃないですか!!」と言ってくるんですよねー。
 自分がちょー無駄なことをしてることに気づいて欲しいんだけどダメだね。
また、説教しないとかもしれません。ははは。


 みなさんも気をつけてください。
操作マニュアルは不要なんてことはありえないので。
道具の使い方を知らないで道具を使うと本業で大混乱を起こします。挙句の果てには、このシステム使えねーとかになります。

 システムも日常生活でつかってるものもも変わらないんですけどね。所詮は道具なので正しい使い方をしないと意味がないんです。

2014年7月29日

Webページが切り替わるときに全体をブロックする方法

 ページが切り替わる時にボタンを連打したりされると困ることはけっこうあると思います。
よくある回避方法としては、押したボタンをdisable状態にしてしまうことでしょうか?
しかし、その場合でも、他のボタンやリンクをクリックすると新しいリクエストがサーバーに送信されてしまいます。

システムを使っている人は、サーバーからのレスポンスが遅いため、今ボタンを押したのかどうかを忘れてしまって再度押してしまっていたり、レスポンスが遅いからカチカチしてしまうのかもしれません。
 それならば、「今サーバーに送信中なのでちょっとまってねん。」な感じのメッセージを出しながら保険で、画面全体を触れないようにすれば良いのでは無いかと考えました。

 で、それを回避する方法としてちょっと調べました。
blockUIというJQueryのプラグインを紹介している方がいましたので、それを調べてみました。
ページ全体をブロックしながら、メッセージを表示するというものです(詳しい使い方は参考サイトを見てください)。


ポイントは、beforeunloadイベントに仕掛けることです(これが一番簡単。でも、イベントが起きないことがたまにありました原因は何でしょうか?)。
こうすることでページが切り替わる時に必ず画面全体がブロックされます。

$(window).bind("beforeunload",
    function(e) {
        $.blockUI({overlayCSS: { backgroundColor: '#555555' },
            message: "<h1> style="font-size: 20px;"<お待ちください…。</h1>",
            css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: '.5',
                color: '#fff'
                },
            fadeIn: 000,
            fadeOut: 000
        }); 
    }
);


これで、イライラを少しは解消できるのでは無いでしょうか?

参考サイト

http://www.malsup.com/jquery/block/(プレグイン作者のサイト)
http://h2ham.seesaa.net/article/108389263.html(プラグインを紹介している方のサイト)

2014年7月19日

マウスの勝手にダブルクリックするご動作(チャタリング)を解除する

 LogicoolのM705というマウスを2年くらい使っています。
で、先日辺りからウィンドウやマウスをドラックしていると突然、ダブルクリックしたことになってしまいいろんなことがおきてしまうようになりました(結構頻繁)。
 マウスのボタンを強めに押しておくと発生しにくかったのですが、そんなのいちいち気にしていたくないのです。

 で、ちょっと調べたら、ワイアレスマイクでよくある現象(チャタリングというらしい)のようです。
マウスの中に静電気が溜まり、それが原因でマウスボタンをダブルクリックしたことになってしまうそうです。

 ロジクールのサイトでは、電池を外して、マウスボタンを10秒程度(だったかな)押しっぱなしにすれば解消するという手順が紹介されていました。
 ですが、やはり治らないので対策を探してたら、ソフトウェアでなんとかするという記事がありました。
 マウスチャタリングキャンセラというソフトがありました。
設定した時間(40msとか)以内のクリックは無かったことにするというものです。

 ちょっとテストしてみましたが、上手くいっているようなのでマウスを買い直すのはやめておこうかと思います。

 ロジクールに交換してもらおうかと思ったのですが、保証書をなくしてしまったので、無理です(取っておいたと思ったのですが…)。
 ちなみに、今のマウスは、3年保証とかになったいるので発売から3年以内だったら、保証書なしでも交換してくれるという記事も発見しました。
 (M705は、2009年頃発売なのできません…、M705tとかは、去年頃発売なので問題ないでしょう)


今は、マウスもキーボードも無線のロジクール製品です。
線が無いのはとっても便利ですよね。

2014年7月18日

CSSの代わりのに使うLessはこう使おう


 以前、Lessについての記事を書いたと思います。 CSSを便利に解りやすく記述できる言語(?)です。 何が便利か簡単に説明すると、スタイルの記述を入れ子にできたり、簡単な計算や変数が使えます。関数的な使い方もできます。

 これが一番いいと思ったのは、lessのファイルをCSSのようにHTMLに読み込ませて、lessをコンパイルするためのJavaScriptも読み込ませると、less手動でコンパイルしなくても、自動的にコンパイルしてくれます。

 他にも、SCSSなどCompass等というのがあります。 ですが、コンパイルするのに、Rubyの環境を準備するなど、しなければならないことが沢山あります。

 このJavaScriptで自動的にコンパイルしてくれるのは便利なのですが、やはり、マシンスペックに依存して遅く感じていました。 やはり、CSSにコンパイルしてからやったほうが良いです。コメントや余分な改行や、スペースを削除したほうが読み込み時間も短くなります。
でも、lessを変更するたびに毎回手動でコンパイルするのも、面倒臭かったり、忘れて新しいスタイルが適用されなかったりします。

 そ・こ・で、WinLess(http://winless.org/)というツールに出会いました。
GUIでファイルをしてすることで、簡単にコンパイルをしてくれるのですが、秀逸なのがフォルダを指定しておくことで、そのフォルダ内のlessファイルが変更されると自動的にコンパイルしてくれます。
 このファイルを保存すると自動的にコンパイルしてくれるというのはとても便利です。
言う事無しです。

 ですが、ですがっ!
現在のlessのバージョンは、1.7.3であり、WinLessは、1.6です。
 WinLessは、ちゃんとlessのバージョンを確認して、新しいlessがリリースされていると「バージョンアップする?」って聞いてきます。
 「するっ!」って思って、バージョンアップすると、ちゃんと1.7.3にバージョンアップ(WinLessを管理者モードで起動しておく必要があります)してくれます。

 ですが、ですがっ!
lessを1.7.3にバージョンアップすると、コンパイルしてくれなくなってしまいます。
何が問題わかりませんが、正常動作していません…。
ちょっと調査が必要です。

 なので、今のところ、バージョン1.6で運用しています。

誰が、答え持ってる人いましたら、ご連絡お願います。


気になること

冒頭で、毎回コンパイルされるから遅いと書きましたが、もしかすると、コンパイルした結果は、ブラウザのlocalStrageに保管されてるかもしれません(ブラウザの開発ツールを見たら、沢山残っていたので…)。
 で、なぜ、遅いと感じた(毎回コンパイルされている)かというと、lessファイルや、JavaScriptの読み込みでキャッシュを使わないようにするために、ファイル名の後ろに「?201407181030」などと文字列を付けていたので毎回コンパイルが発生していた可能性があります。
 本番環境では、ファイル名の後ろに付ける文字列は、リリースバージョン等になるので、毎回コンパイルされることはないかもしれません。
 これも、調査が必要です。

2014年7月3日

今朝、閉口した話。

 今朝の話ですが、ある取引先の人と早朝から打ち合わせをしていました。

日頃から動きが悪いことを指摘していまして、そのことについて話がでました。
何を言い出すかと思ったら、「他社に常駐があるので連絡は取れにくくなります。」と…。

 いやいや、他社に常駐するのはいいと思います。当然、自分で売上をあげなければ会社と成立しないので大いに結構なことだと思います(一人社長の女性です)。

 しかしですよ、今手掛けている仕事もままならないのに他にも仕事があるからますます連絡は取れにくくなるとか言われてもこちらが困ってしまいます。

 ビジネスマンとして大失格です。自分のスケジュールもコントロールできないんだったら、別の会社の従業員になって、行動をコントロールしてもらったら?って感じです。

 自分の仕事もまともにコントロールできないのに、独立してる人は迷惑以外のなにものでも無いです。
 (余談ですが、この人を慕っている人もいるのには驚きです。まぁ、お互いに利害関係のあることをしていないだけだと思いますが…)

 このプロジェクトは結構大きめなのにどうするつもりなんでしょうか?
 そのクライアントもシステム開発に不慣れなので教育(システム開発は、こうしないと上手くいかない等)しながら進めないとだめなのに。

 そのクライアントものんびりで、自分たちの業務が忙しいからシステム開発の打ち合わせは後回してきな動きをしてるんですよね。
 自分たちの業務が忙しいのはわかります(とても良いことだと思います。)。でも、システム開発で手抜きをすると運用が始まった時に大事件が勃発するのをわかっているのでしょうか?
 (だから、知ってる人の教育が必要なのです)


 みなさんも、口が上手なコンサルには気をつけてください。

2014年6月27日

プログラミングをするときに気をつけていること

 皆さんは、プログラミンをするときに、常に心がけていることはありますか?

コーディング規約に従う?
スケジュールに間に合うように作る?
同じロジックは、共通化するようにする?
ちょっと長いロジックには、コメントをつける?

まだまだ、いろいろ沢山あると思います。
確かに大切です。


あわせて、これをやると、全体の品質が上がっていくと思います。

それは、

 ある機能のコーディングをしている最中にバグやわかりにくいコーディングに気づいたりします。
 そしたら、当然今やっているコーディングもやるんですが、その気づいたプログラムも一緒に直していくんです。
 今作っている機能のスケジュールが遅れたりする可能性はありますが、全体としてのスケジュールは、良くなっていきます。
 品質も上がっていくと思います。

です。

 人のプログラムや、今コーディングしてるとこ以外触りたくないとか言わずにちょっと注意して、全体最適を考えながらやってみるといかがでしょうか?

 個別最適をやりすぎると、人の時間を奪うばかりか、全体として遅れがでる場合があります。

 気をつけてください。

もうひとつありあました。
プログラミングは、テスト環境を目指すと思いますが、実はそこを目指すと不十分です。
メンテナンスのことまで考えてプログラミングしてください。

動けばOKではないです。動くようにするのは当たり前です。完了基準ではありません。


Goto文は悪ではない!という話

 プログラミングをしていて急に思い出した話です。


Goto文とは、処理の流れを強制的に変更する為の命令
最近の言語にあるかどうかは調査してません。


Goto文は悪ではないと思っています。

 ただ、処理の流れを変える為に前に戻ったり、先に進んだりをやり過ぎると読めないプログラムになってしまうということです。
 簡単にいうと使わないですむんだったら、使わないほうがよい。悪用はするなということだと思います。

 自分が使うときはどういう時かというと、「深いループとかを一気に抜けたい時だけ」です。

 確かに、「プログラムやデータ構造が良くないから、そんなに深いループになるんだ」という議論はありますが、どうしても必要なときはあります。
 そういった時は、それぞれのループに抜ける為に何らかの条件(フラグ等)を付けて見通しがわるくなるんだったら、Gotoで一気に抜けます。
 そのほうが、良いと思います。


でも、新しくプログラムを作るときは、Goto文に頼らないプログラミングが良いですよね。

例えば、
 try~catchの例外捕捉の仕組みもGotoと同じ動きですよね。
 COBOL/Sという、ACOSという汎用機のCOBOLにも、LEAVEという構造を抜けるための命令がありました。これも同じです(何階層抜けるか数字で指定していたような気がします。)。


なので、できるだけGoto文を使用しなくても良いプログラミングを心がけましょう。

2014年6月22日

【備忘録】Cake PHPのセッションタイムアウトの設定

 Webアプリケーションは、リクエストすればセッションタイムアウトまでの時間が延長されると思っていたのに、今、開発中のやつは、何回かリクエストするとセッションが切れるという現象にあっていたので調べてみた。
 (いや、なにもしないで思った通りになるとは思っていないのですが、ちょっと後回しにしてただけです…。)


やりたいことは、下の2つですが、PHPだとガベージコレクションとの関係で、生きているセッションファイルも消されるようなので注意が必要なようです。


  1. ブラウザを開き直したら、再度ログイン要求があること
  2. ブラウザで送信したらセッションタイムアウトが延長されること


設定変更ファイル

  1. core.php

変更内容

  1. Configure::write('Session', array(
  2.   'defaults' => 'cake',
  3.   "timeout"=>60,                                 // 60分 (muinitues)
  4.   "cookie"=>"MY_COOKIE",
  5.   "autoRegenerate"=>true,
  6.   "ini"=>array(
  7.     "session.cookie_lifetime"=>0,             // ブラウザを閉じたらセッションを破棄
  8.     "session.gc_maxlifetime"=>86400,       // 1日 (seconds) 1days=86400
  9.   ),
  10. ));
重要ポイント


  • 5.クッキーを再作成する為の指定
  • 7.クッキーのライフタイム
    0にすると、ブラウザを閉じるとクッキーが削除されるのでセッションとの関連がなくなる。
  • 8.ガベージコレクションの時間指定。
    php.iniの設定をCakePHPで書き換えます。

ポイント

ライフタイムの関係を↓ようにするようにということでした。
クッキーのライフタイム<セッションタイムアウト時間<ガベージコレクション



コントローラのbeforeFilter関数でも以下のことをしたほうが良いようです。
ただ、時間の関係上、動作確認はしてないので、この記事を読んだ方は試してみてください。

  1. public function beforeFilter() {
  2.   parent::beforeFilter();
  3.   CakeSession::$requestCountdown = 1; // Cookie再作成 タイミング
  4. }

参考にした記事

CakePHPのセッションタイムアウトのしては、Session.timeoutだけではダメだった


これで、セッション時間のコントロールもお手のもの?

2014年6月17日

バージョン管理システムのコミットのときにみなさんは。

 プログラミングをしている時に大抵の方は、バージョン管理システム(Subversion, Git等)を使って開発をしていると思います。
 そもそも、使わないと怖くて、怖くてソースを触れないと思います(自分だけ?)
だっていつでも自分がコミットしたところに戻ったり、参照できたりするんですよ。

 で、ですよ。使い方というか、運用のちょっとしたことなんですけどね。
私は、こんなことに注意してコミットしてます。


  • 1つの塊(機能だったり、不具合だったりいろいろ)単位でコミットする。
    コミットは、関連ファイルを纏めてコミットする。
  • コミット前に変更したソースの差分を目で確認する。(ちょっとした自己レビュー)
  • 動作確認をする。
  • コンパイルして、コンパイルエラーが出ないことを確認する。
  • 誤って修正したファイルは、元に戻す(元の形に修正してコミットはしない)
  • コミットログを真面目に書く
    コミットログは、いろいろと議論はありますが、何を直したか(具体的なソースではない)の概要を書くのが良いと思います。
    新しく書いたロジックには、「◯◯を実装。」などで良いと思います。
どうですか?
ちょっと手間のように感じますが、これを習慣化するとプログラムの精度が上がったり、理解が深まったりします。
この一手間で、変なコミットをしてしまって周りに迷惑をかけるのを防げることまちがいなしです。


 かと言って、これは、基本ルールなので操作ミスなどで誤ってコミットしてしまうこともあるでしょう。こういうのは大目に見るようにしましょう。


 バージョン管理システムの理解が浅い人や意味が分かっていない人は、一種のバックアップシステム程度にしか思っていないようです。
 なので、「日次コミット」とか言いながら、コミットしている人もいます。

 新しく書くソース時点からも機能の一部のひとまとまりを書いたら少しずつコミットする習慣を付けてもよいと思います。
 コミットを何回もするのは悪ではないです(ですが、動作確認もせずにバックアップ先のつもりでのコミットは最悪です)。



 さぁ、みなさんもLet's Try!!

2014年6月14日

テーブル設計するときのツールはなに?

 皆さんは、テーブル設計する時にどんなツールを使っていますか?
EXCEL?Visio?

 テーブル設計するときは、テーブルレイアウトだけ作れれば良いわけではなく、少なくともER図も一緒に作っていかなければいろいろなことが整理できません。
 ER図とテーブルレイアウトは、ちゃんと一致していないと整合性をとるための無駄な作業も発生してしまいます。

テーブル設計をするためのツールは有料のもの、無料のものなどいろいろあります。


  • SI Object Browser ER
    いいんだけど、個人としては高いです。あと、他の人とデータを共有しようとすると、同じツールを買ってもららないとなので
  • ERMaster
    Eclipseのアドイン。無料でいいのですが、最近アップデートされていない感じが。
    ドメイン管理のところにくせがあるので、理解して使わないと大変なことが発生します。
    実際に使ってました。
  • A5:SQL Mk2
    無料のSQL開発ツール
  • Visio
    Microsoftの図書くツール


幾つか試したところで今使っているものを紹介(だけ)します。

A5:SQL Mk:2(高機能かつ軽量な汎用SQL開発ツール / ER図ツール / フリーソフト)


  • ER図
  • テーブル設計書作成
  • ACCESSのようなGUIを使ったSQLの作成
  • いろいろなデータベースへの接続
    MySQLの場合、SSHを使って接続ができるのでVPSとかにデータベースを作った場合、セキュリティを確保して接続ができる。
    phpMyAdminとかのインストールをしなくても良くなる。

まだ、他にも沢山の機能があります。


 新しく覚えるのがめんどくさいから使わないとか言わないで使ってみたらいいさ。


2014年6月11日

WindowsベースのNASの威力

 昔、昔買ったLinuxベースのNASの容量が少なくなってきたのでNASを「Windows Strage Server 2012 R2」で動いているものを買って運用してます。

 合わせて、クライアントOSもWindows8.1に移行して(今、その最中)まして、そのNASへのアクセススピードを確認してみました。

 やっぱり、Windows Server 2012 R2とWIndows8..1は、最高の組み合わせなので(そもそも、ファイル転送プロトコルがバージョンアップしているので)超、超高速です。
 ベンチマークをとれば数値的にわかりやすいんでしょうが、そんなことしなくても十分体感できます。
 ネットワークスピードは、1Gbpsです。

ほんとにローカルディスクにアクセスしてる感覚のスピードでした。
 プライベートではともかく、仕事でNASを使う人は、一考の余地はありますね。ファイルが共有できればOKなんって言ってる場合じゃないです。
 これだけスピードが速くなるんだったら、仕事の効率もはるかに上がるでしょう。

あとは、iSCSIを使ってみたいとも思います。


あっ、ちなみに、「I/Oデータ」のNAS(HDL-Z4WM8C2)にしました。

2014年5月22日

ストレージ仮想ソフトのVVAULTという製品

VVAULTという製品です。

複数のストレージを1つにまとめてくれるストレージ仮想ソフトです。

 複数のストレージ(NASだったり、クラウド上のストレージだったり、ローカルドライブだったり)を一つにまとめて管理してくれるソフトウェアです。
 使っているわけではないですが、ちょっと興味があります。

気になった機能は、以下。

  • タイムマシン機能
    2日~31日間または、無制限に更新前のデータを保存していてくれる(多分、管理しているストレージ内にだと思いますが)
  • よく使うファイルは速いストレージへ、そんなに使わないファイルは、遅いけど大容量なところへ自動的に再配置してくれるらしい。
  • 無料版がある。
タイムマシン機能なんてとても、ちょっと使えるんじゃないのかな?と思います。
間違って消してしまっても、2日以内(無料版)だったら復旧できるのでとてもよいと思います。
(Personal Plusは、月額料金500円がかかりますが、31日間履歴を持っているようです。)


で、この製品は、LogitecのNASに標準添付されているそうです。

2014年5月10日

JavaScriptでの文字列操作関数作ったから公開


 いろいろなところにころがっていると思いますが、ソースがなくなってもいいようにメモっておくよ。

trim3種とQueryStringをハッシュに分解する関数。
Stringクラスのprototypeとしているから、文字列とかのStringデータにドットを打ってそのまま使えます。

/**
*   QueryStringを連想配列に変換して返却する
*   @return hash
*   page=14&run_mode=edit&rental_request_id=77
*   ↓
*   {page: "14", run_mode: "edit", rental_request_id: "77"}
*/
String.prototype.toQueryParams = function() {
    var queries = this;
    var params = queries.split("&");
    var key_value = {};
    for(var i=0; i<params.length; i++) {
        var arr = params[i].split("=");
        key_value[arr[0]] = arr[1];
    }
    return key_value;
}
/**
*   Stringオブジェクトで両端の空白を削除
*/
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, ""); }
/**
*    Stringオブジェクトで左の空白を削除
*
String.prototype.ltrim = function() {
return this.replace(/^\s+/, ""); }
/**
*   Stringオブジェクトで右の空白を削除
*/
String.prototype.rtrim = function() {
return this.replace(/\s+$/, ""); }

2014年4月26日

Webサイトの画面イメージのキャプチャーの仕方

 今更感満載なんですが、Webサイトの画面設計書の為の画面イメージの取り方ですが皆さんはどうされてますか?

 今までは、1画面に収まらないものは、ブラウザで表示できる分を分割してコピーしてEXCELとかに貼り付けてました。
 簡単にページ全体を撮る為のアドインがありましたので導入してみました。

 Goole Chromeのアドインなんですが、「Awesome Screenshot」というものです。
選択エリアや、ページ全体をショートカットで撮ることができます。

デフォルトだと、「Ctrl+Shift+E」で今表示してるページをキャプチャーし、あと2クリックでクリップボードへ撮ることができます。



「Ctrl+Shit+E」を押すと、ページがキャプチャーされ、下のツールバー的なものが表示されます。
(このタイミングで、いろいろとメモを入れたりもできます。)
完了をクリックします。



次にキャプチャー(編集も含む)したページをどうするかの選択で、「Copy」をクリックします。
クリップボードに保存されます。




あとはEXCELなり好きなところに貼り付けてください。


これで作業効率が劇的にあがると思いますよー。


2014年4月25日

jQueryを使ってエラー発生項目の先頭にフォーカスを当てる

 webの画面でjavascriptで入力項目チェックをした時にエラー項目にフォーカスを位置づける簡単な方法に気づきました。
 
やり方

  1. エラーになった項目のclassにマーク(例えば「item_error」というクラス名)を付ける。
  2. classに"item_error"が付いている一番最初の項目にフォーカスを当てる。
    そのロジックが以下。

ロジックの説明
 classに「item_error」が付いている項目にフォーカスを当てるロジック。
ポイントは、コールバック関数に「return false;」を付けること。
これをしないと、エラーのあった最後の項目にフォーカスがあたる。
(eachを終わらせるための方法)
$(".item_error").each(function() {
    $(this).focus();
    return false;
});
もっと良い方法
 「item_error」というclassが設定されているinput, select, text(, button)要素をに対してフォーカスを当てます。
 くるくる回らなくても良いので(コンピュータ的に)速いです(項目が少なければ人が感じられるほど違いはありません。)。
    $('.item_error:input:visible').eq(0).focus();
これで、エラーがあった項目を保持しておく必要がなくなるな。

Webシステムでの帳票のPDF出力について

 現在開発中のシステムで外部に提出する帳票はPDFで出力したという要望を頂いているのですが、ちょっと調べてみました。
 システムは、Apache+PHP+CakePHP+MySQL+Smartyで構成されています。

ちょっと調べて見ると、以下の様なものが見つかりました。

まともな調査はしていないのですが、帳票をレイアウトするのに座標指定する必要がありなかなか手間がかかる感じがします。

で、ひとつの解決案として以下の方式を考えました。

このプロジェクトで使うブラウザがGoogle Chrome固定いう大前提があります。
Chromeの印刷機能には、PDFへ保存する機能があるではないですか!!
これを使えば、HTMLで帳票をデザインして、PDFへ保存してもらえばそーとーの工数削減がされます。
 これで、開発の手間、メンテナンス性がとても上がります。


みなさんもブラウザは、Google Chromeでっ!

2014年4月18日

EXCEL2010のインデントがキーボードでできない

 EXCEL2010でセル内でインデントを付ける場合、スペースで付ける人がいると思いますが、ナンセンスです。
 または、空の列を追加してインデントしたり…。

 EXCELの機能を使ってやるには、インデント(セルと枠線の余白を増やす)という機能があるのでそれを使います。

 そのアイコンにマウスカーソルを当てると、キーボードのショートカット表示されるので、次からは、マウスではなくキーボードでやってみようと思ってやってみました。
 そしたら、Windows 7のタスク切り替えの状態になってしまいました…。

アプリケーションよりも、OSのほうが強かったという話です。
別にいいんですけどね。マウスでやるんで。

2014年4月16日

SublimeTextとやっておきたい(忘れたくない)設定


プログラミングで使うテキストエディタは、フォントやフォントサイズは見やすいように必ず設定しておく。


Sublime Textの設定は、こう!


フォントの変更

[Preferrences]-[Setting-User]
  1. {
  2. "font_face": "MS ゴシック",
  3. "font_size": 9,
  4. "draw_white_space" : "all"
  5. }
  • 2行目:フォントの種類
    MSとゴシックの間は、スペースを区切る
  • 3行目:フォントサイズ
  • 4行目:スペース、タブを表示する
キーバインドを変更

[Preferrences]-[Key Bidings-User]
  1. [
  2. { "keys": ["ctrl+m"], "command": "insert", "args": {"characters": "\n"} },
  3. { "keys": ["ctrl+i"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
  4. { "keys": ["ctrl+h"], "command": "left_delete" },
  5.  { "keys": ["ctrl+alt+c"], "command": "clone_file" }
  6. ]
  • 2行目:Ctrl+mでEnterキー
  • 3行目:Ctrl+iでTabキー
  • 4行目:Ctrl+hでBackspaceキー
  • 4行目:Ctrl+alt+cでアクティブはファイルをもう一つ開く(これで同じファイルを見ながら編集ができる)

linuxの時の日本語入力ができるようにする

https://lab.sonicmoov.com/markup/sublime-text-2/

プラグイン
JQuery
CSS
LESS
Emmet
SublimeLinter

JQueryでselectで選択されているoptionのdata属性の値がほしい

 selectタグをJQueryのvalメソッドで値を取得すると選択されているoptionのvalueだったり、コンテンツが取得されます。
 一般的にはそれで良いんですが、valueと違う属性を取得したい場合があります。

例えば、消費税率とか。
 データベースに保存する値としては、消費税率のコードで良いのですが、画面上では、コードではなく実際の消費税率が必要とかという場合です。



例と使い方を書いておきます。

HTML


使い方

HTML上では、リストの4行目(8%の行)が選択されていると想定します。

選択されているリストのコード(value)を取得する
console.log($("#tax_rate").val2());
3
選択されているリストのdata属性を取得する
console.log($("#tax_rate").val2("rate"));
8

JQueryのプラグイン

/**
*   selectタグのoptionに付けられたdata属性の値または、そのオブジェクトの値を取得する
*   @param string data_key data属性のキー名
*   @return 指定したキーの値または、そのオブジェクトの値
*/
jQuery.fn.val2 = function(data_key){
    if($(this)[0].nodeName==="SELECT" && data_key!==undefined && data_key!=="") {
        var index = $(this)[0].selectedIndex;
        return $("option", this).eq(index).data(data_key);
    }else {
        if(data_key!==undefined && data_key!=="") {
            return $(this).data(data_key);
        }else {
            return $(this).val();
        }
    }
}

これで、JQueryのvalではなく、val2を使えば、いろいろと楽になるな。

イヤ、値のセットができないので置き換えではできないな…。
val2というメソッド名も変更しないと…。

2014年4月15日

JQueryでcheckboxの判定にハマったのでメモ

 JQeryでチェックボックスのオン、オフの判定でハマりました。

マウスやキーボードでチェックを付けたり、外したりした場合、JQueryできないことが分かりました。
(前からわかっててJQueryのプラグインを作っていたはずなんだけどダメなコーディングだった。)


判定できない

jQuery(this).attr('checked')

判定できる

jQuery(this).prop('checked')
だそうです。

そのプラグインを公開

/**
*   CheckBoxのチェック状態判定と設定
*   @param boolean checked チェック状態を設定する true..チェックする false..解除する
*   @return true..チェックされている false..チェックされていない
*/
jQuery.fn.checked = function(checked){
    if(checked!==undefined) {
        jQuery(this).prop('checked', checked)
    }
    return jQuery(this).prop('checked');
}

tableタグ内でtrをマウスで移動させるのメモ

 webのシステムで行の移動は簡単ではないですが、マウスを使ってドラッグ&ドロップで行移動をする為のJQueryのプラグインを見つけました。


 GitHubから持ってくるとバージョン0.4と古いので、サンプルを紹介しているページから直接持ってこないとよろしくないようです。
ここからダウンロード(version 0.7)できます。



 ですが、自分の実行環境では、「jquery-2.1.0.min.js」を使っているからなのか、なんなのかサンプル通りにコーディングしてもエラーが起きたり、イベントが起きなかったりしてしまいます。
JQuery1.7に対応していると明記されています。
一部ソースを書き換えたり、サンプルとは違うコーディング方法をしています。

 359行目で、移動先の行が違う場合のみ、onDropイベントを発生させるロジックがあるのですが、このままだとイベントが起きないことがわかりました(原因は不明です。JQueryのバージョンの問題かもしれません。)。
以下のように変更しました。
変更前:if (config.onDrop && (jQuery.tableDnD.originalOrder != newOrder)) {
変更後:if (config.onDrop)) {
きっと、ドロップした先の行番号が違う場合のみthenの処理(onDropイベント発生)を行うのでしょう。

これで、とっても使いやすいシステムが構築できるよ。


ちなみに。
テーブルタグをいろいろできるプラグインを照会しているサイト
http://blog.verygoodtown.com/2011/05/jquery-table-plugins/

2014年4月13日

Apacheとphpでウェブサービス作るときの備忘録

 マルチバイト文字(日本語とか)を使ったフォルダを使っているとダメという話です。

 Apacheとphpとmysqlを使ってwebシステムを作っているのですが、作っているシステムがどうしても動かなくて悩んでいました。
 ふつーは、そのシステムがそもそも動かないんじゃないの?って話になるんですが、違う環境でやると動くのでプログラム的には問題ありません。

環境を軽く書くと以下のとおりです。

最初に動いていた環境


  • OS:Windows7
  • Webサーバー:IIS

動かなくなっていた環境

  • OS:Windows7
  • Webサーバー:Apache

動かなくなった環境で実行するとPHPのソースがそのまま表示されたり、「Fatal error: Unknown: Failed opening required…」と表示されたりいろんなことが発生しました。

結局何が問題だったかというとapacheのDocumentRootに設定していたディレクトリのパスに日本語が含まれていたことです。
 この原因でエラーになっているというのに気づくまですごく時間がかかってしまいました。

 さらに、時間を喰った原因としてWindowsには、シンボリック・リンクという機能があって、フォルダの別名(ショートカットとは違う)を付ける機能があるのですがそれを使えば解決できるのではないかと考えてその設定をしてしまったことです。
 いくらシンボリック・リンクを使っても日本語が含まれるとダメなんですよね(内部的には実際のフォルダ名を使っているんでしょうね。)

なので、apacheで日本語を含むディレクトリでの開発はしないようにしましょう。


なぜこうなったかというとこんな経緯があります。
ごく当たり前の対応だと思います。

  1. プロジェクトのフォルダは日本語名を付けてわかりやすくしたい
  2. ソースはそのフォルダ内に入れておきたい

ですが、これをするとapacheで使えなくなるので方式を考えました。


旧フォルダ構成

140001_日本語のプロジェクト名
   develop
      src        (←ここにソースを入れている)

新フォルダ構成

140001_develop
    src        (←ここにソースを入れている)
140001_日本語のプロジェクト名
   develop    (140001_developフォルダをシンボリックリンクでリンク)
     src

これでプロジェクトフォルダ一つでまとめて管理ができるようになります。
そもそも2つに分けたんだったらそのままえいんじゃ無いの?ってのもありますが…。


教訓

システム開発時のソースファイルは必ずアルファベットと数字だけのフォルダにすることっ!

2014年4月4日

CakePHPでどこでも共通関数を定義して使う

 Controller、Modelのどちらでも同じ書き方かつ、単一のソースで共通関数を定義する方法のメモ。
クラスのインスタンス化すらしたくない。すぐに使いたい関数です。

1./app/Vendorに任意のクラスを定義する


Util.php

<?php

class Util {
    public static function plus($val1, $val2) {
        return $val + $val2;
    }

}

2.使いたいところでimportをする

Controllerであれば、

AppControllerクラスの先頭に以下のように定義する

App::import('vendor', 'Util');

Modelであれば、
AppModelクラスの先頭に以下のように定義する

App::import('vendor', 'Util');

3.使う

staticな関数なのでクラス名とメソッド名を「::」(コロン2つで区切る)

$ans = Util::plus(10, 100);



これで沢山のユーティリティ関数を作ることができます。

2014年4月2日

linuxのディレクトリとファイル毎のパーミッションの変更の備忘録


あるディレクトリ配下のパーミッションを変更するときは、以下のように書いて実行しますが、これだとファイルにも実行権限が付いてしまい気持ち悪いです。

/path以下のファイル、ディレクトリを全て755にする。
通常のファイルも実行権限がつくから気持ち悪い(当然実行はできない)。
>chmod -R 755 /path


フィアル毎、ディレクトリ毎にパーミッションを変更する方法を調べました。
(やはり、同じことを思っている人がいますね。)

findでファイルまたは、ディレクトリを検索して、chmodに渡してパーミッションを変更するようです。


ファイルのみのパーミッションを変更
>find path/ -type f -print | xargs chmod 644

ディレクトリのみのパーミッションを変更
>find path/ -type d -print | xargs chmod 755



参考サイト



今まで作ったシステムは、この気持ち悪い状態になってるよ感がする…。
あとで直しておこう。

2014年4月1日

iPadとPCのgoogle Chromeはスタイルが違う

 今やっているWebシステムのプロジェクトは、Google Chromeに統一して開発しているのです。
なのでブラウザが同じであればどんなプラットフォームでも同じデザインで見えると思っていたのが大間違いでした。

 iPadとPCではやはり見え方が違います。
プラットフォームごとのデフォルトのスタイルが違うんですよね。PCでは正しく見えていたのがiPadでは予想していないところで改行していたりとか…。

 これをある程度吸収するテクニックとして「スタイルシートのリセット」というのがあります。
ちょっと調べてでみました。

よく使われているCSS Resetスクリプトの一覧が載っています。
http://www.cssreset.com/

どれを使うと楽ちんに共通化できるかはこれから検証が必要なようです。

今作っている画面に適用して軽くチェックしてみたところ、「Yahoo! (YUI 3) Reset CSS」が一番しっくりしているようです。
 Tableのセル内にテキストボックスを配置しているケースで一番綺麗に収まっています。
他のリセットCSSだとセルからテキストボックスがはみ出してしまいます。


これを改造して使うことにしました。
http://yuilibrary.com/yui/docs/cssreset/


2014年3月30日

スタイルシート書くためにLESSを使ってみた

 スタイルシート(CSS)を書く時にちょっと規模が大きくなるとすごーく沢山のコードを書かないとダメにになるので巷で流行っているCSS用のフレームワークの導入を検討しました。
 結局は、LESSを使うことにしました。

 SCSSやSASSもちょっと検討したんですが、rubyのインストールが必要だったので今回は、LESSを使うことにしました。
 LESSは、javaScriptでページ表示時にリアルタイムにコンパイルしてCSSが使えるという点が気に入ったので選択しました(コンパイルすることでCSSを出力して使うこともできます)。

良い所

スタイルの入れ子があると何回も何回も同じことを書かないとダメですが、LESSは入れ子構造を簡単に表現できるのですごく便利(ソースが読みやすくなる)です。
 関数や変数なども定義できます。

悪い所

何かの拍子にコンパイルされないことがあるみたい(自分の環境がだめ?)。
致命的ですが、頻発するときは、コンパイルしてCSSを出力してそれを使うようにすれば良いと思います。

サイトはこちら
{less}http://lesscss.org/

2014年3月1日

システムの設計するときとか、その前とか


すぐに予備項目とか言いたがる人

RDBMSを使うシステム設計している段階で「ユーザの要望がいろいろ変わる可能性があるから、予備項目とかいくつか持っていたほうがいいですよね」とかいう技術者の技術レベルを疑ってしまう。
 項目名はどうつけるの?予備1、予備2とか?データ型はなににするの?
その項目を使うことになったら意味の管理を別でしないといけなくなるのとかわかってる?
 昔の固定長のシーケンシャルファイルの時は、わかるけど、いつでも追加できるシステムを前にユーザの要望を柔軟に対応するための方策としてこんなことをペロって言ってしまうは、ちょっと大丈夫ですか?って思う。


すぐにできないことの列挙を言いたがる人

あとは、フレームワーク的なものを作る前にも、どんなドキュメントを作る必要があるかというちょっとした話になった時に、「このフレームワークでできないことを列挙すればいい」とかという話に盛り上がるのを見ていると、寒くなる。
 いいよ、自分たちに降り掛かってくるかもしれないことを先に言っておくとかしなくても。
普通は、できることよりも、できないことを書くほうが量は少ないし簡単だし。
 そもそも、そういうレベルの話じゃないし。



自分かこんなことを言い出さないようにするために、たまには毒を吐いておかないと…。

2014年2月23日

Visio最高

 業務設計する時にいろんな四角や矢印を使って図を書くけど、エクセルよりもVisioのほうがいいね。
線を出すとこを自由に決められるし、適度に揃ってくれるし。
 すごいと思ったのは、線の間に四角を持って行くと間を空けて自動的に矢印でつないでくれる。

他には、いろんな図を書きやすくなっているし。


図を書くときは、みんなでVisioを使おうよ。

Accessで既存テーブルにフィールドを追加する方法

 Accessのシステムを作るときは通常(絶対ともいう)、アプリケーション部分とデータ部のファイルは分けて作ると思います。
 で、リリースしたアプリケーションがバグっていたり、機能強化をする時にテーブルに列を追加したりすると思いますのでその方法をメモ。そして解説。


  1. Dim def As DAO.TableDef
  2. Dim fld As DAO.Field
  3. Dim prp As DAO.Property

  4. Set def = CurrentDb.TableDefs("なんとかテーブル")
  5. With def
  6.     .Fields.Append .CreateField("メモ", dbMemo)
  7.     Set fld = .CreateField("一括更新", dbBoolean)
  8.     .Fields.Append fld
  9.     Set prp = fld.CreateProperty("Format", dbText, "Yes/No")
  10.     fld.Properties.Append prp
  11.     Set prp = fld.CreateProperty("DisplayControl", dbInteger, acCheckBox)
  12.     fld.Properties.Append prp
  13. End With


仕様

  • 既存のテーブルに対して"メモ"フィールド(メモ型)、一括更新フィールド(ブール型)の列を追加する。
  • ブール型の列の表示は、チェックボックスにする

解説
  • 5行目:変更するテーブルのTableDefオブジェクトを取得する。
  • 7行目:新しいフィールドを追加する
    TableDefオブジェクトには、CreateFieldというメソッドでフィールドオブジェクトを作成し、FieldsプロパティのAppedメソッドで追加する。
    列を追加するだけだったらこれだけで終わり。
  • 8~13行目:フィールドの追加とそのフィールドのフォーマットや表示形式を指定する。
  • 8~9行目:7行目と同様ですが、新しく追加するフィールドに対してプロパティを追加したりするので変数に格納する。
  • 10行目:テーブルデザインの書式をプロパティオブジェクトに定義します。
    ※他にも表題、規定値、入力規則、エラーメッセージ、インデックス、文字配置などがありますね。
    引数説明
    第1引数:書式の英語名を指定する。書式の場合は、Format。
    第2引数:プロパティの値のデータ型を指定する。第3引数には、"Yes/No"という引数を指定するので、dbText。
    第3引数:設定する値を指定する。テーブルデザインで選択する値をそのまま記載。
  • 11行目:できたプロパティオブジェクトを8行目で作成済みのオブジェクトのPropertiesプロパティにAppendメソッドで追加します。
  • 12~13行目:テーブルをデータシートビューで見た時に、チェックボックスになるようにするための設定です。
  • 12行目:10行目のルックアップタブ内の値を指定します。
    第1引数:書式の英語名を指定する。書式の場合は、Format。
    第2引数:プロパティの値のデータ型を指定する。第3引数には、acCheckBoxという整数型の定数を引数を指するので、dbInteger。
    第3引数:チェックボックスにシたいので、acCheckBoxを指定する。
    ※他にも、acTextBox、acListBox、acComboBoxというのが有ります。
これだけわかれば、VBAを使ってテーブルのレイアウトを自由に変更することができるようになると思います。
 アプリケーションを変更したいだけなのに、既存データを新しいところにインポートするとかいうわけのわからない作業はしなくても良くなります。

※チョット前に引き継いだAccessのアプリケーションがそんなのでした。
テーブルのデータをエクスポートやインポートで移行するならまだしも、CSVファイルに出力して移行するというアホな設計でした。

2014年2月21日

送り状を印刷するソフトウェア

 ある取引先での話です。

 販売業務の中で送り状を手書きしているそうですが誤った送り先に商品が行かないようにするためにダブルチェックを行っているそうです。

流れとしては、

担当者がコンピュータ上に登録されている送り先を運送屋の送り状に手書きをする。

自分で確認する。

チェック担当(上長だったり)が送り状を確認する。

OKであれば送り状を商品に貼って送る。

 誤ったところに送付してしまわないようにするためにダブルチェックは良いと思いますが、1枚の送り状を書くために2人も使ってしまう!
 とっても工数の無駄です。きっと、片手間でやっているんでしょう。

 一応、業務はコンピュータ化されているのでコンピュータから印刷すれば良いと思いますが、Webのシステムなのでなかなか難しいです。

 送り状印刷のソフトに送付先の住所情報の取込ができればこのダブルチェックはいらなくなると思い、何かいいものがないか探してみました。

ありました(他にもあるかもしれませんが…)
送り状職人(http://www.scmcorp.co.jp/okurijou/index.php?FrontPage)

まだ、使っていませんが、要件は満たせそうです。

  • いろいろな送り状にも対応している
  • 送り先情報をCSV取り込みできる


 業務システム側に送付先情報をCSV形式でダウンロードする機能を実装すれば、この送り状職人にCSVデータを取り込ませることで、綺麗に印刷できそうです。

Webシステムなんだけど送り状印刷のいい方法ない?っていう会社有りましたら使ってみたらいかがでしょうか?


2014年2月17日

Access2010のレポートのバグ?並び順が変わる!

 本日、リリースしたAccess2010のレポートで印字明細のソート順が変わってしまうという現象にあってしまいました。


 前回リリースした時は、確実にこのプロパティには、並べ替えをする項目が設定されていたのですが、今回リリースしたレポートはクリアされていました。
 自分でクリアした記憶はないので何が原因かを調べたところ発見しましたよ。


【操作】
レポートのプロパティのレコードソースを開いて閉じる。

【問題点】
レポートのプロパティの「並べ替え」の内容が空になっている。


 レコードソースにクエリを指定しているのですが、そのクエリのデザイナをプロパティから開いて閉じる(保存しなくても)と並べ替えの項目がクリアされてしまうようです。


Access2010は、勝手にプロパティを変更してしまう可能性があるのでちょっと注意が必要かもしれません。
もしかするともう既にバグフィックスされているかもしれませんが。

2014年2月12日

Linuxのいろんなアプリケーションをソースから入れてみた

 詳しいことは後で備忘録としてまとめようと思いますが、初めてApacheやらPHPやらMySQLやらをソースから入れてみました。
 いろんなものが微妙に動かないので辛いです。
ディレクトリのパーミッションが正しくなくて動かないとかいろいろです。

 さっきまで、phpMyAdminが動かなくて四苦八苦してました。

 やっとログインページが出たと思ったら、mysqlのrootアカウントでログインができないし。

原因を調べてみたらPHPのセッションを保存するディレクトリのパーミッションが正しく設定されていない為にPHPがちゃんと動作していなかったとういうのが原因でしたよっ。

 きっと、バイナリパッケージからインストールすればこんな問題は無いんですよね。

でも、でも、自分の好きなバージョンをインストールできるようになるからこれからは、この方法でできるようになろう。


Windowsの世界でお任せ環境にいすぎると面倒に感じるけど、いい練習になった感じ。


2014年2月11日

CakePHP+SmartyでCakeEmailを使う

 CakePHPとSmartyを合わせて使うとViewのテンプレート内でPHPのコードを欠かなくても良くなるのでとても見やすくなります。
 Webページ内で使うことについては、いろんなサイトに記載されているのでそちらを参照していただければと思います。
 SmartyViewというクラスを使用します。
ここからダウンロード(https://github.com/news2u/cakephp-smartyview)。

今回試した環境は以下です。
(開発環境としてWindowsを使っていますが実際の環境では、CentOS上で行います。)

  • Windows7
  • IIS7.5
  • CakePHP 2.4.5
  • PHP 5.4.16
  • Smarty 3.1.16

 CakeEmailで使うテンプレートもSmartyを使いたい

なのでちょっと調べたら、やり方を公開しているサイトがありましたので試してみました。


 やぎLabs(http://blog.koganinja.jp/archives/410)


ですが、CakeEmailの1625行目でエラーが発生してしまいメール送信までできませんでした。
エラーになっている行:$View = new $viewClass(null);
エラーメッセージ:[FatalErrorException] Cannot pass parameter 1 by reference
「引数に値を直接していないで変数を指定してね。」という意味のエラーのようです。

 確かに、CakeEmail内のviewClass変数のクラスのコンストラクタにnullを直接指定指定しています。
なので、null値化した変数を設定するようにしたらエラーもなくなり、メールが送信されました。
 SmartyViewクラスのコンストラクタの仮引数は参照で受けるようになっています。
function __construct (&$controller) {
  :
}

ということは、対応方法は2つあります。
1.SmartyViewクラスのコンストラクタの引数を変更する方法
修正前
 45 function __construct(&$controller)
修正後
 引数を参照で受ける記号(&)を削除します。
 45 function __construct($controller)

2.CakeEmailクラスのviewClassのインスタンス化のやり方を変更する方法
こんな感じに直してみました。
修正前
 1625 $View = new $viewClass(null);
修正後
 $pという変数をnullにして、変数の参照を渡すという感じです。
 1625 $View = new $viewClass($p=null);

通常1.で対応することが正解だと思います。
そもそも、SmartyViewクラスの親クラスのコンストラクタの引数が参照で受けていないのでなぜ、ここは参照で受けているのかが問題です(当然、このクラスの作者には感謝していますよ。)
二年前に作成されたクラスなので、当時は何かの問題で必要だったのかもしれませんね。

もし、1の対応で何か問題が発生した場合は、2.の方法で対応してみてください。


 これで、Viewは全て、Smartyに統一ができて嬉しいです。



追記

先に紹介したSmartyViewクラスのもう一箇所変更が必要なところがあります。
最近のPHPは、変数を参照渡しする場合、「&」は付けないのが正しいので以下の修正が必要になります。

修正前
 164 $this->{$helper}->_registerSmartyFunctions(&$this->Smarty);
修正後
 164 $this->{$helper}->_registerSmartyFunctions($this->Smarty);

2014年1月17日

もしもドロップシッピングというのを使ったよ

 もしもドロップシッピングというのを使って新生活を迎える人の食生活をちょっと簡単にするための販売サイトを作って見ました。

 こういうのはどれくらい必要にされているのかあまりわかりませんが、毎回買うのを通販でできたら楽ちんですよね。

 新しい環境で生活をするときは何かと時間がなくなるので、通販で簡単に食料を調達できるようにするために種類ごとにレトルト食品をまとめました。

 自分で探さなくても一箇所にまとまっているので簡単に注文できると思います。


新生活絶賛応援ショップ(http://shop.moshimo.com/newlifesupport/)

新生活絶賛応援ショップ
新生活絶賛応援ショップ(http://shop.moshimo.com/newlifesupport/)


 商品販売サイトがリスク0で作ることができます。
商品の仕入れ、発送、集金は一切することなく、販売ページを作成して、販売したい商品を選択して並べるだけです。
 普通のお店もそうですが、ただ並べるだけではなくて、工夫して商品を並べることで売り上げも変わってくるようです。

 商品ごとの値段も自由に決めることができます。
値崩れを防ぐために最低価格はありますが、それ以上だったらいくらで販売しても良いようです。
安くすれば利益は減り、高くすれば売れなくなりますがね。
 基準販売価格というのがあるのでそのへんも最初は考えなくてもいいみたいですね。


2014年1月7日

タスクタイムカード作ったよ(Androidアプリ)

 一日がいつの間にか過ぎ去ってしまう現象にあっている方は結構いるのではないでしょうか?
そこで、自分は何にそんな時間がかかっているのかを探るためにタスク(作業)毎のタイムカードを作りました。
これさえあれば、自分は何に時間を採られているかが一目瞭然ですよ。
(そもそも、タスクの切り替わり時にタスクタイムカードを押すのを忘れるとダメですけど…。)

Google Playからダウンロード