發表文章

Django教學初體驗

因為公司的關係,我成了Django教學的老師,帶領同事們進入 Django的世界。 一開始我充滿衝勁,查了很多入門資料、排演自己要怎麼做教學。 但實際上不如想像中順利。 起初,這個教學本來只針對自己處裡的小組,但因為在全體資訊中心會議提出來之後,變成隔壁處的人也跑來參與。 大家對於網頁的認知不一 ,有些是資深網頁工程師了,而有些只寫過桌面應用程式,有些人甚至是MIS(或許連程式都沒寫過!) 而且對於網頁框架的概念,懂的人更是少之又少。 第一堂的超級入門課--Django介紹(就是這個框架MTV各自在做什麼)是有點失敗的。 而且 大部分的人在聽基本介紹的時候基本上都呈現呆滯狀態 。 於是我做了調整,做了一份直接切入要點的簡報,加上demo範例,並要求大家都帶筆電參與。而且考慮到大家的筆電一定不會先安裝python,要從頭開始安裝到起專案,實在有點不必要,就找了一個可以線上執行的網站repl.it。然後又起了一個粉紅泡泡:大家一定會跟著我一步一步做! 想也知道,不可能。 那天帶筆電參與的人不到1/5,甚至有人帶筆記本(我該欣慰嗎?) 一個慌張之下,整段教學時間都是看我一人表演。 結束之後被提了幾個問題,其中一個是讓我也問號滿滿... “用domain/cat/1只能找到特定的貓,那我怎麼知道那個貓的id是什麼,而且那我想next可以嗎?“ “所以你就要知道id,你也可以用名字或其他變數,至於next就是id=2之類的。“ “不是啊,我怎麼知道那個貓的id是什麼,所以用next可以嗎?“ “痾 next...?“(啊就是要知道id之類的啊啊啊啊啊 ) 然後我就會開始想一大堆,並試圖轉譯... 但當然以失敗收尾😕 教學也得看受眾的背景,你才能決定要用什麼話來說 然後我血條瞬間歸零,被打趴了。 如果這樣教不行,那我要怎麼做??? 左思右想,也去問意見,說是 直接帶範例會最有感 ,之後我在開發可以直接拿來用,比較輕鬆。(一個做起來放的概念) OKAY,我就做了一個連動選單和自動提示的輸入欄位。 並把他們的動作拆解,試圖帶領大家思考資料流向。順便也為不太懂網頁應用的人多做幾張基礎的知識介紹,例如http運作方式。 然後我再次開兩三堂課,依舊沒有人帶筆電來,我也很快地就把東西講完了,code也show過了。我還是感...

Django - CentOS 7 + Apache

每次要安裝東西的時候都覺得      很棒。 這次是把 Django 架在 CentOS 7 搭配 Apache 之上, 這種文章隨便搜都是一大把,無奈每個人的狀況都不一樣,何況有些都僅只有步驟,每次都讓我有"好像別人安裝都很順"的錯覺(當然這可能不是錯覺 ... )。 最後只好自己去看官方文件檔,但你知道的,都是密密麻麻的英文字! 我又有讀很快結果漏看某些重要訊息的毛病 ˊ_____>ˋ 好,我先弄了個VMware來做這件事。 首先裝python有兩種途徑,一個是從資源庫,一個是透過源碼。 前面的簡單,後面的就是自己對安裝的東西比較有掌控度,但yum不會記錄到這一筆安裝。 最最一開始,我就是按表抄課的走第二個方式,但途中坑很多,我是爬了又跌,跌了再爬阿... 這邊用 資源庫 安裝,沒什麼問題,很棒。 $ yum install -y https://centos7.iuscommunity.org/ius-release.rpm $ yum update $ yum install python36u python36u-libs python36u-devel python36u-pip 完成後可立即使用python3.6。👍 安裝virtualenv,先升級 $ python3.6 -m pip install --upgrade pip $ python3.6 -m pip install virtualenv 然後安裝Apache, 必須是2.0, 2.2 或 2.4版本。 再來是討m的mod_wsgi,有很多文章都用yum install mod_wsgi,如果你用的是python3開發,那就會變成天大的錯誤,跟我一樣卡在絕望深谷,因為它預設就是使用python2.7。 別管它了,有兩種安裝方式:源碼跟python包,我選源碼。 源碼   ** gcc for C compile $ yum install gcc $ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.5.tar.gz $ tar xzf 4.6.5.tar.gz $ cd ...

Django - 單元測試的小概念

