Cruxbook iPhone App

祝!! 初iPhone Appリリースです

最近技術系のネタばかりで友人達から不評のこのブログですが、やっと違うネタも書くことができます

ゴールデンウィーク中に少しまとまった時間があったので作ってみました、その名も、cruxbook….無料アプリなので是非使ってみてください

https://itunes.apple.com/jp/app/borudaringuno-ke-tiwo-zuo/id645893930?l=ja&ls=1&mt=8

とりあえずゴールデンウィーク休みの間にできるだけの実装をしました。そのため、まだまだ機能的に物足りない部分や気配りの行き届いてない実装など多々あると想います。そのあたりはユーザからのフィードバックをもとに少しづつ改修していければと思っています

今後はこのアプリ開発にまつわる実装エトセトラやApp Store登録までの流れの事とか書いていければなぁと

そしてApp審査中にはスマホ向けサイトも用意。課題作成・公開はiPhoneアプリからしか行えませんが、課題の閲覧はスマホから誰でもできるようにしました

http://cruxbook.com

and here’s the introduction video, ya bish

iPhoneアプリの仕事くださーい あーい!!

Posted in diary | Leave a comment

Google Analytics SDK for iOS v2 (Beta)

これは便利。アプリ内でも細かな動作を解析できます(逆に言うと、あなたは細かな動作を解析されています)

Google Analytics SDK for iOS v2 (Beta) – Overview
https://developers.google.com/analytics/devguides/collection/ios/v2/?hl=ja

しかし組み込むのにGAITrackedViewControllerを継承しなくてはいけなくて後から組み込むのは結構面倒くさかったです

何かDelegateでは実装できない処理とかあるのかな。そこまでiOSに踏み込んでないので分からないけど

Posted in diary | Tagged | Leave a comment

symfony2 passing multiple services

symfony2のサービスコンテナ(Service Container)を使って複数のサービスを受け渡す方法

例えば、ログインしていないユーザにID、パスワード、新しいパスワードを入力してもらって、パスワード更新をする処理の場合。Validatorの中では、

1.現状のユーザ情報を取得するためにdoctrine.orm.entity_managerが必要
2.パスワードを暗号化して比較するのにsecurity.encoder_factoryが必要

従って、services.xmlには以下のように記載する

<services>
  <service id="hc100_validator.constraint.validpassword" class="Hc100\DemoBundle\Validator\Constraints\ValidPasswordValidator">
    <argument type="service" id="doctrine.orm.entity_manager"/>
    <argument type="service" id="security.encoder_factory"/>
    <tag name="validator.constraint_validator" alias="validpassword" />
  </service>
</services>

後はカスタムバリデーターの中で以下のようにして受け取れる

  private $entityManager;
  private $encoderFactory;

  public function __construct(EntityManager $entityManager, EncoderFactory $encoderFactory)
  {
    $this->entityManager = $entityManager;
    $this->encoderFactory = $encoderFactory;
  }

ちなみに、フォーム内の複数の要素をバリデーションに使う場合はConstraintに以下を定義

  public function getTargets()
  {
    return Constraint::CLASS_CONSTRAINT;
  }

そうすれば、バリデーターでは$valueではなく、Entityとしてうけとれる

  public function validate($user, Constraint $constraint)
  {
    $database_user = $this->entityManager->getRepository('Hc100DemoBundle:User')
      ->findOneBy(array('userId' => $user->getUserId()));
    if (!$database_user) {
      $this->context->addViolation($constraint->message);
    }

    $encoder = $this->encoderFactory->getEncoder($database_user);
    if ($database_user->getPassword() != $encoder->encodePassword($user->getPassword(), $database_user->getSalt())) {
      $this->context->addViolation($constraint->message);
    }
  }
Posted in diary | Tagged | Leave a comment

getting week spans

仕事で指定した日付の週の始めの日と終わりの日を算出する必要があった

毎月の収支表みたいなものを出力するためなので、月はまたがないので1日から始まって31(か30か29か28)日に終わる

日付系のは慎重に作らないとよくバグる。しかもよく考えないと2000年問題みたいなのにハマるからね

とりあえずこんな感じ。もっとスマートに計算できないのかな〜

