2017年4月4日 星期二

Django with React part2

Django with React part2

繼續上一篇django with react環境建立
這次要來建立react所需的檔案

目標

建立react
將其應用到django的templates中

作法

運用npm來安裝所需套件

step1

npm init
此來建立package.json檔,它可以幫我們管理所安裝的套件

step2

npm install --save-dev react react-dom webpack-bundle-tracker babel babel-core babel-loader babel-present-react babel-preset-stage-0
安裝react套件
1. react , react-dom為主要使用的套件
2. babal系列為協助編譯ES6語法
3. webpack-bundle-tracker為此次重點,將react編譯後產生可讓django存取的檔案

step3

npm install -g webpack //可以使用全域安裝webpack,方便後面的編譯
npm install --save-dev webpack@2.1.0-beta.21
安裝所需的webpack,測試時發現使用2.1.0-beta.21此版本才能成功編譯webpack-config.js(後談)之中的resolve屬性,之後再研究有沒有其他版本可以正常使用

step4

mkdir -p assets/js //建立react主目錄
touch webpack-config.js //建立webpack設定檔
touch assets/js/index.js //建立react主js檔

step5

撰寫webpack-config.js檔,基本內容如下
var path = require('path');
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');

module.exports = {
    context: __dirname,

    entry: './assets/js/index',

    output: {
        path: path.resolve('./assets/bundles/'),
        filename: '[name]-[hash].js',
    },

    plugins: [
        new BundleTracker({
            filename: './webpack-stats.json'
        }),
    ],

    module: {
        loaders: [{
            test: /\.js?$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            query: {
                presets: ['react', 'stage-0']
            }
        }],
    },

    resolve: {
        modulesDirectories: ['node_modules', 'bower_components'],
        extensions: ['', '.js', '.jsx'],
    }
}

step6

撰寫react程式,先寫最基礎的展示看看即可
./assets/js/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app';

ReactDOM.render(<App/>, document.getElementById('app'));
./assets/js/app.js
import React, {Component} from 'react';
class App extends Component{
    render(){
        return(
            <h1>Hello React Django</h1>
        );
    }
 }
export default App;
在使用webpack來編譯,如果前面有使用-g來安裝webpack,就可以直接執行下列命令
webpack --config webpack-config.js
也可以執行以下命令
./node_modules/.bin/webpack --config webpack.config.js
到目前為止react部分的設定就完成了,接下來就是要設定django能夠來存取webpack編譯出的檔案

step7

pip install django-webpack-loader
此次另一重點,這是用來讀取webpack的檔案,詳細可觀看django-webpack-loader官方文件

step8

到setting.py做讀取的設定
主要新增以下設定
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'assets'),
)

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'bundles/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json'),
    }
}

INSTALLED_APPS = (
 ...
 'webpack_loader',
)

step9

將template的html做修改
{% load render_bundle from webpack_loader %}
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <div id="app"></div>
    {% render_bundle 'main' %}
</body>
</html>

final

最後就可以啟動server,並且依照上一篇設定的路徑http://127.0.0.1:8000/hello/
觀看結果
python manage.py runserver
至此就是django with react的設定

下一目標

  1. 研究React-Hot-Loader來提升開發速度
  2. 研究使用ajax來和後端python做溝通
  3. 研究使用在django使用redux
慢慢把這幾個興趣完成˙ˇ˙

2017年4月3日 星期一

Django with React part1

建立Django專案並結合React

在研究怎麼結合django和react所得到的結果
先將他記錄起來,或許之後能找到更好的做法

所需知識為

  1. python3: 基本的語法
  2. django : python所使用的後端server
  3. react.js : 前端框架
  4. webpack : 用來打包前端的檔案,並可輸出為單一或多個靜態檔
  5. npm : 前端使用的套件管理器

大致作法

  1. 先建立django專案,並使用template
  2. 使用npm安裝react, react-dom, babel…等工具
  3. 使用webpack將react專案打包
  4. 使用webpack-bundle-track產生可讓django讀取的靜態檔案
  5. 使用django-webpack-loader去讀取上一步產生的檔案

