2012年12月6日木曜日

一人Advent Calendar 5日目

5日目といいつつ6日の朝です。

4日目の記事も完成してないんですけどとりあえず5日目書きます。

1,2,3日とひたすらYAMLファイルを解析していたのですが実際はどうやって解析するかというのをJYamlのソースを少し見てみます。

Yamlの解析はデータの種類を把握しないといけないので流れしては

1 データ読み込み
↓
2 データ構造理解
↓
3 データを理解した構造に合わせて変換

でいいと思います

今回は
 
 Yaml.load(new File("test.yml"));
を呼び出したとして処理を追ってみます。

まずはYamlクラスのloadメソッドです
 
public static YamlConfig config = YamlConfig.getDefaultConfig();

public static Object load(File file) throws FileNotFoundException{
   return config.load(file);
}
loadメソッドは様々な引数に対応してましたが、今回はFileを引数に取るのだけを追っていきます。
YamlConfigのloadメソッドに処理を委譲しているようなのでそちらへ。

YamlConfig
 
public Object load(File file) throws FileNotFoundException{
  return load(new YamlDecoder(new FileInputStream(file), this));
}

public Object load(YamlDecoder dec){
  dec.setConfig(this);
  Object ret = null;
  try {
    ret = dec.readObject();
  } catch (EOFException e) {}
  return ret;
}

どうやらloadメソッドにYamlDecoder以外の引数を渡すとYamlConfigクラスの中でYamlDecoderに変換してYamlDecoderを使ってloadを行っているみたいです。
どうやら複数データをシリアライズしている時と1つのデータをシリアライズしている時で呼ぶ方は違っても結局内部では同じメソッド使ってるみたいです。
(落ち着いて考えたら当たり前だった・・・)

次はYamlDecoderクラスのreadObjectメソッドですね。(setConfigメソッドはYamlConfigを渡してYamlDecoderクラスから参照できるようにしているだけだったので省略)

YamlDecoderクラス
 
public Object readObject() throws EOFException{
  try {
    JYamlParserEvent event = new JYamlParserEvent(createLogger(), this);
    if (parser == null){
      parser = new YamlParser(in,event);
      firstDocument(parser, event);
    }else{
      parser.setEvent(event);
      if (!nextDocument(parser, event))
        throw new EOFException();
    }
    
    Object ret = event.getBean();
    
    if (ret == null)
      throw new YamlException("Document is empty.");
    return ret;
  
  } catch (EOFException e) {
    throw e;
  } catch (YamlException e){
    e.setLineNumber(parser.getLineNumber());
    hrow e;
  }
}
最初に呼ばれた時、YamkParserを初期化してfirstDocumentメソッドをそれ以外はnextDocumentメソッドを呼ぶ出しているみたいです。
解析としてはやっていることは同じはずなのでfirstDocument側だけ追います
 
void firstDocument(YamlParser p, YamlParserEvent event){
  try {
    while (p.comment(-1,false));
            
    if (!p.header())
      p.document_first();
    else
      p.value_na(-1);
    }catch (SyntaxException e){
      event.error(e,e.line);
    }catch (IOException e){
      throw new YamlException(e);
    }
}
ここから先はすべてメソッド追っていくと長くなるのでそれぞれのメソッドでなにをしていたかだけ書いていきます、まずはcommentでコメントかどうか判定します。またコメントの前にもtabが使われていたらエラーがでるようになってました。

headerメソッドは---から始まるかどうかを判定してました。


まだここまでしか見れてないですが、ここから先は実際にデータを読み込んで解析してデータを指定されている構造に直せば解析は終わりだと思います。
とりあえず今日はここまでで。

2012年12月4日火曜日

一人Advent Calendar 4日目(アノテーション)

4日目

三日坊主にはならなかったですね。

今日はJavaでコメントの一種?であるアノテーションの使い方です。

アノテーションはソースコードにプログラム以外で情報を与える時に使用します。
普通のコメントで違い、アノテーションはコンパイラに意味のある情報を与えることが
できるのでしっかりと使えばすごく便利です。

まずはアノテーションの種類ですが、これは3種類あります

マーカーアノテーション : アノテーションがついていることに意味があるもの
例) Deprecated、Override

単一アノテーション : データを1つだけ持っている
例)SuppressWarnings

フルアノテーション : データを複数持つ
例)Test

時間がないので今日は種類の紹介だけです、時間があれば後で追記します。
ごめんなさい

