春咲さんのメモ。

自分メモ的な。主にPHPについて。github:mindlessdoll(冬眠してるけど)

チャットワーク

社内連絡用に使いたいもの。チャットワーク。

今の現場で使っていて便利だなと思いまして。

今、自社では帰社連絡をメールで行っているのですよ。それがとても面倒な気がして…。晴れて?社員全員がスマホになったこともあり、本格的に導入したいところ。次帰社日で提案しようかしらかしら。

 

チャットワーク(ChatWork) | ビジネスが加速するクラウド会議室

Symfony2 Form前進しました。

はい、やっとなんとかなりましたのでまとめます。

まず、あのへんなポップアップ↓

f:id:aliceDream:20140814183412p:plain

の消し方。ミソはTypeの指定

namespace hoge\fugaBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class InquireType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName','text', array("required"=>false));
        $builder->add('lastName','text', array("required"=>false));
        $builder->add('pref', 'choice',array(
            'choices' => array(
                'tokyo'   => '東京',
                'saitama' => '埼玉',
                'kanagawa'=> '神奈川', 
            ),
            'multiple' => false,
            'expanded' => false,
        ));
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'foge\fugaBundle\Entity\Inquire');
    }

    public function  getName()
    {
        return 'inquire';
    }
}

この指定↓が必要

array("required"=>false)

前回と違ってちょっとフィールド増やしました。nameをfirstNameとlastNameに分割したんですけどね。

validation.yml

hoge\fugaBundle\Entity\Inquire:
    properties:
        firstName:
            - NotBlank: { message: "つ入力" }
        lastName:
            - NotBlank: { message: "つカナ入力" }
            - Regex: { pattern: "/^[ァ-ヶーa-zA-Z]+$/u", message: "フリガナ(名)を正しく入力してください" }
        pref:
            - NotNull: ~

あれ、lastNameの役割がフリガナになってる…。まぁ、いいかw

で、問題のController

    public function inquireAction()
    {
        $errors = '';
        $inquire = new Inquire();
        $form = $this->createForm(new InquireType(), $inquire);
        $request = $this->getRequest();
        if ($request->getMethod() == 'POST') {
            $form->bind($request);
            $validator = $this->get('validator');
            $errors = $validator->validate($request);
            if (count($errors) > 0) {
                return $this->render('fugaBundle:Inquire:input.html.twig', array(
                    'form' => $form->createView(),
                    'errors' => $errors
                ));
            }
            if ($form->isValid()) {
                return $this->render('fugaBundle:Inquire:confirm.html.twig',
                        array('data' => $form->getData(),
                        'form' => $form->createView(),
                ));
            }
        }
        
        return $this->render('fugaBundle:Inquire:input.html.twig', array(
                'form' => $form->createView(),
                'errors' => $errors
        ));
    }

的な。ちょっとこの辺は要改良の余地ありなのですが。暫定です。Entityは単純なgetter、setterの記述のみです。

そうするとですね…

f:id:aliceDream:20140819100450p:plain

って感じでメッセージがちゃんと出るんですよ!!!

しかもー、

f:id:aliceDream:20140819100710p:plain

フリガナもこれでOK(デザインが変なのは今は問題じゃない)。

一応Twigも載せておきますね。

input.html.twig

{% extends "fugaBundle::layout.html.twig" %}
{% block title "Inquire" %}
{% block content_header 'Inquire' %}
{% block content %}
 <form action="{{ path('inquire') }}" method="post" name="caseInquire">
 {% include 'fugaBundle:Inquire:Form/form_errors.html.twig' %} 
 {{ form_widget(form) }} <input type="submit" /></form>
{% endblock %}

form_errors.html.twig

{% block form_errors  %}
{% spaceless %}
    {% if errors|length > 0 %}
   <ul>{% for error in errors %}  
    <li>{{ error.message }}</li>
    {% endfor %}
   </ul>
  {% endif %}
{% endspaceless %}
{% endblock form_errors  %}

やっとなんとか形になったー。後はココにEmailとか追加してですね…なんとか山は過ぎた…と思いたい…

て、いうかさ…はてブロって、preタグ使ってるのにHTMLタグに反応するってどういうこと??(なので<が<になってる↑)

Symfony2 Formの続き

はい、絶賛はまり中です。

 

とりあえず、クラス化しました。

Controller

use hoge\fugaBundle\Entity\Inquire;
use hoge\fugaBundle\Form\Type\InquireType;

public function caseAction(Request $request)
{
    $inquire = new Inquire();
    $form = $this->createForm(new InquireType());

    if ($request->getMethod() == 'POST') {
        $form->handleRequest($request);
        
        if ($form->isValid()) {
            return $this->render('fugaBundle:Inquire:caseConfirm.html.twig',
                    array('data' => $form->getData(),
                    'form' => $form->createView(),
            ));
        }
    }
    
    return $this->render('fugaBundle:Inquire:caseInput.html.twig', array(
            'form' => $form->createView(),
    ));
}

Entity

namespace hoge\fugaBundle\Entity;