首先先建立django專案

假設已安裝好python3並建立虛擬環境
參考 建立python虛擬環境及基本django專案
step1:
建立專案
python django-admin.py startproject mysite
step2:
建立資料庫
python manage.py migrate
step3:
建立APP
python manage.py startapp apptest
step4:
建立templates資料夾
並建立index.html
此時專案目錄應為
├───manage.py
├───db.sqlite3
└───mysite
        settings.py
        urls.py
        wsgi.py
        __init__.py
└───apptest
        __pycache__
        migrations
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        views.py
└───templates
        index.html
step5:
設定django存取templates的html
於settings.py 之中TEMPLATES的 DIRS做存取的設定
TEMPLATES = [
    {
       ...
        'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/') ],
       ...
    },
]
step6:
建立index.html
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
Hello
</body>
</html>
step7:
於view.py設定存取樣板
from django.shortcuts import render
from datetime import datetime

# Create your views here.

def hello(request):
    return render(request, 'index.html', {
        'current_time': str(datetime.now()),
    })
step8:
設定urls.py讓設定連結
from django.conf.urls import url
from django.contrib import admin
from listTest.views import hello

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/', hello),
]
final:
啟動server
python manage.py runserver

連結http://127.0.0.1:8000/hello/

成功建立樣板後,之後就可以開始使用webpack來建立react專案並套用在django的樣板上

2017年4月2日 星期日

測試slackEdit

測試使用slackEdit markdown功能

測試目標

  1. 程式碼區塊
  2. 連結google blog

測試1

這是程式碼

def hello():
    print('Hello')

測試2

連結google blog

選擇slackEdit左邊清單publish

2015年3月8日 星期日

Unity初探

