スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    「わりびき」の解説 #Scratch Advent Calendar 2014 day 7

    0
      Scratch Advent Calendar 2014 7日目の記事です。
      前の日はうちの小4による「"わりびき"をつくりました」 でした。
      次の日は募集中です。誰か書きませんか?

      「わりびき」が誕生したきっかけは、Nagoya.php vol7でした。
      ※Nagoya.phpは名古屋でだいたい隔月開催しているPHPの勉強会です。勉強会ですが、LTや発表にはそれほど重点はありません。プログラム問題を課題に皆で黙々と時にわいわいとPHPのコードを書いている勉強会です。

      Nagoya.php vol7で選ばれた課題が偶々再帰を使う問題で、さらに偶々PHP初心者(プログラミング初心者も含む)が多い回だったため、終了後に常連の間で「再帰はプログラミング初心者にはハードル高い」「再帰を理解できるかどうかがプログラマ思考の分かれ目では?」という話になりました。
       
      そこで、「プログラミング初心者(といってもScratchを使ってすでに2年近く経とうとしているんですが)のうちの子供に再帰を使わせてみよう!」という話になったわけです。
      が、ハノイの塔は難しすぎる気がして(なにせ私自身イメージが湧かない)何か他に良いネタはないかと考えていたら、子供自身から何気なくネタが提供されました。
      「もし割引券を何枚でも使えたら、いくらでも安くできる?いくらまで安くできる?すっごく高いものがタダで買えたりする?」

      そのネタが飛んできたのが外出中だったこともあり、口頭で100円を10%オフ券でいくらまで安くできるかをやってみただけで終了。
      「ところで、いま割引券何枚使った?」
      「忘れた」
      「よし、後でscratchでやろうね」
      という感じでScratchで組んでみることになりました。

      そんなわけで、うちの子が作ったのが「わりびき」です。

      http://scratch.mit.edu/projects/37549232/

      「中を見る」を見れば分かる通り、再帰になりませんでした(汗
      私が誘導することなく、子供がわからないと言った概念や計算方法(パーセントの概念とか、10%オフの計算の仕方とか、切り捨て・切り上げとか)だけ説明しつつ、子ども自身に好きに書かせたら「〜まで繰り返す」だけで解決してしまったのです。

      そこで、私が自分で再帰版を作ることにしました。(ここまで前置き。長っ!w)

      http://scratch.mit.edu/projects/37977098/

      うちの子供はScratch1.4で育てたので、「ブロックを作る」という発想があまりなかったようで、それが敗因(?)だと思います。
      さっそくこれを書いている私の後ろから覗き込んで「再帰ってなに?」とか言ってるので、私の作った再帰版を見せながら説明して理解できるか見てみたいと思います。

      最後に宣伝です。
      こんな親子が運営するCoderDojo Nagoyaは第3回は12/14(日)開催です!
      http://coderdojo-nagoya.doorkeeper.jp/events
      今回はScratchではなくHour of Codeをやりますが、普段は初心者にはScratch cardの作例・上級者には好きな作品を作ってもらい、最後に発表するという形式でやっています。
      名古屋周辺で興味のある方は来てみてください。メンター希望のプログラマも歓迎です!


      symfony/symfony PR10983 に関する個人的覚書き

      0
        symfony/symfony#10983
        に関するメモです。
        単なる覚え書きなのでいつも以上に乱文ですがご容赦を。
         

        前提


        私とmockの出会い
        http://phpmentors.jp/post/55127910549

        私も昔(ほんの一年前)はmock使わずテストを書いてました。というのも私の主戦場がsymfony1で、テスト機構はlimeとsfTestFunctionalだったわけです。そこにmockという機能はありませんでした。
         

        Pull Requestのきっかけ


        仕事でGoutteを使ってみようと思ったのがそもそもの発端です。
        https://github.com/fabpot/goutte
        Goutteは内部でSymfony¥Component¥DomCrawlerを使っているので、必然的に色々な日本語HTMLをDomCrawlerに渡すことになるわけですが、Symfony(に限らず海外ライブラリを使う場合)に頻出の日本語(マルチバイト文字)対応はどうなっている?というのが気になりますよね。それで、色々なHTMLを作ってDomCrawlerに渡してみることにしました。
        正直EUC-JPやSJISのHTMLは読み取り失敗てもしょうがないかなーと思っていたんですが、意外なことにEUCもSJISも大丈夫でした。(よく考えたらsfBrowserやsfTestFunctionalでも既にOpenPNE3の携帯版(SJIS)のテストができていたので意外でもないかも?)
        しかし、不可解なケースも出てきました。
        <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
        はOKなのに
        <meta charset="Shift_JIS" />
        がNGなのです。
        DomCrawlerの中を見てみると、addContent()で後者のタイプのmetaタグから文字エンコーディングを抽出する正規表現が英数+ハイフンしか考慮していないことがわかりました。UTF-8やEUC-JPはそれでも良いですがShift_JISは「_」があるので正常に読み取れていなかったわけです。
        そこを修正して<meta charset="Shift_JIS" />からも正しくShift_JISを読み取れるようにしたいと思いました。
         

        Pull Requestを出すまで


        正規表現の修正自体は「_」一文字足すだけでさっさと終わるのですが、テストをどう書くか悩みました。

        というのも、従来のテストは、モックを全く使わずに、コンテンツをaddContent()に渡した後、実際にaddHtmlContent()やaddXmlContent()が呼ばれてDOMに追加された結果をテストしていたからです。
        https://github.com/symfony/symfony/blob/cff410507f8485133c19019257f0ea4d3cfcd38f/src/Symfony/Component/DomCrawler/Tests/CrawlerTest.php#L208
        $crawler = new Crawler();
        $crawler->addContent('', 'text/html; charset=UTF-8');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() adds nodes from an HTML string');
        

        DomCrawler::addContent()の処理内容は、まず渡されたコンテンツの種類がxmlかhtmlかを判別し、更にコンテンツのcharsetを判別した後、種類によってaddXmlContent()かaddHtmlContent()を呼び出して、コンテンツとcharsetを渡すというものです。
        今回は私が変更した部分が正しいかどうか、つまりhtml5形式のmetaタグでShift_JISをcharsetとして判別できるようになったかどうかだけをテストしたいのにも関わらず、従来の形式を踏襲したテストを書くとすれば、addHtmlContent()やaddXmlContent()(ひいては、実際にaddHtmlContent()の内部でそのcharsetを渡されるmb_convert_encoding())がその$charsetを受け付けるかどうかも考慮しなければならないのです。もちろん、判別された$charsetはaddHtmlContent()なりaddXmlContent()で利用できるものでなければならないのですが、実際にある$charsetが受け入れられるかどうかはaddHtmlContent()なりaddXmlContent()の関心事であって、addContent()側で知っている必要があるとは思えませんでした。

        ただ、Shift_JISに関しては<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />の形式で指定されているときにaddHtmlContent()に$charsetとして正常にShift_JISが渡され(←たぶん)、それを使ってaddHtmlContent()が正常にSJISエンコーディングされたHTMLを扱ってくれるのが既にわかっています。それなら、多少の不安はあっても妥協しても良いという決意ができたので、従来のテストと同じ形式でShift_JISで日本語を読み取るテストをつけて、Pull Requestを出しました。

        追加修正の提案とテスト追加

        Pull Requestを出すと、今まで想定外だった「_」を含むcharset名がでてきたことをきっかけにhtmlの仕様などを読んで、「_」だけでなく「:」と「.」もcharset名として使われる可能性がある、ついでに追加すべきでは?と提案してくれる人が出て来ました。
        正規表現に更に文字を追加するのは別にかまわないのですが、問題はテストです。
        SJISと違って、「:」や「.」を含む文字エンコーディングはhtmlの仕様に載っていたcharset名リストを眺めても全然馴染みがなく、それを使って判別できるとうれしい文字というのも皆目見当がつきません。"test"とか適当な文字列を入れてテストをして、addHtmlContent()側でエラーが出たら、よく知らないエンコーディングのためにmb_*関係を調べる手間をかけることになります。逆に、テストが通ったとしても本当に正しく文字エンコーディングが判別できた結果なのかfallbackのエンコーディングで処理された結果なのかの区別もつけられません。
        そこで、私はCrawlerのインスタンスをパーシャルモックとして作成し、addHtmlContent()を呼ぶ時に第二引数として渡される$charsetをチェックするテストを書き、コミットを追加しました。

        ところが、この後から追加したテストについて、テスト対象のクラス自体をパーシャルモック化したテストはよくないと言われ(:と.について提案してくれたのとは別の人から)、「:」や「.」を含む適切なテストデータが見付けられないと説明したところ、「テストするのが難しいなら、テストしなくていい」と返ってきました。最終的に「:」と「.」を追加したことについてのテストを削除した状態で、私のPull Requestはマージされました。
        マージされて一週間近く、私はまだモヤモヤしています…。

        ちなみに、テストを認めてもらおうと説明する過程で、twitterやfacebookで愚痴っていたところ、@t_wadaさんから、文字エンコーディングを抽出する処理を別メソッドにして、その新しいメソッドに対してテストを書くという方法ならどうか、と教えてもらいましたが、残念ながら「それいいね、それで行こう!」とはなりませんでした。

        まあ、一回のPull Requestでモヤモヤしたからと言って、SymfonyにPull Requestを送ることや #symfony_ja へのコントリビュート(主にドキュメント翻訳)は止めませんし、Symfonyも使い続けます。
        Symfonyは素晴らしいプロジェクトだけど、全員の考え方が一から十まで完全に一致できるわけではない、と思い知ったのでした。


        Nagoya.php vol3に行ってきました #nagoyaphp

        0
          2014/01/25(土)に開かれたNagoya.php vol3に行ってきました!

          会場提供はFabrica Communicationsさま。ありがとうございますm(_ _)m

          テーマは、「生PHPでプログラムを作ってみよまい!」。
          フレームワークは使わず、DBや画面も考慮せず、機能の中核(いわゆるロジック?)だけを皆で作ってみよう、というものでした。

          自己紹介の後、さっそく@hidenorigotoさんが提示した要件リストを見ながら皆で考えます。

          まずホワイトボードに登場人物(クラス)を書き出しました。
          あれも要る・これは要らないなどと意見を出し合い、必要そうなものに絞るのですが、なかなか議論がまとまりません。
          PHPの勉強会なのに、PHPのコードを書かずに延々一時間ほどホワイトボードと日本語だけを捏ね回していました。
          ついつい実際の実装(実際のRDBのためのテーブル設計)に思考が引っ張られがちな私が、飽くまでもモデリングに集中しようとする皆を混乱させるという一幕もあり…orz

          次に、ユースケースを想定して機能を足して行くことにします。
          先に検討した必要なクラス群を作り、それぞれのクラスのプロパティとして何が必要か、また皆で意見を出し合って、プロパティとgetter/setterを作って行きます。phpstormのgetter/setter自動生成がphpstorm未経験な人達の目を奪っていました。
          機能を追加していくに当たって、ActiveRecordパターンで行くか?Managerパターンで行くか?というところでは、ActiveRecordパターンを選択。(早々にスパゲティ化したのはこれがまずかったかも?)
          実装は「〜〜を〜〜して」と口頭で実装内容を言い、@hidenorigotoさんがその通りにコードにして行くという方式で進めました。
          同じ一日の何時間も経ってない間に、クラスの表すもの(クラスの責務)について混乱が見られたり、コードがスパゲティ化したりと「あるある」感の漂うところで、機能が全て完成しないまま時間切れとなってしまいました。
          最後の方に@hidenorigotoさんがチラ見せしてくれた、単一のUseCaseごとに単一のクラスを作っているコード群は衝撃的でした。

          合間合間で、普段の開発事情や使用ソフトについて質問し合ったり教え合ったり。ライブラリやソフトウェアについて「○○がおすすめです使いましょう(ドヤア」という発表こそなかったのですが、飛び交った情報量は結構多かった気がします。
          特に、WindowsでVagrantを使って開発しているのが私一人ということで、更にphpstorm使用者というのもあり、私はかなり出しゃばって喋りすぎました…。

          家庭の事情で短時間しか参加できませんでしたが、懇親会でのぶっちゃけトークもとても楽しかったです^^
          そして、懇親会離脱後三十分で自宅に着いて、やっぱり会場と自宅が近いのはいいなぁと思ったのでした。(遠くからいらした方もいたので、遠くの方には申し訳ないのですが…)
          2014年は名古屋のPHPコミュニティがもっと盛り上がって、気軽に行ける近くの勉強会やイベントが増えたら嬉しいなー…。


          私がそれでも名古屋市に住み続ける理由を6つにまとめてみた!

          0
            名古屋の人が誰も書いてないので、夫の転勤という主体的でない理由で引っ越してきてそろそろ十年になる私が(無理やりに)書いてみましたよ。

            1.街がコンパクト(名駅〜伏見〜栄)

            (福岡も札幌も同じようなことが書かれていますが)ほとんどのことは名駅〜伏見〜栄で用が足りると思われます。
            知る人ぞ知るカフェやレストランを追求するなら郊外も視野に入れないといけませんが、これは札幌や福岡も同じことだと思うので。←なぞの対抗意識

            2.エビが豊富で安い

            エビが豊富で安いです。他地方から来た方が、廻るお寿司屋でネタを見ると驚くと思います。
            (代りにホタテやイクラが東北・北海道と比べて高い…)

            3.乳児〜中学生まで医療費無料(所得制限有)

            超がつく高所得でない限り適用されます。
            http://www.city.nagoya.jp/kenkofukushi/page/0000009154.html

            4.小学校にトワイライトスクールがある

            トワイライトスクールは小学校内に設置された学童保育(みたいなもの)です。年間500円(書き間違いではありません!)の保険代のみで一年生から六年生まで無料で利用でき、人数制限もないため希望すれば必ず利用できます。両親のどちらか(又は両方)がフリーランスだから待機児童になっちゃった、ということはありません。
            お弁当さえ持たせれば夏休み・冬休みなどの長期休暇もお盆や年末年始を除き預かってもらえます。

            5.公立優位の地域なので基本的にはお受験不要で教育費が安い

            例外の一・二校を除いては公立高校のほうが進学実績が良いので、お受験(小学校受験・中学校受験)はしなくてもOKです。
            宗教上の理由・スポーツ強豪校・両親や祖父母がOBOGなど、どうしても拘りがある場合を除いて、教育内容を犠牲にせずに公立小学校→公立中学校→公立高校という進路を選ぶことができ、お受験必須な地域に比べると教育費が安く済みます。

            6.首都圏と関西両方にアクセス可

            首都圏のイベントと関西のイベント、どちらも日帰りで出席することができます。(そのイベントの開催時間がよほどの早朝深夜でなければ。)
            ちなみに東京に出るには「ぷらっとこだまフリープラン」、関西(大阪)に出るには「近鉄名阪特急(回数券利用)」を使うと旅費を安く上げられます。


            なお、よく名古屋は車社会と言われますが、住むエリアを選べば自家用車のない生活も十分可能です。
            我が家は自家用車ありません。私に至っては普通免許も持ってません。電動アシスト自転車と公共交通(JR・バス・地下鉄)とタクシーを使っています。
            会社勤めをする方なら営業廻りなどで免許必須と言われるかもしれませんが、自宅(又は栄や名駅の)で開発するスタイルの技術者なら、自家用車どころか免許さえ無くてもなんとかなります。

            【追記】
            そんな名古屋で、明日Nagoya.php vol.3があります。テーマは「生PHPでプログラムを作ってみよまい!」です。
            http://nagoyaphp.doorkeeper.jp/events/7716

            名古屋周辺のPHPerの方・PHPに興味がある方(無い方も?)は参加してみてはいかがでしょうか?


            HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました

            0
              毎度毎度、大変ご無沙汰しております…
              相変わらず育児と仕事に追われる毎日を過ごしています。
              といってもPHPの仕事だけなので、django1.0以降はまだ追えていません(涙)

              で、そんな中で、業務系システムの帳票フォーマット作りで悩んだ結果生まれた作品を突然公開しに来ました。←変人


              どんなものかというと…

              HTMLで作成した表(TABLE)でセルに斜線を引くjavascriptライブラリです!
              ハイ、JavaとかC++とか高度な言語で開発されている方々には全く無意味です(爆)
              PHPで業務系システムを開発して、PHPに吐き出させるHTMLのテンプレートで帳票フォーマットを作っている私のような人間だけが必要とするシロモノです。

              使い方解説


              1.ダウンロードしたslashjsフォルダをサーバー上の適当な位置にアップロードしてください。

              cssとjavascriptは別々のフォルダに入れてしまっても構いません。



              2.斜線を描きたいテーブルを配置するHTML内に下記の記述を入れて下さい。

              *ファイル名は変更して構いませんし、フォルダ名等は実際の環境に合わせて下さい。


              <script type="text/javascript" src="slashjs/prototype.js"></script>

              <script type="text/javascript" src="slashjs/slash.js"></script>

              <link rel="stylesheet" href="slashjs/slash.css" type="text/css" media="screen" />




              3.斜線を描きたいセル(td)にwithSlashというクラスを付加します。


              例:
              <td class="withSlash"></td>




              右上から左下に向かって斜線を付けたいときはslashRightというクラスも付加してください。


              例:

              <td class="withSlash slashRight"></td>




              対象セルに、無関係な別のクラス名が付いても関係なく動きます。


              例:

              <td class="hogehoge withSlash slashRight"></td>




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


              動作確認状況なんですが、
              ○Win IE6
              ○Win IE7
              ○Win Firefox3
              ×Win Safari
              こんな感じです。特にSafariは「どうしちゃったの?」って感じの表示になります(悲)。
              取り急ぎこれを使いたいというクライアントさんがWindows環境のみなので、見切り発車してしまいました(汗)

              ★動作「×」のものの修正対応、私が確認できていないブラウザでの動作確認にご協力いただける方を募集中ですm(_ _)m
              このページを見て、「サンプル」の表示がどうなったか↓コメントくださいm(_ _)m


              復活^^;

              0
                ご無沙汰でした。

                実はわたくし今年初めに2人目を出産しまして^^;
                既に仕事復帰してるのですが、2か月産休した分仕事がたまって大変なことになっております><

                しばらくdjango触れそうにもないです(涙)
                エントリー書くとしたらCIの記事中心になると思いますが、一応復活宣言しておきます。

                しばらくぶりに自分のブログを開いたら、jugemさんに「60日以上更新していない」と怒られたのでちょっと書いてみました。


                SOHOプログラマに必要な能力

                0
                  1つプロジェクトから抜けてちょっと自由になりましたヽ(´ー`)ノ
                  束の間ですが、今のうちに色々本を読んだり、他の人のブログを読んだり、mixiのコミュ記事をまとめ読みしたり…etc.しようと思います。
                  準備が出来たらdjango bookとかの和訳版も公開したいです♪(最近本家が更新しないのでやや不安ですが)

                  で。今日は、病院の待ち時間にボーっと考えていたことをとりとめなく書いてみます。

                  私は、恥ずかしながらどこかの会社に所属してプログラマをやったことが無く、初めからSOHOなので、プログラム関係であっても基本的には顧客から直受けで仕事をやってます。
                  なので、顧客からの依頼は千差万別だし、極めて散文的。
                  「最近流行のミクシィみたいなの、いくらで作れる?」
                  「アバターってやつ作って欲しいんだけどぉ」
                  ↑マジにこんな感じです(汗

                  こんなふうに見積もり依頼を受けたら、
                  「ミクシィの仕組みってどうなってるんだろ?」とか
                  「アバターに必要な機能は何だ?背後にどういうDBを組んでおけばいい?」とか
                  一生懸命考えます。セルフで(爆

                  考える過程で、既存のサービス(SNSならミクシィとかOpenPNEとか、ショッピングカートなら楽天とか、アバターならヤフーアバターとか)が持っている機能を解剖して、今依頼して来てるお客さんにはそのうち何が必要で、何が必要ないか考えたりします。
                  本が出ている分野なら、書店に足を運んで本を読みます。
                  ネット上に先人の残したリソースがあれば、英語だろうが独語だろうが読み漁ります。

                  つまり、誰かにヨウケンテイギとかシヨウケッテイとかされたこと無いんです(汗
                  全部自分でやります(汗


                  SOHOでWEB系プログラマの人って少ないのかもしれないけど、単にコードが書けるだけじゃなくて、↑↑こういうことができる能力があるかどうか(あるいはこれから育てられるかどうか)が分かれ目じゃないかなぁ、と思いました。

                  単に、次の仕事がシステム会社さんからの孫請けで、初めて仕様書を渡されて仕事するので(爆)それに絡めて駄文を書いてみただけでした。
                  お粗末さまですm(_ _)m


                  1

                  PR

                  calendar

                  S M T W T F S
                        1
                  2345678
                  9101112131415
                  16171819202122
                  23242526272829
                  3031     
                  << July 2017 >>

                  twitter

                  selected entries

                  categories

                  archives

                  recent comment

                  • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
                    プログラマー
                  • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                    よし
                  • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                    ななうぇぶ
                  • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                    よし
                  • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                    よし
                  • WindowsのPCで開発するphperがxhprofを使う方法
                    ななうぇぶ
                  • WindowsのPCで開発するphperがxhprofを使う方法
                    川本
                  • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
                    よし
                  • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                    77web
                  • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                    ktz

                  recent trackback

                  • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
                    常山日記
                  • django対symfony 日本語メール送信(その1 symfony編)
                    CPA-LABテクニカル
                  • CodeIgniterでユーザー認証
                    されどLAMPな日々
                  • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
                    常山日記
                  • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
                    サーバー用語集
                  • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
                    常山日記
                  • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
                    mitszoの日記
                  • python多次元リストをsort(並べ替え)する方法?
                    mitszoの日記
                  • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
                    Humming Via Kitchen
                  • 日本語テキストをtruncate@django(Python全般にも??)
                    常山日記

                  recommend

                  links

                  profile

                  search this site.

                  others

                  mobile

                  qrcode

                  powered

                  無料ブログ作成サービス JUGEM