class Inquire
{
    protected $name;
    protected $pref;
    
    public function getName()
    {
        return $this->name;
    }

    public function getPref()
    {
        return $this->pref;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function setPref($pref)
    {
        $this->pref = $pref;
    }
    
}

InquireType

namespace hoge\fugaBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class InquireType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('pref', 'choice',array(
            'choices' => array(
                'tokyo'   => '東京',
                'saitama' => '埼玉',
                'kanagawa'=> '神奈川', 
            ),
            'multiple' => false,
            'expanded' => false,
        ));
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'hoge\fugaBundle\Entity\Inquire');
    }

    public function  getName()
    {
        return 'name';
    }
}


的な。このセットにたどり着くまでかなり時間がかかりました。あのね、文章読むのは好きなんだけど技術関係の文章読むのは不得意なのね…。流し読み的な。
とりあえず、これで、テキストボックスとプルダウンはできました。
あ、ついでにyml

validation.yml

hoge\fugaBundle\Entity\Inquire:
  properties:
    name:
      - NotBlank: { message: "入力してください!!!!!!" }
    pref:
      - NotBlank: ~

ってやってるんだけど。このmessageが出てくれなくて、大変困っております。

↓こんな感じが出るのね。ポップアップで。でもこれは必要としてないの…。もー!!!って感じでお盆休みに突入です…

f:id:aliceDream:20140814183412p:plain

 

Symfony2 Formではまったこと

Actionの分け方がまずったらしい。つい癖で、InputとConfirmとCompleteと作ったんだけど、一つのActionでヨロと言われた。確かに調べてるとそんな感じのが多いのでそのあたりは右に倣う。

しかし、確認画面の作り方がよくわからない。と、いうかTwigでどう書くの??

今回は取り急ぎで動かしたかったので、Entityは省略

Controller側

/**
 * @access public
 */
public function caseAction(Request $request)
{
    $formFactory = Forms::createFormFactoryBuilder()
        ->addExtension(new HttpFoundationExtension())
        ->getFormFactory();
    
    $form = $formFactory->createBuilder()
        ->add('task', 'text')
        ->getForm();
    if ($request->getMethod() == 'POST') {
        $form->bind($request);

         return $this->render('SpBundle:Inquire:confirm.html.twig',
                array('data' => $form->getData(),
          ));
    }
    
    return $this->render('SpBundle:Inquire:input.html.twig', array(
            'form' => $form->createView(),
    ));
}

Twig側

    {{ data.task }}

これでいいらしい。今回はとりあえず表示されればOK。登録は別API使うからDctrineは関係しません。最初、bindRequestでエラーになってbindに変えました。2.3と2.0でどっちがどっちに変わったか忘れてたw

あ、ついでに…routingの設定で。

      requirements: 
       _method: POST|GET

これ忘れずに。忘れてエラー?!(?--)!(--?)?!ってなった。

 

hiddenで値持たせておきたいときは、Twigに渡す引数にform追加して

{{ form_widget(form.task, {type: 'hidden'}) }}

で、おk

特定派遣廃止を考える

考えるといっても思っていることを連ねるだけですw

まず、一般派遣の条件とは?

  1. 資産規模:2,000万円以上
  2. 現預金:1,500万円以上
  3. 負債:資本の7倍以内
  4. 事業所面積:20平米以上

それに加えて5年ごとの更新作業が発生するようです。

うちの事務所の面積がちょっと心配です。しかし、派遣契約で出ている人はいないので問題ないかなーとか思ったりします。とはいえ、一応特定派遣は取っているのでした。なぜか。お客様に求められたんですよね…そういうこともありますよね…。

し・か・し!!

書面上は業務委託でも「他人の指揮命令を受けて」作業をする場合は労働者派遣とみなされるのです。と、いうことは偽装請負とみなされてしまうのですねー。恐ろし―!

確かにさ、1機能いくらとかで請け負うならね、業務委託ですよ。でも、出向ってそうじゃないでしょ?入った現場で「この機能よろしく」とか「これ調査しといて」とかいろいろ「任される」もとい「頼まれる」もとい「指示される」わけでして。しかも勤務時間が決まっていて(やることやっとけばいいよーってところもあるけど)。これを派遣契約と言わざるしてなんというの?と書きながら初めて思いました。

最近、多重派遣で問題になってましたね。あんなのただの見せしめでしょ。IT業業界は開発だけしてるんじゃないんです。運用だって外部の人に任せてるんです。そんなの全部取り締まってたら日本のインフラ止まりますよ?悪しき風習なのはわかっているけど、

あれ、だいぶ話が逸れた。

特定派遣が廃止されるとなにが大変か。

小規模会社の場合、事務所をかまえていないところもあるし、かまえていても20平米あるのか、確かMTGスペースとは別に作業スペースがないといけなかったはずなのでそれを満たしているのか。資本規模だって無理がある。って感じでハードル高し。

一般派遣取れない→仕事振ってもらえない→潰れるかほかの偽装請負の仕事に手を出す→桶屋がもうかるw