/**
 * get a span of week of a certain date,
 * and stay in the same month.
 */
function getWeekSpanOfDate($date, $end_of_span_day) {
  // 1(monday) - 7(sunday)
  $day = date("N", strtotime($date));

  // month
  $month = date("n", strtotime($date));

  // days to end of span
  $dates_to_end_of_span = ($end_of_span_day + 7 - $day) % 7;

  // days to start of span
  $dates_to_start_of_span = 6 - $dates_to_end_of_span;

  // dates
  $start_date_time = strtotime($date)-($dates_to_start_of_span*(24*60*60));
  $end_date_time = strtotime($date)+($dates_to_end_of_span*(24*60*60));

  // format
  $start_date = date("Y-m-d", $start_date_time);
  $end_date = date("Y-m-d", $end_date_time);

  // out of month exception
  if (date("n", $start_date_time) != $month)
    $start_date = date("Y-m-01", strtotime($date));

  if (date("n", $end_date_time) != $month)
    $end_date = date("Y-m-t", strtotime($date));// "t" represents days in a month

  return array ($start_date, $end_date);
}

/**
 * Test
 */
for ($i=1; $i<=31; $i++) {
  // set the end of the week to wednesday (3)
  $end_of_span_day = 3;

  $date = sprintf('2013-05-%02d', $i);
  list($start_date, $end_date) = getWeekSpanOfDate($date, $end_of_span_day);
  echo sprintf("%s is in %s %s\n", $date, $start_date, $end_date);
}

結果

2013-05-01 is in 2013-05-01 2013-05-01
2013-05-02 is in 2013-05-02 2013-05-08
2013-05-03 is in 2013-05-02 2013-05-08
2013-05-04 is in 2013-05-02 2013-05-08
2013-05-05 is in 2013-05-02 2013-05-08
2013-05-06 is in 2013-05-02 2013-05-08
2013-05-07 is in 2013-05-02 2013-05-08
2013-05-08 is in 2013-05-02 2013-05-08
2013-05-09 is in 2013-05-09 2013-05-15
2013-05-10 is in 2013-05-09 2013-05-15
2013-05-11 is in 2013-05-09 2013-05-15
2013-05-12 is in 2013-05-09 2013-05-15
2013-05-13 is in 2013-05-09 2013-05-15
2013-05-14 is in 2013-05-09 2013-05-15
2013-05-15 is in 2013-05-09 2013-05-15
2013-05-16 is in 2013-05-16 2013-05-22
2013-05-17 is in 2013-05-16 2013-05-22
2013-05-18 is in 2013-05-16 2013-05-22
2013-05-19 is in 2013-05-16 2013-05-22
2013-05-20 is in 2013-05-16 2013-05-22
2013-05-21 is in 2013-05-16 2013-05-22
2013-05-22 is in 2013-05-16 2013-05-22
2013-05-23 is in 2013-05-23 2013-05-29
2013-05-24 is in 2013-05-23 2013-05-29
2013-05-25 is in 2013-05-23 2013-05-29
2013-05-26 is in 2013-05-23 2013-05-29
2013-05-27 is in 2013-05-23 2013-05-29
2013-05-28 is in 2013-05-23 2013-05-29
2013-05-29 is in 2013-05-23 2013-05-29
2013-05-30 is in 2013-05-30 2013-05-31
2013-05-31 is in 2013-05-30 2013-05-31

話変わるけど、

;
echo date("Y-m-d", strtotime('2013-02-31'));
;

これやると何が表示されると思う?

2013-03-03

親切なんだか、ややこしいのか、よく分からないが

Posted in diary | Tagged | Leave a comment

Symfony2 with custom validator

昨日の投稿の後にちゃっかり自分でカスタムバリデート作っているコード見つけたので一応ここに貼り付けておく。symfonyの公式ドキュメントにもそのまんま記載してある。

ただこれだとヤヤ面倒くさめなのでAssert\Trueなんかの手軽さでAssertのエラーメッセージをカスタマイズしたい!

<?php
// src/Hc100/DemoBundle/Validator/constraints/ExistsDepartmentNumber.php

namespace Hc100\DemoBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class ExistsDepartmentNumber extends Constraint
{
  public $message = '部門番号 "%string%" が部門マスタに登録されていません';

