AtomユーザがPHPStormに乗り換え、PHPStormのキーマップをAtomで説明
AtomユーザがPHPStormに乗り換え、PHPStormのキーマップをAtomで説明
概要
これまでAtomユーザだったが、会社でPHPStormを買ってもらった。PHPStormは、PHPに特化したIDEである。これで捗る...と思いきや、PHPStormとAtomのショートカットの違いで少し苦戦。
ということで、本記事はAtomでよく使うショートカットキーを、PHPStormに当てはめ説明していく。
基本操作
最近開いたファイルを一覧
これは便利すぎる。
Command + E
同一単語を選択
Atom でいう、「Command + D」。同一単語を編集するときにすごく便利。 変数名をあとから変える時とか、これを多用しています。
Control + G
同一単語を全選択
上のControl + G
を強化したもの。一括置換的なのは危険なので、基本的に同一単語を選択しまくって、編集が多いですね。
Control + Command + G
警告の解決方法を提示
Alt + Enter
最初のうちはかなり警告が来ますが、いらない警告はどんどん無効にする。 で、この無効にする作業を含めて、すべてキーボードで完結できるのはすごく便利。
コマンドパレット的な
Atom の コマンドパレット的(Command + Shift + P
)な。
Plugin のあの機能を使いたい。でもショートカットがわからないって時によく使うやつ。
補完(検索)が強力なので、基本的にこの検索で飛べますよね。
Command + Shift + A
例えば、「左に行番号ほしい」と思ったら、
- コマンドパレットを表示
Command + Shift + A
- それっぽいワードで検索
number
- それっぽいワードを発見
Show: Line number
まさにそれっぽい。それを選択すると、Preferences に飛ぶので、チェックを付ける。 (Enable, Disable 選択をココでできれば最高なのだが)
git Command
Git command などもここでちゃちゃっとできますね。
検索
おなじみ
Command + F
全検索
Command + Shift + F
全検索機能が強力で、結果も一瞬でその場に飛べてプレビューできるので素敵。ただ、下の検索結果が邪魔。Escape 連打しても消えない。。。
下にコンソールとか検索結果が出てうざい
Shift + Escape
ちょっとしたTerminal を使いたい
Alt + F12
こんなん覚えられない。F12までやりたくないって場合は、コマンドパレットを使っちゃいましょう。一瞬です。
Command + Shift + A ===> terminal
編集中
定義されているメソッド・クラスの内容を確認
このメソッドってなんだっけ、何が返ってくるんだっけって時に利用。 これを使わなくても良いようなメソッド名をつけるべきだが、現実はうまくいかない。
Command + Y
リファレンス表示
きほんてきい
Control + J
コード補完
入力中補完は効きますが、一度止めてしまうと補完が効かなりますよね。 再補完させるためのショートカットキー。
Contorl + Space
(自分の環境ではSpotLight がでてきたので、Spotlight のキーボードショートカットキーを変更した。 ※ 厳密には Alfred を別のショートカットキーを使っているので、無効にした。)
- 作者: 高橋麻奈
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/09/26
- メディア: 単行本
- この商品を含むブログを見る
アップロードされたファイルをどこまでバリデーションするか(PHP)
アップロードされたファイルをどこまでバリデーションするか(PHP)
概要
CakePHP1.3プロジェクト で、アップロードされたファイルを加工する必要があった。その際、アップロードされたものをどこまでバリデーションを行うか、が問題である。
ここが長すぎたら Controller
が肥大化し( ValidationClass
を作っても良いが)、
簡単なバリデーションだといつか痛い目にあう。
スクリプト
簡易的ではあるが、僕は以下のようにバリデーションを行う.
class AdminController { /** * アップロードファイル([].csv)を受け取る. * @return */ public upload_file() { // POST 以外は受け付けない(cake1.3) if (empty($this->data)) { echo 'POST ではありません.'; return false; } // 変数が存在しているか確認. // これを抜きにすると, `is_uploaded_file()` で Warning が発生 if ( !isset($data['ThisModel']['row_file']['tmp_name']) || !isset($data['ThisModel']['row_file']['name'])) { echo 'ファイルが見つかりません.'; return; } // アップロードファイルか確認 if ( !is_uploaded_file($data['ThisModel']['row_file']['tmp_name'])) { echo '不正なアップロードです.'; return; } // アップロードファイルをゴニョゴニョ $uploaded_fp = fopen($this->data['ThisModel']['row_file' ]['tmp_name'], 'r'); } }
良いアイディアが有りましたら、コメント頂けると幸いです。
メタプログラミングとは - Rubyを例に説明
最近、メタプログラミングという言葉をよく聞く。といっても、結構前からだが、意識し始めたのは最近。
メタってなんだよ、メタってと思っていた時期がありましたが、ようやくなんぞやと調べる気になった。
ruby の技術力を少しずつ上げていきたいので、ruby を例に説明する。
メタプログラミングとは
meta_programming_08.rb
class Rabbit class << self def colors [:black, :brown, :white, :mixed] end end end p Rabbit.colors
また、クラスメソッドを定義することは、現場のコードでしばしば見られるパターンなのに、> 実際は複雑であることも理由の一つです。Ruby初心者からすると、「class << self」のよう> なコードを見たら、ギョッとすることでしょう(私もそうでした)。
コンパイルなしに実行できる
ゲッターとセッターを自動生成
いくつものインスタンス変数があり、それぞれにゲッター/セッターを定義するのは面倒である
そこで、このメタプログラミングを用いて、(実行時に)自動生成させる
- 各インスタンス変数にセッターゲッターメソッドを書く
class Item def get_price @price end def set_price v @price = v end def get_name @name end def set_name v @name = v end # インスタンス変数の数だけセッターとゲッターが存在する end
- インスタンス変数を動的にセッターゲッターメソッドを追加する
class Item def define_accessor *plist self.class.class_eval do plist.each do | property| define_method "get_#{property}" do @property end define_method "set_#{property}" do |v| @property = v end end end end end item = Item.new item.define_accessor "price", "name", "category" item.methods.grep(:get_price)
個人的にこれはよく書けたな、と自画自賛をしたいところだが、ネストが深い。
さいごに
ざっくりメタプログラミングというものを知った。動的にメソッドを追加することなのかな。初見では、メリットが分かりづらかったが、セッター・ゲッターの例から少し便利さを知ることができた。
こうしたほうが Ruby っぽい。こうしたほうが綺麗。テクニックなど、教えて下さい。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/10/10
- メディア: 大型本
- この商品を含むブログ (2件) を見る
冪等性(べきとうせい)とは
冪等性(べきとうせい)とは
ココ1年くらいで、冪等性(べきとうせい)という言葉を何度も聞いた。 ついに業務でもこの言葉が出てきたので、改めて意味を調べてみることにする。
冪等性とは
冪等性とは、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。
よく例にあげられるのは、i = 0
と i = i + 1
である。
var i = 0; // i は必ず 0 になる:冪等性が保たれる // 実行する度に i が 1 足される。(実行回数によって、 i の値が変わってしまう) // :冪等性が保たれない i = i + 1
他に例を挙げるなら、 copy
も同様である。
copy a.txt b.txt # copy できた
copy a.txt b.txt # 既に b.txt があるため、copy できない overwrite b.txt? (y/n [n])
インフラと冪等性
この概念をインフラ構成に組み込んだのが、Chef
や Ansible
などである。
システムの機能を変更するなら、サーバーをぶっ壊して、新しく作りなおすというものである。
サーバに nginx がインストールされていれば、繰り返しインストールすると、エラーが返ってくる
を何度実行しても Nginx がインストールされて起動した状態に収束し、何回も繰り返しインストールされたり、既にインストールされているからといってエラーになったりすることはありません。 ほとんどの場合、 Chef の動作は冪等性が保証されていますが、 Script や Execute などの DSL は書き方によっては冪等性が保証されないことがあります。 ですのでレシピを書く際は冪等性が保証されるように意識的に作り込んでください。
from: http://blog.schoolwith.me/chef-re-introduction/
REST と冪等性
- GET
/show/1
(API の種類にもよるが)これは、必ず ID の値が 1 のデータが返ってくる。 何度も、show/1 にリクエストを送っても、 1 のデータが返ってくる。
- DELETE
/delete/1
id が 1 であるデータが削除される。これも冪等性が保たれる。
おわかりだろうか。
冪等とは「ある操作を何回行っても結果が同じこと」を意味する数学用語です。たとえばPUTとDELETEは冪等ですので、PUTやDELETEを同じリソースに何回発行しても、必ず同じ結果(リソースの内容が更新されている、リソースが削除されている)が得られます。 安全とは「操作対象のリソースの状態を変化させないこと」を意味します。リソースの状態に変化を与えることを副作用といいますので、安全は「操作対象のリソースに副作用がないこと」とも言います。たとえばGETには副作用がないので、GETを同じリソースに何回発行してもリソースの状態は変化しません。
http://blog.ruedap.com/2011/03/25/http-method-post-put-idempotence
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (183件) を見る
実践編
http://blog.schoolwith.me/chef-re-introduction/
さいごに
冪等性。冪等性を理解するのは、難しい。実際に Ansible
や Chef
を使ってみることで、有り難みが理解できるのかな。
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)
- 作者: 吉羽龍太郎,安藤祐介,伊藤直也,菅井祐太朗,並河祐貴
- 出版社/メーカー: 技術評論社
- 発売日: 2014/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (19件) を見る
PHPで時刻の範囲内で処理を行う。
はじめに
卒業制作をしていて、証券取引所の取引可能時間内(9:00 - 15:00)で取引が行うようにする必要があった。 範囲内で作業を分けるようなTipsがなかったの、執筆してみる。
コード
<?php // date('Y-m-d **:**:**') で範囲を設定する $start_date = date('Y-m-d 9:00:00'); $end_date = date('Y-m-d 15:00:00'); $today = date('Y-m-d h:m:i'); // 計算できるようにミリ秒にする $start_time = strtotime($start_date); $end_time = strtotime($end_date); $today_time = strtotime($today); if($start_time <= $today_time && $today_time <= $end_time){ // start_date <= today <= $end_date echo 'inner'; } else { // !start_date <= today <= $end_date echo 'outer'; }
- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf,高木正弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/03/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る
【Github】vagrant から push したら別のユーザ名が出現した
お久しぶりです。
Github(今回は、Bitbucket)にVagrant から push したら別のユーザ名でcommit されていた。 (例:vagrant, root)
これでは誰かわからないため、vagrant の方のユーザに、名前をつけることにする。
$ git config user.name "my_new_name" $ git config user.email new_name@example.com
これで問題なく名前を付けることができた。
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
- 作者: 大塚弘記
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (23件) を見る
rubyとcrontabで毎朝、休講情報を取得するプログラムを作成した話
はじめに
私は、学内アルバイトとして、TA(Teaching Assistant)をしている。基本的な業務は、簡単なエクセルの使い方やワードの使い方などを教えている。 しかし、TAは授業を履修していないため、休講情報の通知が来ない。
休講情報はベーシック認証があるサーバに存在しており、自動で取得し通知することを考えた。
ロジック
--- ruby ---
- 外部からアクセス可能(basic認証)なウェブサイトの休講情報を取得する
- 整形させる
- 当日の休講情報を抽出/出力
crontabで、上記のプログラムを毎朝実行し、メールする。 これらを、ウェブサービスを公開するために借りたVPSにおいておく。
http://hagetak.hatenablog.com/entry/2015/02/20/232004
書いてみた。
require 'nokogiri' require 'mechanize' agent = Mechanize.new agent.add_auth('http://www.gakkounowebsite.info/', 'userid', 'password') @page = agent.get('http://www.gakkounowebsite.info/?page_id=1028') @content = @page.search('.entry-content') @class_datas = [] # 検索用 => "6月12日"という文字列を検索するために b = Time.now @today = "#{b.month}月#{b.day}日" # <p>6月12日 情報倫理<br>\n 教室:1201教室... </p> # <p>6月12日 財務諸表<br>\n 教室:1203教室... </p> # => ['6月12日 情報倫理...', '6月12日 財務諸表'] @content.xpath("//p").each do |c| @class_datas << c end a = [] @sending_datas = [] # [0] => date # [!0] => className, teacher, remarks # @class_datas[0] => "6月22日(月)\n 2限:情報演習・基礎 \n 担当:斉藤先生 \n 補講:課題指示あり" # a[0] => ["6月22日(月)", "2限:情報演習・基礎", "担当:斉藤先生", "補講:課題指示あり"] @class_datas.each do |info| a << info.text.split("\n") end # 本日休講の項目を取得 a.each do |s| s[0].tr!("0-9", "0-9") @sending_datas << s if(s[0].to_s.match(@today)) end puts '休講情報はありません' unless @sending_datas @sending_datas.each do |s| puts '*** ' * 10 puts s end
今こうしてみると、読みづらく、気持ち悪いね。整形作業に手間がかかってる感じ。もう少し簡単にできないだろうか...。
crontabの設定
crontabについて学んだことは、後日記事にする。 さて、このプログラム(fetch_class_info.rb)をcrontabで動かしたいと思う。
いかのプログラムを書いて、動かしている。
35 7 * * * /home/hagetak/.rbenv/shims/ruby /home/hagetak/cron/fetch_class_info.rb | mail -s `echo $(date +'\%Y/\%m/\%d')休講情報` your_email_address@domain.com
一つ一つ見てみると、わかるだろう。
minites hour * * * [実行するプログラム]
という感じで、この例では、毎日7時35分に実行するプログラムだ。所有者・実行者が違うと、PATHが通っていない可能性があるので、絶対参照でプログラムを実行させることにした。
実行させたい大本のプログラム(ruby だったり, pythonだったり...)は、whichコマンドで確認することができる。
> which ruby => /home/hagetak/.rbenv/shims/ruby
ruby yourprogram.rb
で実行できるので、rubyファイルは絶対参照で記述。
次のステップは、少しややこしい。(件名を日本語/変更したくない場合はこの処理は飛ばして良い)
mail -s
echo $(date +'\%Y/\%m/\%d')休講情報
your_email_address@domain.com
実行した結果を mail コマンドに受け渡し、送信するというモノだ。
echo $(date +'\%Y/\%m/\%d')休講情報
これは、いつの休講情報かわからないために追加したもの。
crontabのshに問題があるため、dateコマンド内の%はバックスラッシュでエスケープすること
この処理で引っかかって、1日ずっと考えていた...。
dateコマンド と crontab の コマンドライン中の %(パーセント)記号 - keigoiの日記
さて、これらをまとめると、以下に置き換えられるだろう。
result of your program | mail -s "件名" your_email_address@domain.com
cron処理結果を、subjectを日本語にしてメールする方法 | Web開発者の備忘録
知見
- いきなり毎朝...で設定すると気が遠くなるので、以下に変更すると良い(毎分)
*/1 * * *
- メールが届かない!ってときは、次のコマンドを打つと出ている
- 件名とかいらない。ってときは簡略なものでできる
MAILTO="your_email_address@domain.com" */2 * * * * /usr/bin/ruby /Users/hagetak/cron/fetch_class_info.rb