まぁ、間で搾取してた会社が潰れるならいいんですけどね。人貸しかしてない会社とか本当に潰れればいいと思う(リーマンショックでだいぶ良くなった気がするけど)。小規模な会社って大手と仕事しようとしてもこれまた資本金がーとかでごめんなさいされたりね、やりたくてもできねーよっての多いじゃん?だから仕方なーく間通したりしてさ。それで派遣契約がーとか多重派遣がーとか言ってたら仕事にならんてー!!

ここで疑問。

個人事業主はどうするんだろう?これは今も昔もなんだけど。自分が個人事業主だったときは現場常駐で完全に偽装請負でしたがw

 

長くなった。まぁ、綺麗ごとではつとまらんよね。

EclipseでSymfony2.3.xの環境を整える

サーバはAMI(Amazon Linux AWS EC2)Sambaでネットワークドライブ設定済み

Eclipse4.3(pleiades

http://mergedoc.sourceforge.jp/

Symfony2プラグインは下記から取得

http://p2-dev.pdt-extensions.org/

プラグインをインストールすると新規プロジェクト作成にSymfonyが現れます。

既存のSymfonyプロジェクトをもとにプロジェクトを作成する場合は

composer.json

のあるディレクトリを選択してください。ないとエラーになります。

 

create-project command がすごーく時間がかかるのは私だけですか?wかれこれ1時間以上実行しています('A`)

前のSymfony2プラグインはEclipse3.7とかでも入ったっぽいのですが、新しくなってからEclipse4.3以降じゃないと入らなくなりました。Twigプラグインも同様のようです…(認識間違ってたらすみません)。

新規プロジェクトの作成でSymfonyを選択せず従来通りのやり方でもTwigファイルに色がつくのでそれだけでもだいぶ違います。

 

あと、わかってたことではあるんだけど、2.0.xと2.3.xって移植できなさげ。

$factory = $this->container->get('validator.mapping.class_metadata_factory');
$classMetadata = $factory->getClassMetadata($className);

2.3.xではgetClassMetadataがない。変わりに何になるのかはElipseのセットアップが終わったら考える。

 

追記

 

`ClassMetadataFactoryInterface`インターフェースは非推奨で、2.3 で削除されます。代わりに `MetadataFactoryInterface` を実装するようにしてください。メソッド名が `getClassMetadata` から `getMetadataFor` に変更され、任意の値 (たとえばクラス名やオブジェクト、数値など) を受け取ります。独自の実装では、与えられた値のメタデータをサポートしていない場合 `NoSuchMetadataException` を投げるようにしてください。

 という記事を見つけました。そういうことらしい。

gitメモ

現場でデザイナーさん向けに作ったQAを転記。

 

Q1.        今いるブランチを知りたい
A1.        git branch
          * のついてるブランチが今いるブランチ
          全部のブランチを見たいとき
          git branch -a
Q2.        ブランチを切り替たい
A2.        git checkout ブランチ名

Q3.        ローカルブランチを削除したい
A3.        git branch -D ブランチ名

Q4.        リモートブランチも削除したい
A4.        git push origin :ブランチ名    

Q5.        現在のブランチのファイルの状態を確認したい
A5.        git status

Q6.        特定のディレクトリ以下すべてaddしたい
A6.        git add ディレクトリパス/*

Q7.        addしたファイルを取り消ししたい
A7.        git rm --cached ファイル名

Q8.        git管理下にあるファイルを削除したい
A8.        git rm ファイル名
            ディレクトリを削除したいとき
            git rm -r ディレクトリ名

Q9.        commitをなかったことにしたい
A9.        直前のコミットを取り消す
          git commit --amend
         commit自体を取り消したい
            ワークディレクトリの内容はそのままでコミットだけを取り消す
            git reset --soft
            コミット取り消した上でワークディレクトリの内容も書き換える
            git reset --hard ORIG_HEAD

Q10.        あるコミット時点の状態に戻したい
A10.        git revert コミットハッシュ文字列

Q11.        コミットもaddもしてない状態にあるが変更をなかったことにしたい

    (元の状態がわからなくなった時)
A11.        git checkout .
          または、
              git reset --hard git ORIG_HEAD
             で変更されたファイルを元に戻し、
              git clean -fd
             で、git管理下にないファイルを削除する

Q12.        ブランチ間の差分を見たい
A12.        git diff 比較したいブランチ名A 比較したいブランチ名B ファイル名
           異なるファイルを比較したい場合
           git diff 比較したいブランチ名A:ファイル名A 比較したいブランチ名B:ファイル名B

Q13.        ディレクトリ・ファイルの移動をしたい
A13.        git mv ファイルA ファイルB      ←ファイルAをファイルBにリネームする
          git mv 移動元ディレクトリ名/ファイル名 移動先のディレクトリ名/ファイル名

Q14.        とりあえず今の状態を一時的に保存したい(addする暇がない)
A14.        git stash save
             一時的に保存した差分を元に戻す
                 git stash pop
             一時保存の確認
                 git stash list
             一時保存の削除(元に戻せないので注意)
                 git stash clear