  public function validatedBy()
  {
    return 'existsdepartmentnumber';
  }
}

validatedByには src/Hc100/DemoBundle/Resources/config/services.xml に定義してあるserviceを返す

<?php
// src/Hc100/DemoBundle/Validator/constraints/ExistsDepartmentNumberValidator.php

namespace Hc100\DemoBundle\Validator\Constraints;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Hc100\DemoBundle\Entity\Department;

class ExistsDepartmentNumberValidator extends ConstraintValidator
{
  private $entityManager;

  public function __construct(EntityManager $entityManager)
  {
    $this->entityManager = $entityManager;
  }

  public function validate($value, Constraint $constraint)
  {
    if ($value == '')
      return;

    $department = $this->entityManager->getRepository('Hc100DemoBundle:Department')
      ->findMatchByDepartmentNumber($value);
    if (!$department) {
      $this->context->addViolation($constraint->message, array('%string%' => $value));
    }
  }
}

src/Hc100/DemoBundle/Resources/config/services.xmlにサービスを追記

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

  <services>
    <service id="hc100_validator.constraint.existsdepartmentnumber" class="Hc100\DemoBundle\Validator\Constraints\ExistsDepartmentNumberValidator">
      <argument type="service" id="doctrine.orm.entity_manager"/>
      <tag name="validator.constraint_validator" alias="existsdepartmentnumber" />
    </service>

  </services>
</container>

あとはEntityの中でカスタムAssertを追加

use Hc100\DemoBundle\Validator\Constraints as Hc100Assert;

  /**
   * 部門
   * @var string $department_number
   *
   * @ORM\Column(name="department_number", type="integer")
   * @Hc100Assert\ExistsDepartmentNumber()
   */
  private $department_number;
Posted in diary | Tagged | Leave a comment

symfony2 Assert customizing messages

EntityのバリデーションのAssertで通らなかった時に指定するメッセージ文字列、これにplaceholderを使えないか検索してみたんだけどどうやらできない模様。時間がなくてソースコードまでは確認してない

例えば、こんな事をしたいと思った

/*
 * @Assert\True(message = "未登録部門 {{ value }}")
 */
public function isValidDepartmentNumber() {
  return (valid) ? true : false;
}

もちろん、これは出来ないでのそのまま {{ value }} という文字列がエラーとして表示される

ウェブ上のフォームの場合は入力文字列(送信した値)が画面上に出ているだろうから、あえて何がバリデーションで失敗したかなんてエラー文字列に入れる必要はない。しかし今回はバッチ的な処理の中でEntityをいくつも作成してそれを検証する形だったので、まとめた処理のエラーを出す場合に単純なエラー原因だけでは何がどういった理由でエラーになったのか非常に分かりづらいという問題に陥った

こんな処理

for (someloop) {
  // validate
  $errors = $this->container->get('validator')->validate($entity);
  if (count($errors) > 0) {
    // if error, stack error list
    foreach ($errors as $error) {
       $this->errors[] = $error->getMessage();
    }
  }
}

結局ちょう場当たり的な対応をした

for (someloop) {
  // validate
  $errors = $this->container->get('validator')->validate($entity);
  if (count($errors) > 0) {
    // if error, stack error list
    foreach ($errors as $error) {
      $_str = $error->getMessage();
      // custom error messaging
      $_str = preg_replace("/{{ value }}/", ' ('.$entity->getDepartmentNumber().')', $_str);
      $this->errors[] = $_str;
    }
  }
}

symfony2関連のサンプルコードってまだまだ少ない感じがするなぁ

Posted in diary | Tagged | Leave a comment

Curry365

1ヶ月以上もおひさしナマステ 人 

the curry venture continues….

2013/04/11
2013/04/11
2013/04/09
2013/04/09
2013/04/08
2013/04/08
2013/04/07
2013/04/05
2013/04/04
2013/04/03
2013/04/01
2013/03/29
2013/03/29
2013/03/28
2013/03/28
2013/03/27
2013/03/27
2013/03/26
2013/03/25
2013/03/25
2013/03/24
2013/03/22
2013/03/21
2013/03/21
2013/03/20
2013/03/18
2013/03/13
2013/03/12
2013/03/11
2013/03/11
2013/03/11
2013/03/08