Unity相信大家都不陌生,在最近許多遊戲都使用它來做為開發工具,所以本著對遊戲很有興趣的我便決定來會會這個軟體,看能擦出怎樣的火花(?

寫了一個簡單的射氣球小遊戲,用的技巧很簡單,只是用滑鼠點點就能做到,成果如下


設置完背景後,讓幾個氣球(?)在下方隨機產生並往上飄動,而玩家
需點擊氣球賺取分數。

在2D遊戲裡都會使用到sprite的概念,他會幫我們處理圖檔的資訊,而這裏我主要想記錄的是,依照遊戲的設計需求,必須會某些sprite賦予一些屬性,才能對其進行操作,在射氣球裡為了要讓滑鼠能夠點擊,賦予氣球collider2D這個元件,在需要進行碰撞檢測時都需要它,它有好幾個形狀選擇如Box , Circle, Edge...等,依照需求來決定,在3D的設計有一樣的概念,只是是使用collider這個元件,簡單說沒有加上2D字樣的都是3D。

而不管是2D還是3D,若有如需要有物理行為的物質,如主角,敵人等就要給予rigidbody(2D)(剛體)這個元件,這像是給予遊戲元件一個身體一樣,射氣球沒使用到這個,只是順便將這個紀錄起來。

所以有了以上的概念,就可以做些基本的遊戲了,當然還有許多東西還在摸索,像是攝影機,光線等的控制,不過射氣球沒用到這些所以就先放著~

Unity使用的腳本語言有C#、JavaScript、Boo, 因為我主修Java ,所以使用C#來寫,這裡紀錄Unity裡有些既有函式可以使用,而幾乎一定會使用的函式是Update和FixedUpdate, 如其名兩個都是用來更新每個Frame所使用的函式,他才是讓遊戲有所動作的功臣,而不同在於,當使用的遊戲元件擁有rigidbody,那就要使用FixedUpdate,原因是他才會固定每個Frame裡的值,這樣才不會讓人物動起來有怪異的情況。

每個物體的移動都是由transform函式掌控,這也是射氣球的核心Code
transform還有許多功能,還要在研究一下

拉回主題,在射氣球裡所要使用的函式為OnMouseDown,這是按下滑鼠時會產生的行為,這也是Unity的既有函式,使用上當然也沒什麼。

本來想再多紀錄Animator的使用,不過因為我還不太會畫爆炸的圖示....,所以沒有使用在射氣球上,下次再用PS畫些圖來試試。










2014年8月24日 星期日

WIN7 安裝 Linux mint17 --雙系統安裝

最近突然想玩玩linux,畢竟之前聽說的許多open source都是從linux開發,就起了這個念頭,但windows系列用習慣了自然不能輕易就放棄他,所以就開始研究怎麼在win7安裝雙系統,並做個紀錄

首先目標當然是選用一個適當的linux版本,我是選用Linux mint17
所以就用這個做為例子

Step1:
先到其官網下載distribution
官網載點 : http://www.linuxmint.com/download.php

並選擇MATE版本,32bit or 64bit依自己需求決定

Step2:
使用隨身碟作為開機碟,或是燒成光碟,我使用前者的方式(因光碟機壞了...)
下載Universal USB Installer
載點 : http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

使用這個的好處在於它提供persisstence的功能,可以儲存Linux的系統設定和檔案

Step3:
做好前置作業後就是最重要的-分割磁碟
因為我的目的是要做成win7&linux並存的雙系統,所以必須分割磁碟給linux使用,相信使用linux的玩家都知道分割磁碟是安裝linux很重要的一點。
首先在電腦->右鍵->管理,找到磁碟管理


可以看到現在電腦磁碟的分布(上圖是我分割後的結果),在C槽右鍵選擇壓縮磁碟機,便會顯示現在C槽有多少容量可以使用


再輸入要壓縮的空間大小輸入你要給linux的容量(上圖為安裝後結果),那要如何分配容量給linux呢?
必須先了解主要的分割區,一般會分割4個儲存區給linux(以下為參考,依個人使用為主)
1.swap:虛擬記憶體使用(不過聽說現今RAM容量都很足夠,似乎沒分割出這塊也沒關係),我是分了1G在它上面
累計:1G

2.根目錄 "/":存放linux mint安裝的東西,一定要分割出的磁區,我分配15G在上面
累計:16G

3./boot:在國外論壇中好像沒什麼人割這塊出來,不過這是開機磁區,所以還是割一些出來,大約300MB左右就足夠了,我是給400MB
累計:16.4G

4./home:存放個人資料用,這裡就看個人想給她多少容量,我是給了60G
累計;76.4G

所以在壓縮C槽部分我共壓縮了80G給linux使用,在下方就會出現80G的可用空間
注意:以上分割是在安裝linux時才會出現


Step4:
做好這些準備之後,就是要正式安裝linux mint,
將開機碟插上電腦,並Bios選用usb開機,就會進入Linux mint17的開機畫面,並點選桌面的install linux mint17,選擇好要安裝的語言(拉到最下有台灣),點選繼續,確認好安裝條件(足夠的容量&連上網路),點選繼續進入此畫面


很重要的地方,請點選其他,這樣才能自己分割磁碟,進入到分割畫面



可以在選單上找到可用空間,這就是你壓縮C槽後釋出的空間,在它上面選擇 "+" ,就可以開始分割4個分割區

注意所有的分割區都選擇邏輯分割區和此空間的開頭,且用途選擇swap時,不會出現掛載點,掛載點就是選擇"/","/boot","/home"的地方,在大小輸入你規劃的容量即可(其餘分割區用途都是選擇ext4)




之後點選立即安裝,就可以去喝個咖啡等待它裝好,linux mint很貼心的會順便安裝grub,這是多重開機重要的小程式,之後開機時就會讓你選擇要用linux mint17還是windows7

以上為此次安裝雙系統的紀錄




2014年5月8日 星期四

EnglishLearning-連接詞

句子與句子之間的連接橋梁就是連接詞

在使用上有6種形式 :
1.長劃符號 (—)
2.冒號 (:)
3.分號(;)
4.對等連接詞(and , or , but)
5.副詞連接詞(because , when...etc)
6.關係詞(who , which...etc)

前3項的用法比較容易理解,這篇先記錄一下對等連接詞與副詞連接詞

對等連接詞

其實就是常見的and、or、but,以及其變化
and
-> both ... and (一方面...同時又...)
or
->either ...or (要不就是.....要不就是)
->neither...or(既不...也非)
but
->not...but (並非....而是)
->not only ....but (also)(不僅...而且)

<注意>
both..and..始終接複數動詞,其於對等連接詞視最近的主詞做動詞變化

EX : Either he or I am wrong.
EX : Not only he but also I have passed the exam.

<注意>
not only ... but (also)若置於主要子句之前,則必須採倒裝句,

EX : Not only he is clever , but also he is polite.(X)
        ->Not only is he clever , but also he is polite.(O)

除此之外還有幾個對等連接詞,這幾個視第一個主詞做動詞變化
as well as(以及...)
= no less than
= together with
rather than(而非...)
= instead of

EX : He as well as I is good at English.


副詞連接詞

較常見的有because , when , unless , as soon as , though , once ....etc

所謂副詞連接詞即是無法對等連接兩個句子,使用副詞的子句成為副詞子句,不可單獨存在

EX : I like him because he is nice.

<注意>
because 不可與 so連用

though
although         不可與but連用
even if
even though

有些副詞也可做為連接詞使用,但前面必須以分號(;)做分離

EX:He is nice ; however , I don't like him.

較常見的副詞有 :
相當於but :
however
nevertheless

相當於so :
therefore
thus

相當於and :
moreover
furthermore
in addition

此外
in addition
besides

還要其他重要的副詞連接詞
while(當... ; 而...)
where(在...的地方)
as(當 ; 雖然 ; 因為)
once(一旦)
or (否則)
nor (也不)
so that (以便..)
so....that...(如此....以至於)
in that(因為)
except that(只可惜 ; 只不過是)
since(自從 ; 因為)




2014年5月7日 星期三

Java with RTTI

一般而言,我們希望程式執行時每個使用的class的型態能夠確定,但並不是每個class在compile期間就清楚其型態,因此在這Java注重繼承、多型的語言,RTTI顯然占了一席之地

RTTI(Runtime Type Information) : 讓我們在程式運行時,可以發現並確認型態

RTTI有兩種方式
1.傳統的RTTI : 假設所有class在編譯時就已確定型態,而他需要使用.class文件,有三種方式
     a) Upcasting & Downcasting (Downcasting在Java中需要強制轉換)
     b) Class 物件 (reflect也會使用Class,如果只是使用Class中的cast,那還是傳統的RTTI)
     c) instanceof & isInstance()

EX :
其執行結果為
In main
Yummy
Loading Candy
True
After creating candy
Loading gum
After creating gum
Loading cookie
After creating cookie


2.Reflection : 在程式運行時,探索編譯時未知的class並且使用他,似乎也能和Proxy design pattern配合使用,而他的使用方法主要為Class這東西,再配合java.lang.reflect library,可以探知class中的field、method、constructor甚至implement的interface


與傳統的RTTI相較,reflection並不需載入.class文件(畢竟他是在運行時抄你家...)
Proxy design pattern依目前所看,其含意似乎為
1.將主要的核心部分隱藏
2.利用另一個物件來執行核心部分
3.可以在此物件做修改(新增或刪除)
有點像代理人的身分

EX:
其執行結果為
public void Ted.miue()
public void Ted.move()
public void pet.ShowName()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public Ted(java.lang.String)

在這例子我主要使用的為getMethod , getConstructor
可以發現當我們使用reflection,我們幾乎把這個class的身家都給查光了!
所以利用此方法,我們可在運行期間去做查詢,並發現此class的型態,然後去使用他,而最大應用在於network,畢竟在client端使用者會怎麼使用我們的程式通常未知,這看起來好像是個大坑...