2012年12月3日月曜日

一人Advent Calendar 3日目(JavaでYamlファイル読み込みその3)

毎日ブログ書くのがこんなにも大変だとは思ってなかったです。

今日はホント少ないけど継続は力なりってことで書きます。

前回まででYamlで様々なオブジェクトが扱えるようになったので今日は複数のオブジェクトを扱います。

まずはシリアライズ
シリアライズにはYamlEncodeクラスを使います

 
  List <Integer> list1 = new ArrayList < >();
  list1.add(10);
  list1.add(11);
  list1.add(12);
  
  List <Integer> list2 = new ArrayList < >();
  list2.add(0);
  list2.add(1);
  list2.add(2);
  
  YamlEncoder enc = new YamlEncoder(new FileOutputStream("hoge.yml"));
  enc.writeObject(list1);
  enc.writeObject(list2);
  enc.close();
シリアライズした結果のファイルは以下です。
 
--- 
- 10
- 11
- 12
--- 
- 0
- 1
- 2

次はこのファイルをデシアライズします。
デシリアライズにはYamlDecoderクラスを使います
サンプルには2種類やり方があったので2種類載せときます
まずは1種類目
  YamlDecoder dec = new YamlDecoder(new FileInputStream(new File("hoge.yml")));
  while (true) {
   Object object = dec.readObject();
   System.out.println(object);
  }
こっちが2種類目
  for (Object object : Yaml.loadStream(new FileInputStream(new File("hoge.yml")))) {
    System.out.println(object);
  }

2番目のほうが要素の数がわかってなくてもエラーがでないから良い感じ。
基本的にはこっちを使えばよさげ。

3日間もYamlファイルでお茶を濁した間はありますがこれでYamlはひと通り終わりです。
明日からなに書こうかな・・・

2012年12月2日日曜日

一人Advent Calendar 2日目(JavaでYamlファイル読み込みその2)

1日目はJavaでYamlファイルを扱いましたが、リスト形式のデータを読み込んでいるだけでした。
今日はリスト形式だけじゃなく、Mapや自分で定義したオブジェクトのデータをシリアライズとデシアライズしてみます。

まずはシリアライズ
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列);
でこれがデシアライズ
 
  Yaml.load(デシリアライズしたいファイルや文字列);
まあシリアライズとデシアライズしたいだけならこの二つだけで充分ぽいので早速サンプルです。
昨日に引き続きまずはlistをシリアライズしてデシアライズします
今回読み込みyamlファイル
 
- hoge
- fuga
- mofu
-
  - fufu1
  - fufu2
たいしたことしてないけどサンプル
 