Posted in diary | Tagged | Leave a comment

Climbing Day 181

だいぶ暖かくなってきたので小川山に行ってきました。朝の5時に中野を出て8時には廻り目平キャンプ場の駐車場に到着。小川山に行くのが11月ぶりで、しかも普段は友人の片さんが運転をしてくれていたため、行き方が微妙に心配だったのでiPhoneのマップファンアプリでナビをセットして向かったのですが須玉で降りたら瑞牆に行く道の方を案内されて軽く峠を越えて川上村に出るルートへ。この道、途中にコンビニが無いんですよね

この時間だと麓にある最寄りのスーパー、ナナーズも閉まっていて、困ったことに買い出しが出来ないまま現地に来てしまった。でも幸い車の中を漁ったら過去に買った行動食を発見。過去の自分に感謝

早速今回お目当ての課題があるくじら岩に移動。なんと一番のりで、一人で貸し切り状態

*

周辺の岩でアップしていたら、すぐに沢山の人達がきてたちまちジム状態

*

今回はエイハブ船長に挑戦。以前にトライしたときにあんまり持てなかった左手のカチが気持よく持てるようになってた。おかげでその後の右手のスローパーも難なくとれる。次にこのスローパーから右手を飛ばしてリップを掴むムーブに苦戦したけど、数回トライしてリップをつかめたらそこからはすんなりと登ることが出来た。というわけで、人生初の1級課題を落とすことが出来た

その後は、片さんとひろみさんが左岸エリアでルートをしているということで合流。みんながアップしていた課題(10a)に混ぜてもらい、こちらはオンサイト

*

アップ後みんなでジャーマンスープレックス(10c)というスラブ課題を登った。スラブなのであまり身体がよれないため何度でも挑戦したくなる。特に上部ではこれといったホールドがなく、うまくバランスをとらないと足がつるつる滑ってしまう。ひろみさんがこの現象をムーンウォークとか言いながら登っていてウケた。私は結局3便ほど出したが完登することが出来ず、宿題となってしまった

最後は駐車場エリアのボルダーをみんなで登って遊んだ。トポのD岩が結構面白かった。小さいけどそれなりに遊べる。みんなはキャンプして翌日も登るということだったが私は用事があったのでそそくさと帰宅

Posted in diary | Tagged , | Leave a comment

Climbing Day 178

埼玉県入間市にある平山ユージ氏プロデュースのClimb Park Base Campに初めて行って来ました

*

日曜でしたが混雑もなく気持ちよくクライミングできました。とにかく広さがあり、設備も充実していていいジムでした

*

Posted in diary | Tagged , | Leave a comment

Kevin Smith Days

先日ひさしぶりに映画でも観ようかな〜と思って、何を観ようか迷ったので、とりあえずクエンティン・タランティーノの映画ランキング (2011)を参考に選んでみることに

そして選んだのがこちら、レッド・ステイト

田舎の若者が悪事を企んでカルト集団に拉致られる、いかにもアメリカでありそうなシチュエーション。カテゴリー的にはホラー・スリラーという自分ではあまり観ない類いですが久々に手汗かきながら観ました。かなりスカッとした気分にさせてくれる展開、見終わった後の感想としても、やはりタランティーノが好きそうな構成という印象。おすすめです

久々にいい映画だったな〜と思ったので、この作品の監督ケヴィン・スミスについて調べていたら、気になる情報が。ジェイソン・リーとかなり近い関係にあるんですね。ジェイソン・リーは彼の作品のほぼ全てに出演しています。しかも彼の初主演はケヴィン・スミスのモール・ラッツ

ジェイソン・リーといえばスケートボード界のレジェンド。1991年にブラインドの映像、ビデオ・デイズで360フリップ(トレフリップ)を映像に残し世に広めた功績を持つ。当時のブラインドと言えばマーク・ゴンザレス、ガイ・マリアノなどが所属するエリートチーム。しかし、その直後にハリウッドスターになると言ってスケート界を去っていったのです。しかもかなり成功しちゃってますね。こんなにスケートが上手いハリウッドスター、気持ち悪いです

