つくりたいものがあったので、趣味グラマーとしてC#を始めました、Niseiです。
重い方の言語はあまりガッツリやり込んだ経験が無かったので内心ワクワクしてます。
文法やらポリモーフィズムやら継承やら基本的な部分は他の言語と同じ感じでだけど、今回ちょっと新たに「インデクサ」というやつが出て来た。
なんじゃそりゃ ということでちゃんと勉強してアウトプットしてみた次第です。
インデクサ?
クラスを配列っぽく操作できる子。
この説明だけだと「ん?」ってなるけど、身近な例としては 文字列操作がある。
using System;
class Hoge
{
public static void Main()
{
string foo = "bar";
Console.WriteLine( foo[2] );
}
}
こんな感じで何気なく使ってる foo[2]の正体こそまさにインデクサでした。
(続きを読む…)
「3Dって何となく難しそうで手を出しづらいなー」と少し敬遠していたけど、ブラウザ上とかでサクサク動いているのを見てるとやっぱり自分もやってみたい。
というわけで今回はWebブラウザ上で JSベースでぬるぬる動く3Dグラフィックスを実現できる「Three.js」をいじってみた。
Q. JSベースとはいってもなんか複雑そうで手を出しづらいんだけど…
結論から言えば、基本的な流れを理解してしまえばなんとなくいじれるようになった。
この「基本的な流れ」って言うのは、Canvasで言うなら「クロスブラウザのチェックをして、canvas要素取得して、コンテキストを変数に格納して…」みたいな感じ。Three.jsの場合は以下に説明するような流れになる。
Three.js で3Dをいじるまでの基本的な5つの流れ
(続きを読む…)
基本的な部分はおさえたので そろそろ参考書から離れて 自分でつくってみようかなと思う。
そういうわけで現在は簡単なタスク管理のWebアプリケーションを実装中。
ユーザにストレスが無いよう利便性を高めるために以下のような仕様を実装したい。
【仕様】
1. 項目の既存の属性をクリックしたらテキストエリアに切り替わって編集モード。
2. テキストエリアからフォーカスを外すか、エンターキーを押した場合 更新 ( ただし文字数0の場合は更新せず元に戻す )
3. Escapeキーを押した場合は更新せず元に戻す
疑問に思った事や困った事、以下。
jQueryでupdate?
$.ajax を使う。jQueryの場合はデフォで「PUT」をサポートしてくれているので UPDATEも安心。
そんなわけで最初のajaxの中身は以下のような形になった。
(続きを読む…)
セッションまわりやら何やらいじっていたら大分いじれるようになってきた。最初こそ手こずったものの、基本的な機能であれば人に説明できるレベルになったかな…という所感。
正直学習ペース遅いよなーとは思いながらも、それでも自分が使う道具に関しては 人に教えられるくらいには仕組みや概念ごとの繋がりを理解しておきたいよね という思いもあるので。
というわけで、今回はRailsにおけるエラーページの独自実装ということで話を進めていく。
まずは controllers/application.rb に、以下の二つのクラスを定義。一つは404用、もう一つは403用。
class NotFound;end
class Forbidden;end
Applicationコントローラ内に以下のコードを追加。
rescue_from NotFound, with: :err_not_found
rescue_from Forbidden, with: :err_forbidden
:
:
def err_not_found(exception)
render "errors/not_found", status: 404
end
def err_forbidden(exception)
render "errors/forbidden", status: 403
end
これだけだとルーティングエラー等、根幹の部分で起きるエラーまでは拾ってくれない。
(続きを読む…)
引き続きRailsの勉強。
例えば前回までにつくった「article」モデルの「掲載期限」について、「掲載期限を指定しない」というチェックボックスを追加する場合を考える。チェックがされている場合は 掲載期限を保存しない。
この場合 テーブルの項目として新たにカラムを一つ追加するのも無駄があるので、アクセサメソッドを使用する。
まずはViewに変更を加える。 articles/_form.html.erb の掲載期限の部分に対し、noexpire というチェックボックスを実装。
<td>
<%= form.check_box :noexpire %> <%= form.label :noexpire %><br>
<%= form.date_select :expired_at, start_year: 1990, end_year: 2030, use_month_numbers: true %></td>
Articleモデルに以下のアクセサメソッドを追加。
def noexpire
expired_at.blank?
end
def noexpire(=val)
@noexpire = val.in?([1,"1",true])
end
フォーム項目と同名のアクセサメソッドを定義した。getterの方では フォームをページで読み込んだ際に返す値を記述し、setterの方では フォームをPOSTする際に @noexpire というインスタンス変数に対して「フォームから渡された値が 1,”1″,true のいずれかならtrue、そうでなければfalse」を代入。
ここでバリデーションが実行される前に行われる処理を記述する。
before_validation :fix_expired_at
:
(略)
:
def fix_expired_at
self.expired_at = nil if @noexpire
end
fix_expired_at では、POST時にsetterで定義された@noexpireの値がtrueなら(つまり「掲載期限を指定しない」にチェックされた状態なら)、データベースに格納する expired_at の値を「nil」にする、という処理が行われている。
因みに、何故ここに「self」をつける必要があるのか?以下のようにしてもいいんじゃないの?
def fix_expired_at
expired_at = nil if @noexpire
end
…と思ったけれど、上記がダメな理由は Ruby の根本原則を考えると自明で、上記のようにすると expired_at が 一関数内のローカル変数になってしまう という単純な理由だった。