第一次寫單元測試的時候,就是看著官方文件還有到處查來的技術文章吸收、了解並拼湊出測試的樣貌。 寫了兩個簡單需要使用資料庫的測試,但是出現問題了! 雖然翻遍google之後改寫解決問題了,仍然百思不得其解,決定上 Django users 求助。 (其實有時候我是有點懼怕問問題的... #畢竟被人嘴過不好好查#或是沒半個人回你#不知道自己是不是問了蠢問題或是沒有仔細檢查BUG) class FirstTest(TestCase): @classmethod def setUpTestData(cls): User.objects.create(username = 'johndoe', password = 'goodtobehere123') ... def test_case_one(self): user = User.objects.get(pk=1) # some assertions here class SecondTest(TestCase): @classmethod def setUpTestData(cls): User.objects.create(username = 'janedoe', password = 'nicetobethere456') def test_case_one(self): user = User.objects.get(pk=1) # some assertions here Q: 為什麼我單獨執行都不會出錯,一起執行後,SecondTest抱錯說找不到對應的User呢? 後來我改成這個樣子,就順順的。 class FirstTest(TestCase): @classmethod def setUpTestData(cls): cls.user = User.objects.create(username = 'johndoe', password = '...

Django - admin 的設定筆記

Django 內建 admin 的設定筆記 → 在某個資料表陳列頁面訂定顯示的欄位。 假設你想要自訂User的呈現資訊,那就得要使用BaseUserAdmin去創建新的UserAdmin。 要顯示那些欄位就必須透過 list_display 設定,賦予的資料必須是一個tuple,裡面就是每個欄位的名稱。 除了models內設定欄外名稱之外,也可以自己命名,然後在下面建立一個跟欄位名稱一樣的function並回傳你想要的內容,這樣就可以更客製化一點了! class UserAdmin(BaseUserAdmin): list_display = ('pk', 'full_name', '生日') # pk 就是 pk def full_name(self, obj): return obj.get_full_name() def 生日(self, obj): return obj.birthday.__format__('%Y-%m-%d') admin.site.unregister(User) admin.site.register(User, UserAdmin) ** 因為Django已經註冊了User,所以要先把User取消註冊,再註冊新的UserAdmin。 → 外鍵在新增/修改時會以選單的方式供選擇,要如何變更選項內容? class NewsAdmin(admin.ModelAdmin): def formfield_for_foreignKey(self, db_field, request, **kwargs): if db_field.name == 'author': # 選定的欄位 return AuthorChoiceField(queryset=User.object.all()) class AuthorChoiceField(forms.ModelChoiceField): def label_form_instance(self, obj): re...

交個筆友吧!老派的浪漫與科技之結合 - SLOWLY

圖片
快速又有效率是科技發展的一個重要目的,SLOWLY卻反其道而行,從名字上就能看出其特點的趣味性。 筆友是過去能與遠方陌生人交友的一種方式,後來也有一些找筆友的網路平台出現,我曾經成功交了一位來自印尼的筆友,透過e-mail互相寫信,但不知道為什麼他突然不回信了(哭)... SLOWLY是一個新概念的筆友平台,跟大多數的交友軟體很不一樣,主軸是模擬寄信到世界各地,而且會真的依照距離計算送信的時間,也可以蒐集各種不同地區甚至星座的郵票。 比較像是用心靈與彼此交流,非即時性的訊息也能降低一些緊張,而等待似乎也能更珍惜對方傳來的訊息。 老實說,我跟我的卡友也都走這種模式,甚至好幾個月才回覆一次,但依舊保持聯繫XD 官網 畫面設計簡單明瞭,主色採用鮮明的黃,不知道有沒有什麼特殊意義,而Icon就是簡單線條的明信片,一看就知道他的主題。 大頭貼有很多不同風格的插圖供使用者選擇,滿有趣的! 導覽列在最下面,最右邊的是關於個人設定還有一些數據。 要找筆友,有自動配對或是比較主動的去瀏覽筆友列表。 平台會根據你感興趣的話題及語言幫你媒合筆友,喜歡的就發信去吧 ! 我目前的筆友們(羞) 與某個小夥子的信件,跟telegram一樣,已讀了就雙勾勾。 來自各地的郵票, 每個郵票也都是小插圖,目前看來地區性的都是地標! 不過我是滿懷疑是否每個國家都有啦,因為現在大多以亞洲區國家為主呢。 這個App完全是因為"寄信"這個主題吸引到我了,我很愛寄信(怪人),雖然不像是能摸到的真實信件,也能清楚的知道信件抵達時間,但我也是比較喜歡這種慢慢來的交友方式啦。 究竟我的筆友們能維持聯繫多久呢?讓我們繼續看下去...

克服JS - this

this 在 Javascript 裡面是一個容易令人誤會,也十分令人困惑的字。 它在不同的位置上所代表的東西不一定是這麼直觀的,直白的翻譯 this 是這個的意思。 我一開始使用的時候,一直覺得它就是指當下把它包起的東西,物件也好,函式也好,但看來並不是這樣(笑)... function a() { console.log(this); } a(); // Window{...} function b() { this.test = 'hello'; } console.log(this.test); // 'hello' this指的是Global Object,而另一個函式內的this也指向的是同一個Global Object。 var c = { name: 'The c obj', log: function() { console.log(this); } } c.log(); // {name:'The c obj', log:function} 這裡的this則指的是c這個物件。 var c = { name: 'The c obj', log: function() { this.name = 'Updated c object'; console.log(this); } } c.log(); // {name:'Updated c object', log:function} 因此可以變動物件c內的name。 var c = { name: 'The c obj', log: function() { this.name = 'Updated c object'; var setname = function(newname) { this.name = newname; } setname('new name yes!'); console.log(this); } } c.log(); //{name:'Updated c object...

克服JS - 傳值和傳參考

神奇的傳值與傳參考,指的是JS在"複製"一個變數的時候,所採取的方式。 大多都是以下這種傳值的方式在運作。 //by value var a = 3; var b; b = a; a = 2; console.log(a); //2 console.log(b); //3 不過碰到了物件(包含陣列),就是傳參考了。 d與c都是代表同一個物件,所以更改其中一個,都會互相影響。 // by reference var c = { greeting: 'hi' }; var d; d = c; d.greeting = 'hello'; console.log(c.greeting); // 'hello' //by reference function changeGreeting(obj) { obj.greeting = 'Hola'; } changeGreeting(d); console.log(c.greeting); //'Hola' console.log(d.greeting); //'Hola' 那要怎麼只複製物件的值呢? 可以使用 b = Object.assign({}, c); reference: Udemy 克服JS的奇怪部分