話がそれてしまいましたが本題に戻りますと、そんな訳でケヴィン・スミスの作品を最初から全部観てみることにしたのです。まずは初作品のクラークスから。この映画が高い評価を得てケヴィンは次期作品のモール・ラッツを制作する(できる)ことになったわけなんですが、クラークス、観始めたとたん、古臭い映像、しかも白黒だったので、いきなり観るか観ないか迷ってしまいました。そこはぐっと我慢して、作品に期待をもち、観ることに。作品中の主なステージであるコンビニは、当時ケヴィンが働いていた店内で撮影されています。そのため、お店が閉まっている間にしか撮影ができなかったとの裏話もあります。それを踏まえて観ると、上手くできているなぁと感心。しかし当然ながら、レッド・ステイトのテーストはこれっぽっちもありませんね。ホモネタを所々入れ込むところは全ての作品に一貫されていますが

コメディということですが、かなりアメリカンな感じがしますが、果たしてこの作品は日本人が観ても面白いと思うのだろうか気になるところではあります

その後もモール・ラッツ、チェイシング・エイミー、ドグマ、ジェイ&サイレント・ボブ 帝国への逆襲、世界で一番パパが好き!なども観ました。彼の作品はどれも、それぞれの作品がどこかが繋がっている部分が必ずあります。特に初期の作品では共通する出演者も多いです。友情出演というのか。監督を絞って、初期の作品から順に観る、という映画の見方をしたことがないので、こういったことが一般的なのか分かりませんが、ケヴィン・スミスの作品に関しては最初から観たほうが後の作品の理解も深まりますね

しかし彼のコメディですが、かなり下品という事もありますが、喋るネタ、というような要素が多いので翻訳されてそれが面白く伝わるのかすごく疑問です。Snoochie Boochiesとか映画の中のジェイというキャラクターが作った造語のような言葉がありますが、彼がこれを言うだけでもプッて笑ってしまいます。そういうのありますよね、特別意味はないんだけど言ってるだけでおかしい、みたいな

このジェイというキャラクターを演じるジェイソン・ミューズはケヴィンの高校の時からの友人ですが、クラークスからジェイソン演じるジェイ、ケヴィン演じるボブのジェイ&ボブとして多くの作品に出てきます。そんなジェイソンは一時期薬物中毒で病院送りになったようですが、病院に連れ込んだのもケヴィン。ジェイ&サイレント・ボブ 帝国への逆襲の撮影の頃にはジェイソンは薬物依存症だったのですが、映画の中でも覚せい剤ネタとかあったりして、ブラックなネタで攻めていたりします。映画の配給会社であるミラマックスが舞台のシーンがあるのですが、そこでプッシャーがミラマックスなんて社員の7割がお客だよなんていう場面も

チェイシング・エイミー、世界で一番パパが好き!、などのヒューマン・ドラマ的なのはどちらもいい作品でしたね。普通に泣けます。どちらもベン・アフレック主演ですが、当時ぜんぜん垢抜けてない感じもまたいいですね。そして彼の演じる役柄がイケテなくて、観ててもどかしくなる感じがまたいいんですね。チェイシング・エイミーは主演女優のジョーイ・ローレン・アダムスが凄くいいです。この作品でファンになりました。声が特徴的。ケヴィンとジョーイは現実でも恋人だった事もあり、その関係がチェイシング・エイミーの制作のインスピレーションにもなったと言っています。世界で一番パパが好き!って原題がJersey Girlなんですが、邦題がすごくダサくてビックリ。しかも、Jersey GirlのJerseyってNew Jersey州からきているんですが、ケヴィンの作品には彼の出身であるNew Jersey州がかならずストーリーの中で出てくるんです。それなのに、世界で一番パパが好き!って。。。あとジェニファー・ロペス採用はどうかと思うのですが、リヴ・タイラー採用もあったのでそれはおおめにみておきました

そんな感じでまだ少し作品が残っていますが私的ケヴィン・スミス入門でした。皆さんも是非今後のTSUTAYA DAYSの参考にしてください。長旅になること必至だと思いますが

Posted in diary | Leave a comment
  • http://twitter.com/hc100
  • www.flickr.com
    This is a Flickr badge showing public items from hardcore100 tagged with iphoneography. Make your own badge here.

  • PROFILE