//yamlファイルの読み込み(デシアライズ)
        try {
  List <Object> list1 = (ArrayList<Object>) Yaml.load(new File("list.yml"));
  System.out.println(list1.get(0));
  System.out.println(list1.get(1));
  System.out.println(list1.get(2));
  System.out.println(list1.get(3));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 System.out.println();
 System.out.println("==============");
 System.out.println();
 
 //リストのシリアライズ化
 List<Integer> list2 = new ArrayList<>();
 list2.add(0);
 list2.add(1);
 list2.add(2);
 System.out.println(Yaml.dump(list2));
続いてMapを扱います
読み込んだyamlファイルこちら
 
Name: Andre Agassi
Birthplace: LasVegas
Height: 5'11'' (180 cm)
Turned Pro: 1986
でサンプル
 
    try {
  Map<Object, Object> map1 = (HashMap<Object, Object>) Yaml.load(new File("map.yml"));
  System.out.println(map1.get("Name"));
  System.out.println(map1.get("Birthplace"));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
  
 Map<String, Object> map2 = new HashMap<>();
 map2.put("name", "hoge");
 map2.put("age", 20);
 map2.put("height", 180);
 map2.put("weight", 70);
 System.out.println(Yaml.dump(map2));
次は自分で作成したクラスを扱います
今回扱いクラスはこれ(すげー適当に作ったのは気にしない方向で)
 
package test;
public class Hoge {
 private int num;
 private String str;
 
 public Hoge(){
  
 }
 public Hoge(int num, String str) {
  this.num = num;
  this.str = str;
 }

 public int getNum() {
  return num;
 }

 public void setNum(int num) {
  this.num = num;
 }

 public String getStr() {
  return str;
 }

 public void setStr(String str) {
  this.str = str;
 }
 
 
}
さっそくシリアライズしてみます
 
  Hoge hoge = new Hoge(10, "test");
  System.out.println(Yaml.dump(hoge));
出力結果
--- !test.Hoge
num: 10
str: test

普通に出力すると!test.Hogeといったふうオブジェクトの情報が入ってしまいます。
これはこれでデシアライズする時にオブジェクトを特定できて便利なんですけど他の言語で扱えなくなってしまいます。
このオブジェクトの情報を表示しなくするためにはYaml.dumpの第2引数にtrueを設定すれば表示されなくなります。
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列, true);
第2引数を設定した出力結果
---
num: 10
str: test

で次はデシアライズです
読み込みファイルは先ほど出力した結果をファイルにしたものです
 
  Hoge hoge1 = (Hoge)Yaml.load("object.yml");
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
オブジェクトの指定がある時はこの方法でうまくいくのですが、情報がない時失敗していまします。
オブジェクトの情報が無い時のデシアライズのサンプル
 
  Hoge hoge1 =Yaml.loadType(Yaml.dump("object.yml"),Hoge.class);
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
情報がないなら渡してあげればいいってだけですね。

こんな感じでYamlは様々なオブジェクトを扱えるので便利そうです。
今回は日本語は扱ってないですけどどうやら日本語も普通に使えるようです
公式のJavadocはこちらhttp://jyaml.sourceforge.net/javadoc/index.html
明日も引き続きYamlファイルの扱い方に付いてになる予定です

2012年12月1日土曜日

一人Advent Calendar1日目(JavaでYamlファイル読み込み)

何かきっかけがないとブログを更新しないんで一人Advent Calendarをやってみることにしました

普通のAdventCalendarだとテーマが決まってたりするんですけど一人でやるんでテーマも特にないです。
目標は「継続して更新する癖を付けること」

1日から頑張ったら途中で辞めるのが目に見えてるので1日目は控えめにJavaでYamlファイルを読み込みます

Yamlファイルはマークアップの形式の1つでもとはRubyで使われていたとか
XMLの変わりはJSONかYamlのどちらかになると思ってます。
YamlはJSONよりも様々な形式に対応しているのでYamlの方が少し複雑な印象

JavaでYamlを解析して読み込み時は「JYaml」というライブラリは使います
公式サイトの「Click here」からjarファイルをダウロードして読み込みをしたいプロジェクトのビルドパスに配置します

ちなみに今回読み込んでみるYamlファイルはこの2つで両方共プロジェクトのルートにおいてあります。
test.yml
- hoge
- fuga
- mofu
-
  - fufu1
  - fufu2

test2.yml
- 1
- apple
- orange

で実際に読み込むプログラムがこれ ReadYaml.java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import org.ho.yaml.Yaml;

public class ReadYaml {

 public static void main(String[] args) {
  try {
   List array = (ArrayList) Yaml.load(new File(
     "test.yml"));
   System.out.println(array);
   array = (ArrayList) Yaml.load(new File("test2.yml"));
   System.out.println(array);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
}
今回のYamlファイルはリスト構造なので読み込むときもリストで読み込んでます。
でリストの中にMapやまたListが入ってるのかわからないのでObjectのリストになってます。
読み込んだらあとは表示しているだけです。

出力
[hoge, fuga, mofu, [fufu1, fufu2]]
[1, apple, orange]

1日目はただ読み込んだだけで終わりです。
明日はリスト以外の形式も読み込んでみたりと引き続きYamlと弄ることになる予定



なんかシンタックスハイライトが機能してないみたいなんで時間ある時に直しておきます

2012年11月10日土曜日

gitのインストール

去年ぐらいから流行っている印象のgitの導入手順を書いときます
 (流行っているのはgitというかgithubな気がするけどgithubについては今回はふれません)

gitで何ができるのかは「Pro Git」の日本語訳が公開されているのでそちらを参照
http://git-scm.com/book/ja


 gitの導入手順
 ① 「http://git-scm.com/downloads」
アクセスして使ってる端末に合わせてインストーラをダウンロード
(今回はwindowsでインストールします)

②インストーラを起動して画像にしたがってインストール
「Next」をクリック

利用規約に同士して「Next」をクリック


今回はデフォルトの設定で問題ないので「Next」をクリック

今回はGit Bashから利用するので一番上を選択して「Next」をクリック
WindowsのcmdからGitBashを使う場合は2番目を選択でいいはず

改行コードを設定する
今回は一番上を選択し「Next」をクリック
ここまで終わるとインストールが始まる

③インストールが終わったら「git bash」で
「git --version」コマンドでgitのインストールを確認


これでgitのインストールは終了

2012年10月16日火曜日

JavaFXを使ってデジタルフォトフレームもどきを作った時のまとめ3

最近忙しくて更新が遅くなってすみません。

書きたいことは溜まっているのでどこかでまとめて書きたいとは思っています。
XAMPPの設定とかgitの設定とかAndroidのfragmentとか

で今回はJavaFXでアニメーションを付けるとこです。
正直デジタルフォトフレーム作った時に一番めんどくさかったのはここです。

JavaFXでアニメーションをやること自体が始めてだったのでいろいろ戸惑いました、まあそれは以前ブログに書いたのでそっちを見て下さい。
結論だけここに書くと慣れちゃうとすごく楽に書けます。

       
//画像の変更タイムライン
timeline = new Timeline(
  new KeyFrame(
  new Duration(1000),
  new EventHandler() {
  @Override
  public void handle(ActionEvent event) {
    try{                
    //i番目の画像を表示
    //1回で10個ずつしか取れないので10個表示したら次の10個を検索   
    //1個の検索に対して100枚しか画像を取得できないので最初に戻す                                                            
    } catch (IOException e) {
    //ファイルの例外が発生したらそのファイルを飛ばす
      i++;
    }
  }
}));
画像の変更はImageクラスでインスタンス化したのをImageViewインスタンスにセットすればいい。
URL url = new URL(images.get(i - 1));
InputStream in = url.openStream();
Image image = new Image(in);
imageView.setImage(image);
随分遅くなってしまいましたがこれでJavaFXでデジタルフォトフレームと作った時のまとめは終わりです
あとでソースへのリンク貼っときます ソースの行数が多いとなぜかタグが最後に入って無駄な改行が入っちゃうみたいなんで原因探っときます。

2012年9月29日土曜日

JavaFXを使ってデジタルフォトフレームもどきを作った時のまとめ2

JavaでJSON形式のデータを解析する方法

JSONが何だか知らない方は「http://json.org/」を見て下さい

JavaでJSONを扱うために今回は「JSON-java」を利用します
ダウンロードは「https://github.com/douglascrockford/JSON-java」から。
説明は「http://json.org/java/」のサイトにあるようです。

今回使用したのは「JSONArray」「JSONException」「JSONObject」の3つですが、依存関係があるので「JSONString」と「JSONTokener」もダウロードして1つのフォルダにまとめてビルドパス設定を設定する必要があります。

準備はここまでです。

実際の使い方はgetで取得したいデータのキーを指定してデータを取得します。
データが配列の場合はgetJSONArray
普通のデータの場合はgetJSONObject
で大丈夫です。 ソースにするとこんな感じ
 
//json にはJSONデータの文字列が入っている
  try{
    JSONObject json = new JSONObject(json);
    JSONArray jsonArray = json.getJSONArray("items");
    for (int j = 0; j < jsonArray.length(); j++) {
      JSONObject tmp = jsonArray.getJSONObject(j);
      System.out.println(tmp.getString("link"));
    }
  }catch(JSONException e){
     e.printStackTrace();
  }
次回で取得したurlをJavaFXで表示してアニメーションを設定すれば完成です。

2012年9月23日日曜日

JavaFXを使ってデジタルフォトフレームもどきを作った時のまとめ1

使ったもの
・JavaFX2(GUI部分)
・Google Custom Search API (写真の検索)
・JSON-java (JSONの解析)

完成したのはこちら
テキストボックスに検索ワード入力してボタンを押したらCustom Searchで画像を検索してきてその結果の画像を連続で表示していきます。

流れとしては検索した結果がJSON形式で帰ってくるのでそれを解析してURLを取り出して表示しています。

Google Custom Searchの使い方
「https://developers.google.com/custom-search/v1/using_rest」にあるようにJSON形式で結果を返してもらう方法。
 
    private static final String QUERY_URL = "https://www.googleapis.com/customsearch/v1";
    private static final String KEY = "APIキー";//APIKey
    private static final String CX = "Custom SearchのID";//カスタム検索ID
    private static final String PAGE = "ページの数字";//1~101で指定して検索のスタート位置を指定
    private static final String PARA = "&alt=json&searchType=image&q=";//検索オプションの指定(jsonで結果を返す、画像検索を行う、等)
       

    //テキストフィールドに入力した値で検索
    //inputは検索文字列
    String query = QUERY_URL + KEY + CX + PAGE + i + PARA + inputText;
    //検索クエリを実行
    URL url = new URL(query);
    URLConnection connection = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
カスタムサーチは予め「http://www.google.com/cse/manage/all」で作成し、作成したカスタムサーチを使う。
APIキーは「https://code.google.com/apis/console/」で作成した自分のAPIキーを指定
次回はJSON解析部分について書きます

2012年9月20日木曜日

JavaFXでのアニメーション作成

Bloggerにソースコードを載せる時に利用するシンタックスハイライトを設定しようと思って 「http://goo.gl/IJEs9」を使っていたらなんと言語の欄にJavaFXを見つけたのでさっそくJavaFXのハイライトを試してみようってだけなのでテストも兼ねてます。
JavaFXでアニメーションを自分で設定する時はTimelineクラスを使うと経過秒毎に処理が書けるので簡単にアニメーションが作れます。
とりあえずソースの載せときます。
  
private Timeline timeline;
timeline = new Timeline(
  new KeyFrame(
    new Duration(100),//ミリ秒で指定
      new EventHandler() {
        @Override
        public void handle(ActionEvent event) {/*処理1*/}        
      }
  ),
  new KeyFrame(
    new Duration(200),//ミリ秒で指定
      new EventHandler() {
        @Override
        public void handle(ActionEvent event) {/*処理2*/}        
      }
  )
);
//タイムラインの無限に繰り返す
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();//タイムライン開始
timeline.stop();//タイムラインを明示的に終了

使い方は
  
    new Duration(100)

のところでアニメーション開始からの経過秒をミリ秒で指定し、指定秒毎にアニメーションを記述していくだけ。
タイムラインを無限に繰り返す設定にしてると指定したアニメーションが終わったらまた先頭のアニメーションから 実行していってくれます。
このソースの形だとタイムライン開始から100ミリ秒で処理1が200ミリ秒で処理2をやってまた最初に戻ってタイムラインの開始から300ミリ秒の時はまた処理1を実行します。

本当はソースは17行目で終わってるんですがなんか変なタグと無駄な改行がまざっちゃってますね、どうやっても消えないのでとりあえずこのままで。

2012年9月16日日曜日

安全なWebサイトの作り方のまとめ

IPAの「安全なWebサイトの作り方」を読んだのでまとめ
http://www.ipa.go.jp/security/vuln/websecurity.html

SQLインジェクションはプリアドステートメントを使って対策
エラーメッセージをブラウザに表示しない

OSコマンドインジェクション
なるべく使わないで使う場合は引数を全てチェックする

ファイルへのアクセス
ファイル名を指定する時はファイル名だけを取るようにしないと「../../a.txt」のような文字列で想定外のディレクトリのファイルを指定されるのでパスの中からファイル名だけを取得するようにする
ファイル名のチェックを行う

セッションの管理
セッションIDは乱数等から生成して、第三者が予測不可能にする
セッションIDをURLパラメータに格納しない
HTTPSで使うCookieにはsecure属性を指定してHTTPS以外で使えなくする
セッションはログイン後に開始する

クロスサイト・スクリプティング対策
 入力された時じゃなくて出力の時にエスケープ処理をする用にして、出力するものにはすべてエスケープ処理を行う、文字コードの指定は必ず行う
スクリプトタグを動的に作らない
CSSを任意のサイトから取り込まないようにする

CSRF対策
  登録情報等のユーザ情報を変更する時は変更する時にパスワード等の秘密情報を確認する
  変更の直前にパスワードを入力させるか、直前のページで秘密情報を埋め込んで確認ページで確認する

ヘッダの取り扱い
HTTPヘッダ、メールヘッダ共に基本的にはユーザからの入力を使用する時は改行文字を取り除いてから使用する

その他
アクセス制御はしっかりとする
機密情報扱うならパスワードの入力を求める

2012年8月30日木曜日

Webサイトを作った時に気にしたセキュリティ対策のまとめ

・XSS(クロスサイトスクリプティング)対策
サイトに動的な情報をそのまま表示しないようにすればいいのでユーザ側から受け取った入力を表示する時はPHPのhtmlspecialchars()等でタグを無効化してから表示する。

・SQLインジェクション対策
今回はDBへのアクセスはPDOを使ったのでPDOを利用する時の注意点だけ
必ずプレースホルダーを使う、prepareを使ってSQL文を実行すればOK
動的プレースホルダと静的プレースホルダがあるので 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE)
で静的プレースホルダを使うように設定する
DBへの接続時に文字コードを指定する(普通はUTF8)

・パスワードのハッシュ化
DBにパスワードを登録する際にハッシュ化するアルゴリズムにもいろいろあるらしく、
MD5とRIPEMDというアルゴリズムは危険性があるらしいので使っちゃいけない。
CRYPTRECという暗号化プロジェクトがSHA256以上を推奨してるらしいのでこれに従えばよさげ。
あとは「PASS」みたいないろんな人が設定しそうなパスワードを単純にハッシュ化すると同じ値にハッシュ化されてハッシュ化した値で同じ値がたくさんあったらこれはPASSをハッシュ化した値だなって感じに分かるのでソルトと言われる文字列をパスワードに付加してからハッシュ化してDBに保存する





2012年8月16日木曜日

短縮URLの生成


googleの短縮URLAPIを使う機会があったので忘備録的なもの

まずはAPIの利用登録をする必要があるので
「http://code.google.com/apis/」
で「URL Shortener API」の利用をオンにしてAPIキーも後で使うのでAPIキーをメモしておく

「https://www.googleapis.com/urlshortener/v1/url」のURLにAPIキーを足して短縮したいURLをJSON形式でPOSTすると短縮されたURLの情報がJSON形式で返ってくる

APIの上限は1日100万リクエストらしいので普通に使っていれば上限を超えることはなさそう

ソースコードは以下のサイトを参考を参考にさせていただきました
MACH3.laBlog「goo.glがAPUI公開されたらしいので試してみた」




2012年8月12日日曜日

Scala勉強過程その3

メソッドの引数はvalで宣言されている

メソッドの戻り値は基本的には最後に演算された値

クラスが静的メンバーを持てない

静的メンバーを持つ変わりにシングルトンオブジェクトを持っている
コンパニオンオブジェクトとコンパニオンクラス

コンパイルコマンドはscalac

Scalaの基本型はJavaと同じ種類で同じ範囲を持っている

生の文字列の場合は"""で囲めばエスケープ文字を使わないでも/等も使える
==演算子は値が等しいかを調べる、参照先を等しいか調べるのは別にある

2012年8月11日土曜日

Scala勉強過程その2



Scalaの配列等について

配列はミュータブル(初期化後は長さは変えられない)
リストはイミュータブル
タプルは異なる型の要素を持つことができてイミュータブル
集合とマップはミュータブルとイミュータブルの両方が準備されてる

あと個人的メモ

関数の結果型(戻り値の型)がUnitの場合は関数が副作用をもっている
ScalaにはJavaでいうinterfaceの変わりになるものはtrait(トレイト)というらしい、ミックスインとかもできるらしいけどこれはまだ先で
ミュータブルが変更可能でイミュータブルが変更不可・・・


2012年8月10日金曜日

Scsla勉強過程その1

Scalaスケーラブルプログラミング第2版
Scalaの参考書はコップ本って呼ばれてるこれが一番よさげらしいのでこれを参考に勉強して行きます(`・ω・´)
アマゾンのURL http://goo.gl/bckpI

Scala勉強のモチベ維持とまとめもかねてScalaの勉強過程を適当に書いて行きます

どうやらScalaはオブジェクト指向と関数型のどっちでも書くことができるらしい
1+2って式があるとInt型の+関数が呼ばれて加算が行われているって考え方?みたいに考えるのが関数型って理解のいいのかな?

オブジェクトの考え方もJavaっていうよりはRubyに近い印象を受けたけどまだまだほとんど学習してないのでこれから先また印象は変わるかも





2012年8月9日木曜日

Scalaのインストール


Scalaのインストールしたのでメモ

http://www.scala-lang.org/downloadsからPCにあったのをダウンロードし、ダウンロードしたファイルをインストール

インストールが終わったらデフォルトならProgram Filesフォルダの中にscalaフォルダがあるのでその中のbinフォルダに環境設定からパスを通す

scalaの実行はコマンドプロンプトからscalaコマンドで対話型インタプリタが起動する

ブログ始めました

ブログ始めましたー

あまり固く考えずにプログラミングについて思ったこととか書いていきます