2017年12月28日 星期四

黑心企業

https://www.recomtank.com/entry/fromblack

看到了這篇文章是在說管理從黑心企業轉職來的新人比想像中還要難
其實我完全可以理解阿XD
人在奇怪的環境太久真的會覺得那就是常態
就算其他人和你說真的沒關係你也不會相信
老實說我覺得其實我也有一點被洗腦了= =
畢竟曾經在一個"叫自己下屬在老婆待產的時候加班"可以當成武勇傳來講的人下面工作了一段時間
整個人都歪了(?)
有一陣子九點下班也覺得很早呢(?)
不過我還是被歸到不愛加班的那一群
雖然我個人無法接受"愛加班"這三個字的邏輯,我不覺得有人會喜歡加班(不想回去面對家庭的人不算)

管理職にとって、そもそもスタッフの残業時間はマイナス要因。弊社では、部署ごとの残業時間がみんなに共有されますし、基本的に定時上がりが求められています。
看到作者說對他們公司的管理職來說,員工的加班時間是負面要素.每個部門的加班時間都會公開,基本上是要求大家要準時走,有一種這真的是間好公司的感動= =

阿不過............我敢肯定在某些公司會變成大家在靠北加班少的部門,然後在那邊酸言酸語
至少我待過的公司有兩間都會這樣............我也不知道該說啥好= =
好像還有聽過因為有人靠北某部門都比較早下班,所以乾脆主管的會被移到下班時間開
有病嗎?可能有

2017年12月17日 星期日

真話

我覺得如果一個人一開始就是表明要抱怨的態度,通常聽的人也只會順著你的話搭腔,就算心裡知道你哪邊也很靠北也不一定會和你講,也沒有義務講。

除了真的很親近的人以外,我覺得很難去指正別人哪邊做不好,因為不只講真話的人少,願意聽真話的人也很少。講了會帶來負面效果的可能性實在太高了。

畢竟自以為自己可以聽真話的人不少。哪裡知道誰是真的誰是假的,又何必冒這個風險。

"我們都是很open mind的"(燦笑)
某公司某人的名言(攤手)

我想用ADB阿阿阿阿

https://www.orefolder.net/blog/2017/03/platform-tools/

因為想要手機系統可以變成日文所以需要用到ADB,上網找了一下方法最後是照上面網站講的成功的

https://developer.android.com/studio/releases/platform-tools.html
照自己的系統下載檔案,然後在自己電腦設定環境變數的地方把下載來的檔案位置加進去就好了

checkbox-inline第二行以後會往內縮



https://github.com/twbs/bootstrap/issues/5951
bootstrap的話想要把checkbox橫著排列的話只要加checkbox-inline就好了
只是如果不只一排就會變成像圖一樣第二排以後會往右縮
看起來只能自己在改一下css..

2017年10月22日 星期日

什麼叫做正常

很多東西在大部分的人心中都有一個標準,可能也說不出來規則,反正通稱就是"正常就是那樣啊"

不過要知道怎樣叫正常,首先你得處在一個正常的環境,不然有可能你覺得正常的東西,在其他人眼中根本是"黑人問號"。
比方我碰過有人覺得女生結婚後本來就要和男方家人一起住啊,然後問他為什麼也只會跳針"本來就是這樣",他的生長環境這樣叫做正常。在我心中叫做wtf。

又或者是你剛到一個新的領域,之前沒碰過的東西自然也不會知道什麼叫做正常,但因為對其他人來說太理所當然了,其實很難問出個所以然,只能等自己多撞牆幾次才能意會。

這種東西也適用在你剛到一個新環境的時候,總會有些東西不在規則內,但大家都習以為常,就你一個人搞不清楚狀況,然後你可能也只會得到"本來就是這樣啊"的回答,可能只是一些小事比方說某個名詞的用法啊,大一點到可能整個做事風格都和你以前的經驗不一樣。
好比我以前在某個網路快快信箱也大大的公司幾年後,完全忘了寄附檔要考慮一下大小,免得某些公司會收信收到想流淚(?)

.... 我也不知道我這篇到底在打什麼.....

2017年10月2日 星期一

2017年9月1日 星期五

無痛大腸鏡/胃鏡初體驗

上個月要健檢,想說好像該來鼓起勇氣做一下大腸鏡,但結果還是沒膽做一般的所以選擇了無痛大腸鏡,既然選了無痛後就又覺得,既然都會昏迷那我乾脆和胃鏡一起好了。

我是在北醫做的,其實做之前超緊張啊,但就結論來說,做無痛最大的考驗是在第二次的瀉鹽只能配白開水,下場就是我噁心想吐了好久,其實他就是鹽水的味道,比起甚麼藥水奇怪的味道還好入口,但人體天生就是不能接受短時間喝下那麼高鹽份的東西吧。結果做之前我問醫生為什麼第二次只能配水,他說只是因為健檢有其他驗血糖的項目。(我寧願血糖測不準也想要配飲料阿阿阿阿阿阿,反正血糖要再測簡單多了,外加以前不管哪家公司的健檢,都會有人完全忘了這件事然後吃了早餐才來)

第二大考驗就是在你做完腸胃鏡之前的空腹時間,這真的很難熬阿QQ對我來說餓還算可以接受,畢竟人是待在冷氣房裡,然後其實也沒做甚麼動作,但是水也不能喝真的很痛苦阿,由此可以知道水真的對人體超重要,我是從早上四點喝完第二次瀉鹽之後就不能再喝水了,然後等我進去做腸胃鏡已經要下午一點了...............我整個人都快乾了,照腹部超音波的時候醫生和我說腎臟水分有點少我當下只覺得"不要說腎臟,我 現在全身都快乾掉了"。

附帶說一下第一次我是配蘋果西打,雖然網路上很多文章不知道為什麼都是配沙士,但沙士本身就讓我會反胃.........................反正配蘋果西打也沒甚麼問題就是了。

除此之外過程就真的完全無感,人生中的第一次全身麻醉其實也蠻有趣的,因為真的很快就不省人事了,我只記得一開始說要打麻醉囉~之後我就覺得雖然我還醒著,但是頭腦有點"?????"的感覺,然後護士叫我翻個身......就沒有然後了,下此我醒了已經是做完後的事了,從打麻醉到昏迷有沒有一分鐘我都懷疑。然後因為昨天晚上睡很少,本來醒來之後還有點不想張開眼睛,但後來發覺快點醒來我才可以去吃東西。

準備過程:

恩,只能說如果工作上很需要付出勞力的人可能會覺得快死了,雖然如果只是低渣飲食的話還可以,你還是吃得飽,但是我收到的說明前一天差不多只能吃白吐司之類的,那種沒味道的東西就算你想多吃,你的身體也會開始想要拒絕,所以前一天其實吃的很少。

然後是吃瀉鹽的時間點,這其實是決定你晚上可以睡幾小時的主因,你當然可以不照單子上的時間點吃,反正你最後有清乾淨就好,但藥效沒結束前你也不用睡覺阿阿阿阿阿
所以能準時吃還是準時吃吧,我那天晚上只睡了3小時而已QQ

不過我本來以為吃了瀉鹽後會像拉肚子依樣慘烈,比方說拉到沒力,或是痛到莫名其妙,但結果都沒有,完全不會痛,也根本不用出力,所以很輕鬆(?),不會有像拉肚子那樣覺得拉完手都在抖了,或者覺得菊花再燃燒(?),頂多就是沒有搭配免治馬桶的話有可能因為擦屁屁擦太多次會痛。

其他:

其他就是一般健檢過程啦,唯一的差別就是因為之後要打麻醉,所以一開始抽完血後會留一根針在你手上等著之後打麻醉用,雖然說是軟針啦,但一隻針就這樣插在自己手上幾小時感覺還是怪怪的,更何況也不是完全無感,你還是可以隱隱感覺到有東西刺刺的。



2017年8月31日 星期四

2017 五倍紅寶石 summer intern心得

這是一個當初畢業後不想碰程式的人又突然被雷打到回來碰程式的旅程

其實當初已經在五倍上完rails課過了,但是自己再怎麼練習,和現實的世界還是有差距,還是有很多我自己再多自學碰不到的東西 ,所以我就投了這一次的實習.

這段期間碰過兩個案子,一個是短暫接觸了一下的司法陽光網法官評核系統,雖然只短短的丟了2.5個PR,但是因為碰到問題大家都很有耐心的回答我的問題,讓我覺得很安心QQ,而且加上案子本身比較沒有時間壓力,所以對我這個菜鳥來說也可以放心地放手去寫,而且看著公司裡很多人都要用英文和客戶開會更讓我覺得我可以都用中文溝通真好啊啊啊啊

結果當我第一次這樣想的下午就被說我要去接日本的案子了

和外國客戶這樣開會也算是我在這邊的新體驗之一,雖然以前的工作經驗也有需要和外國人開會,不過那是一群人對一群人,不是像現在這樣差不多是1對1的狀態,老實說以前那樣大人數開會偶爾還可以恍神一下,但是現在完全不行,所以每次開會前其實我都很緊張,不光是怕案子上有問題,也會擔心自己外語不夠好(我的案子是用日文),如果聽不懂或是講不出來怎麼辦.
其實每個禮拜都覺得像在走鋼索一樣,一下擔心開會,一下又擔心會不會來不及做完,加上我自己又是很容易緊張的人,所以整個壓力比上一個案子大很多.

不過,有壓力在還是比自學成長快多了,雖然我還是一團亂,老是各種卡住,老是一直被rubocop各種阻擋,雖然覺得這東西神煩,但也可以有效降低我code老是喜歡把一大串東西都塞在一起的壞習慣,寫的code和我房間一樣髒,畢竟我還處於一個反正我先把東西生出來,之後的事再說.

只能說我這兩個月充滿挫折,但學新東西如果不會感到挫折,要不是天生神力就是在騙人吧.
我已經忘記大學的經驗所以我沒辦法比較寫ruby on rails 和寫其他同類型程式語言的感覺差在哪,或是誰寫起來比較快,誰比較好學,程式哪會有好學可言,如果一個東西需要的預備知識越多,你想要加入他就會越困難,對我來說程式就是這個樣子.
我到現在還是有好多知識債沒有補完(而且因為會一直有新東西,其實永遠還不完吧?),而這些東西最主要的還是靠你自己去把他練起來,當然你的身邊有誰可以幫你會對你的學習進度有相當大程度的影響,因為也不是每個人都願意花心力在菜鳥身上,有些人只會想酸你,但不會想教你(這點應該不分領域都會碰到),但是在五倍紅寶石的這段時間,我可以確定如果我碰到問題大家一定願意幫我,這點對我真的幫助很大.(雖然該卡關多久再問人對我是個難題,而且問人其實也需要勇氣)

真的很感謝五倍紅寶石願意給我這個機會實習,而且讓我有案子可以接,還有感謝所有曾經回答過我的蠢問題的人,不管是正職還是和我一樣實習的人,雖然我常常都擔心我的問題讓人心裡變成【゚Д゚】你是在供三小?! ,不過大家都還是很有耐性地回答我.不管是我把PostgreSQL/yarn/rails/etc...用爛掉都願意救援我,大家都是好人\(@▽@)/


之前其他課程的心得請看前面的文章
五倍紅寶石- 深入淺出立即上手的HTML網頁設計(Amos老師)


2017年7月30日 星期日

五倍紅寶石- JavaScript & jQuery 前端開發入門實戰 (Kuro老師)

https://5xruby.tw/talks/JS-jQuery-2017-7
這門課程將透過 jQuery 這套跨瀏覽器的 JavaScript 函式庫來簡化 HTML 與 JavaScript 之間的操作,即使學員在不熟悉 JavaScript 這門程式語言時,也能打造實用的互動效果,進一步認識 JavaScript 與前端開發的眉眉角角。


其實我很害怕任何JavaScript相關的東西,因為有很挫折的經驗囧
雖然在那之後自己有多看一下相關的東西,不過有點支離破碎
趁這次正好好好重頭有系統的研究一次
不然想當年那個搞不清楚東南西北,然後哪個是JavaScript哪個是jquery都搞不清楚的時候真的很撞牆
或是從最基本一開始上課就有講到的,如果不透過var去宣告變數會讓他變成全域變數,成為window成員屬性之一 (嗯~想當年的我就是連這個都不知道)
第一堂課先從JavaScript最基本的語法講起,然後再講到DOM,也講到了要如何用jquery和JavaScript選到自己想要元素,也有出練習題目讓大家可以實作回答問題.
最後也有講到一些JavaScript讓我覺得很謎的部分,比方說是數字又不是數字的NaN
你明明就Not a Number但是卻又是數字
typeof NaN ==> "Number"
又或者是為 JS 隱含 動轉換型別的特性,比較數值時, 建議 採 === 取代 ==
JavaScript 是個事件驅動 ( Event-driven ) 的語言
這是上課後期講的東西,這其實也是讓我對js覺得困惑的東西,以前常常我以為他應該要被驅動了,結果一點反應都沒有.
preventDefault什麼的對我來說也和浮雲一樣

下面這東西也是原本我搞不清楚的用法,為什麼有時候大家要直接指定到要做操作的元素,有時候卻要指定到上一層去接收
這點課程裡面有特別介紹,因為在網頁載入完成後才產生的元素,先前綁定的事件是無法被觸發的。
所以必須要利用js 事件會向上傳遞的特性,先綁定到 元素上,再由 元素將事件指定給新 成的元素。

$(".del").on('click', function() {
  $(".wrap").remove();
});
$(".wrap").on('click', '.del' ,  function() {
  $(".wrap").remove();
});

當然也有講到實作上常用到的ajax,一開始先從簡單的範例開始,帶著我們練習了從randomuser.me上抓資料回來更新自己的網站
課程的最後更是帶大家做了一個配合google map和data.taipei上的YouBike資料實作了一個可以顯示哪邊還有車可以借的網站

課程的最最後有講到一些js更謎的部分
js裡面可以允許變數先使用在被宣告,函式宣告與變數宣告都會被提升,但函式的優先序會比
Immediately Invoked Function Expression,匿名且立即被呼叫的 function
為 延長外部變數的生命週期,在 function 中定義的 function,內部的 function 可以存取外部 function 定義的變數, 這樣叫做 Closure

我覺得我上過這一輪之後比之前更了解我在寫js的時候我到底在幹嘛,而不是只是貼上別人說這樣子ok的程式碼,我很希望課程可以再多幾堂聽到更多東西XD

2017年7月16日 星期日

五倍紅寶石- 深入淺出立即上手的HTML網頁設計(Amos老師)

雖然我是資管系畢業的,但是因為畢業之後就沒有再碰相關科系的東西,所以連最基本的HTML都差不多忘光了,更不用說是CSS……
都不太想提自己是資管了囧

而且其實我是很害怕前端的,以前專題的時候常常實際的外觀和我希望的外觀不一樣,我只是想要移個位置為什麼那麼難QQ
常常都在想要是我可以伸手去移動網頁上的東西就好了(想太多)

外加以前常常是自己亂用亂用,碰到問題上網google把大家寫的解法都試一下看哪一個有用就用哪一個,但是因為不了解那些css真正的意義,
所以很容易之後繼續又犯一樣的錯誤
老師上課的時候強調了好幾次我們要去理解它背後的邏輯,這樣之後自然就會通了
我覺得這部分是線上教學網頁比較少解說的部分

特別是對於float或是position,這兩個老實說我沒有真的搞清楚他到底是怎樣運作的,一直以來我腦中都是像下面這樣
float? 你是要飄去哪啊
position? 一個路痴哪會知道什麼position(?!)
特別是position,對我來說真的太謎了,但配合老師的講解,加上課堂上的練習,總算沒有之前那麼搞不清楚頭緒,下面是我上課的時候寫的memo


position

absolute

  • absolute
  • fixed
  • relative
    會先從資料流當中抽離出來獨立一層
    1. 先找父層有沒有上面三種定位設定任何一種
    2. 有找到任何一種定位設定就靠在該層上
    3. 若所有父層都沒有設定就設在視窗

relative

因為不會抽離出來獨立一層,如果只設定position: relative;然後沒有設定任何位置的話不會有任何作用.
設定位置後會跑到別的地方,但本來原有的位置依舊是繼續佔著

      position: absolute;
      left: 0;
      top: 16;

fixed

直接找視窗位置


還有一個其實很基本,但我一直忽略他的事實,就是…..網頁上的元素其實都有分成是block還是inline兩種

顧名思義可以和大家排在一起的就是inline(ex: span/ a /img ),一個人就佔掉整行的是block(ex: p/div)
inline預設沒辦法設定寬度/ padding上下/margin上下,可以想成只有長度沒有厚度的東西
但傻傻的我,以前常常想要去設定inline元素的寬度之類的(遠目)
這就是看到什麼就用什麼,但沒想過這些東西的本質的後果orz
當然搞清楚之後對於css的display設定成block/inline/inline-block會影響到什麼東西也更理解了

當然老師有說,切版是很吃經驗值的東西,而且很多東西還是要多用才會熟悉,才不會忘掉,因此之後的練習是很重要的

最後,html/css雖然不用一開始就面對讓人痛苦的環境設定問題,但是一個用的順手的編輯器是很重要的
自己編輯器是用sublime,老師有投影片介紹一些可以讓寫html/css更方便的功能
https://www.slideshare.net/banPrint/sublime-text-51689543
覺得ctrl+w可以幫我把tag外面再包一層tag非常方便,不然以前都要自己加然後再整理一下縮排,很麻煩

2017年7月13日 星期四

devise3新增欄位

    devise_parameter_sanitizer.for(:sign_up) { |user_params| user_params.permit(:email, :password, :password_confirmation, :name, :school) }
devise_parameter_sanitizer.for(:sign_up) << :name

只是靠北一下自己之前只會加一個欄位進去但是不知道怎樣加一個以上進去orz

Written with StackEdit.

假裝看不見的capybara

昨天被水豚君搞到快崩潰QQ
只不過想要讓他幫我選個下拉選單怎麼覺得人生好難
就是下面這個樣子的select,但是卻一直跳error說找不到

 Capybara::ElementNotFound: Unable to find select box "court_observer_school"

上網google一下感覺問的人還蠻多的,不過有回說有找到答案的好像沒有很多?可能大家狀況都不一樣

  • 別人的狀況:
    option裡面的值是model裡面撈出來的,但是rails裡面test的model是分開來的,所以抓不到東西
    但我的不是啊啊啊啊啊,所以這不是我要的答案
  • 別人的狀況2:
    其實你html裡面真的沒有那個東西吧?!
    不過我有確定我測試在跑的時候html真的有把select生出來,可是水豚君就是當他不存在QQ

最後聖杯君(?!)幫我找到了原因
先說結論:

  • 我搜尋的select court_observer_school是個display: none的東西,水豚君預設是看不到他的
  • 我在網頁上看到的select其實是js產生的,所以如果你把developer
    tool打開來的話,選下拉選單會看到有東西閃一下(就是下面那個div.chosen-container的部分),不過水豚君是管不到他的

解決方法,加下面這行讓他看得到隱藏起來的東西

Capybara.ignore_hidden_elements = false

不過因為這是把預設值改掉,用完要記得改回來
不過因為這是把預設值改掉,用完要記得改回來
不過因為這是把預設值改掉,用完要記得改回來
(很重要所以講三次)
總之就是一個因為不熟水豚君&沒發現選單是js產生造成的悲劇………

<div class="form-group select optional court_observer_school">
    <select class="select optional form-control" name="court_observer[school]" id="court_observer_school" style="display: none;">
        <option value="">目前就讀學校(選填)</option>
        <option value="A學校">A學校</option>
        <option value="B學校">B學校</option>
        <option value="C學校">C學校</option>
    </select>

    <div class="chosen-container chosen-container-single chosen-container-active" style="width: 296px;" title="" id="court_observer_school_chosen">
        <a class="chosen-single">
            <span>C學校</span>
            <div>
                <b></b>
            </div>
        </a>
        <div class="chosen-drop">
            <div class="chosen-search">
                <input type="text" autocomplete="off">
            </div>
            <ul class="chosen-results">
                <li class="active-result" data-option-array-index="0">目前就讀學校(選填)</li>
                <li class="active-result result-selected" data-option-array-index="1">A學校</li>
                <li class="active-result" data-option-array-index="2">B學校</li>
                <li class="active-result result-selected" data-option-array-index="3">C學校</li>
            </ul>
        </div>
    </div>
    <label class="select optional control-label control-label" for="court_observer_school">學校
    </label>
</div>

Written with StackEdit.

2017年7月3日 星期一

rspec- assigns

    it "assigns the requested contact to @contact" do 
      contact = create(:contact)
      get :show, id: contact
      expect(assigns(:contact)).to eq contact
    end
    def set_contact
      @contact = Contact.find(params[:id])
    end

可以用來檢查controller裡面的實體變數,上面那個的話就會檢查show裡面的@contact是不是等於我們傳給他的contact
然後我常常忘了後面有s…

Written with StackEdit.

2017年6月28日 星期三

'load':cannot load such file

跑個rspec在那邊error那麼久原來只是不知道為啥我跑到spec資料夾下執行 到底什麼時候手滑跳到那邊的.......

2017年6月18日 星期日

除毛經驗

從小我就是手腳毛比一般女生多,我姊也這樣,所以大概是遺傳?
等到開始愛漂亮,外加我又愛穿裙子,除毛一直都很困擾我。

用刮的? 根本用不乾淨啊,毛細一點的地方,比方說大腿用刮的ok,但是小腿等級的就還是會因為毛根看起來黑黑的,腋下也是悲劇。雖然這的確是最簡單也不痛的方法,也不會毛髮內生。

用拔的?  當初有買電動除毛器,一開始是真的用得很乾淨,但是腋下不是平的很難用,用小腿是ok,但是之後一直都會毛髮內生很煩,有時候為了把長不出來的毛用出來反而讓自己色素沉澱的地方變多,而且太短的毛拔不掉,所以很難完全都用拔的來除毛,結果就是還是很麻煩,重點是很痛。

除毛海綿 我不知道這東西能除甚麼毛............一點用都沒有。

蜜蠟貼片 我怎麼用就是效果不佳

除毛乳液 我皮膚很敏感不敢用

於是長大之後自己工作有錢了就開始想乾脆去雷射,但是有時候看到被意外灼傷的新聞又覺得很可怕,不過看看網路上每個去雷射過的幾乎又都覺得自己當初應該早點做,就想說還是先去體驗看看。

就結論來說...

我也覺得當初應該早點做的。

真的煩惱少很多,首先雖然不會完全一根毛都沒有,但剩下那些用刮的就好了,也比以前細,數量也少很多,就算只用刮的也不會像以前依樣看到還是會覺得黑黑的。
外加我雷射完本來小腿和腋下的色素沉澱也消失了,大概是因為我做的雷射本身也有美白效果?(不確定,但沉澱真的沒了)

缺點就是..........好痛QQ雖然隨著毛越來越細越來越少會越來越不痛,但小腿正面真的痛,特別越下面的地方也越痛(用拔的時候也是這樣)
腋下當初雖然也覺得痛,但和小腿比起來...真的不太痛.........................................
網路上那些覺得雷射小腿不痛的人真的很強,而且我還有上麻藥。
當初我還有問醫生哪一種雷射除毛比較不痛,他也是說都不痛冏,但我強烈認為他生過小孩所以才覺得都不痛...


但是勒,其實我不確定我當初用的機器到底是哪一種,因為我忘了問(?!)
不過大概是二極體雷射(機器名稱就不可考了)
亞歷山大需要留一點毛去雷射,而且當場就可以看到毛髮燒焦,但我的完全不是這樣,老實說第一次打完我根本看不出來效果,第二次以後才開始覺得毛越來越少。
脈衝光,聽說這個很不痛,和我的感覺完全不一樣,而且應該沒有醫生會打脈衝光然後不戴護目鏡的(幫我除毛的醫生我只看過一個人有戴護目鏡..)
所以就只剩下二極體雷射了XD,會上凝膠,除之前要先刮毛,可以美白,怎麼看都是它吧。
雖然很痛,但我覺得真的沒有後悔,現在超想推薦人去雷射,不要在那邊自己拔到毛髮內生了XD
然後最適合做的時間其實是冬天,因為通常一個月才會打一次,你買6次的話,夏天打完就冬天了.....




2017年6月9日 星期五

痛死人了

或許從星期一出門的時候發現鞋子裡有釘書針就是一個"sign" xd

結果走沒多久腳就被自己指甲磨到流血,明明摸一摸覺得不長阿,而且前幾天都好好的。

結果之後莫名的下腹部痛真的讓我覺得我是不是要暈倒在路邊了,至從生理痛會吃止痛藥之後好久沒有過那麼痛的感覺了,重點是我不知道原因,感覺很可怕阿。
雖然好不容易忍痛撐回家,但是真的覺得眼前快一片黑了,而且當下身邊又沒人,覺得好可怕。

還好大概一個小時後就不是痛的最高峰了,但還是痛,只是我不會擔心我會暈倒,但走路還是挺不直,肚子還是不能出力,所以也不能笑,一笑就會用巔峰期的痛度,因為這樣晚餐也沒胃口,吃了一點點就吃不下了。

後來還發現自己身體好熱?!但是量體溫也沒有真的到發燒,大概就是比我平常高一點點,只能說人是恒溫動物,差一點點感覺就差很多,最後因為又熱又痛所以吃了止痛藥,藥效發揮的時候真的是我那一天最舒服的時候,不熱也不痛了(另外默默覺得這種情形感覺到藥效的時間好像比生理痛快很多?特別是退熱這部分,只是退熱沒有撐多久)

忍痛是很消耗體力的事,我以為理論上我晚上應該會很好睡,結果沒有.... 一點睡到快三點我就醒了,因為不舒服也很難再入睡,就這樣醒到八點...... 人生中第一次有這種經驗,還好那天可以讓我繼續睡,雖然也十二點就醒了......

之後雖然好了很多也可以出門,但是還是覺得好像哪裡怪怪的,不過至少肚子用力也還ok,但一直到星期五我才覺得身體恢復到和以前一樣了。
(然後這幾天還多了胃痛...... )

總覺得應該要看個醫生的...... 好慘的一個禮拜。

2017年6月1日 星期四

生理用品.....

雖然至從某天明明很熱但我家還是不准開冷氣害我隔天屁股過敏之後我主力就變成棉條了,不過有時候還是會用到衛生棉,比方說剛洗完澡不好放棉條的時候,或是睡覺的時候(因為棉條對我第一天晚上擋不了一個晚上,所以會變成棉條+衛生棉,為什麼不直接用棉棉就好??因為黏黏又溼溼的很難過,兩個一起用其實衛生棉只會髒掉一點點而已,整體還是很乾,也不會再用髒床單,外加有兩個東西幫你擋,不用擔心睡到一半要起床換生理用品,可以卯起來賴床,不過前提是我有吃止痛藥啦,不然半夜還是會自動醒來.)

然後某次看包裝漂亮就買了蘇菲的魔法口袋,可以從連結看到他真的是體積比較小,但是....他其實比一般衛生棉多折了左右一道,對我來說因為主力不是棉棉,所以體積小對我來說不重要,反正我根本不會帶你出門啊,但是摺痕多某種程度要更小心黏好,然後穿小褲褲的時候他不小心摺起來了囧,所以以後應該不會再買.

液體衛生棉某次也買了體驗包,因為看FB廣告下面的心得都說很好用,但後來看一下別的地方的心得發覺,根本沒有寫的那麼好,有人還說會回滲(驚),而且講真的,就連護墊都可以感覺到存在了,更何況衛生棉.......我是不覺得有比一般的好用就是了.

2017年5月31日 星期三

モノクローム・サイダー あの日の君とレトロゲームへ

モノクローム・サイダー あの日の君とレトロゲームへ

超好看阿阿阿阿阿
身為一個阿宅這根本是夢想中的愛情故事(?!)

內容是在講作者當初是怎樣透過電動認識現在的老婆,這本書用了很多電動梗來形容各種狀態,FF/DQ或是neogeo CD之類的都有出現過,看了我都想要買wonder swan玩gunpey了(算是男女主角的定情遊戲吧)。

當初在看的時候我一直都在想說~不知道會不會有女神轉生的梗呢~結果在最後的最後有出現,我好感動,嗚嗚嗚嗚...

裡面用詞也都很簡單,每個章節也都很短,日文不用多好應該也可以看得懂,總之超好看阿阿阿

第三次上五倍紅寶石rails課- end

結果後面的筆記被我拋棄了orz
(總之可以直接看龍哥寫的)

不過還是想說打一下上課的時候腦中浮現的以前的記憶。

雖然說我是資管畢業的,不過當初隔了那麼久才又去碰這些東西,其實真的很痛苦(也不是說現在就很上手啦XD)

首先因為完全沒有自己debug的能力,加上我又是打錯字之神,常常不小心就把程式炸了,雖然會試著想要自己修好,但這段時間老師講的東西當然就沒有進到我腦子裡去了。最後就是一直從github上抓code下來.....

還有一個很根本的問題,最一開始的時候連我現在要動的檔案在哪裡我都需要時間想一下阿阿阿阿,就算我知道我現在要改view,可是我可能要找一下他到底人在哪裡。

外加有一個是我到現在還是常常搞不清楚的,我其實記不起來現在這個變數裡面到底放了啥
x = 3這種我記得起來,但如果裡面是hash又array之類的我常常忘記現在裡面這種東西結構到底是這樣,雖然印出來看一下就知道了,可是好像其他人都記得起來QQ,不過我本人內建的ram很少這我倒是很有自知之明。




2017年5月24日 星期三

HiNative Trek快兩個月感想

https://trek.hinative.com/ja/trek/price

月費9800jpy
Daily English lessons for the price of a cup of coffee
(但我不喝咖啡)

之前一直都是加入英文會話型的服務,如果是要練會話當然還是線上會話比較實用,但就是要固定時間上線很麻煩,就算有些服務主打你可以臨時預約在線上的老師,可是通常比較好一點的老師的預約都是滿的,所以其實我也不太愛臨時找老師的形式。

外加其實一般線上課程的教材還是比較"課本",相對之下比較不貼近現實,想說試一下hinative的新服務好了,(但現在還沒有中文版,所以題目是日文的,而且當初我因為這樣子題目出不來呢www)

每個月的主題都不一樣,四月的時候是email,五月是面試,出的題目都很貼近現實,而且沒有標準答案,老師也都是依據你給他的答案幫你修改。(當你送出答案會馬上看的到標準解答,但老師會在依你的句子幫你修改)
星期一到五每天都會有一道題目,照它們網站所講的,從星期一到五出的問題會越來越複雜,你要甚麼時候回答都可以,累積到一定問題再一起回答也可以。
回答方式是text+audio(但我很少錄音就是了....因為常常是在旁邊有人的情況下回答)

題目大概像下面這樣(copy官網)
Type
Content
Sample
Level
Short Essay
Translate the following sentence into English.
御社のプロダクトはとても興味深いです。ぜひまた後でもっと詳しくお話を伺いたいのですが。
1
Q&A
Answer the following question in English.
Tell me more about what your company does.
2
Long Essay
Translate the following sentence into English.
業務を効率化することにより貴社の資金を大きく節約できるサービスを提供しています。
3
Essay + Q&A
Translate the following question into English and then answer it.
御社のサービスを導入すると、ユーザーのリテンション向上に、どういう風に効果がありますか?
4
Special
Reading & Listening Comprehension, etc.
This is a chance to review what you've learned throughout the week.
初対面の人に、あなたの会社の製品について説明しましょう。
???

不過一開始在email主題的時候我有點困惑呢,畢竟是要日翻英,但日文有一些其實翻不成英文的用法,比方說:
"お世話になります。"
恩...恩...恩??!!
這句的英文是甚麼??
後來發現範例回答的英文也沒有翻這句XD
之後我就無視這些其實英文信不太會這樣講的日文寫法了

另外一個每個月主題是固定的,碰到自己不太有興趣的主題不知道有沒有解決方法?暫停一個月?

p.s另外希望可以照主題來篩選出問題,依照現在的設計等加入時間變久出的問題變多,應該會不方便找到以前回答過的問題

2017年5月23日 星期二

還有說新手2,3個月就學很好的,通常那個人都不是真的新手。

2017年5月22日 星期一

不知道標題要叫啥

如果是說2個月學到別人2年的功力當然擺明是騙人的,不只是程式,所有東西都是這樣。除非哪天可以轉移別人的記憶。

但下面才是我真的想講的,
我覺得有一些人其實是看所有付費的課程不爽。(不分實體或是線上)

當你想付錢上任何的課,上網問值不值得,都會有人和你說不需要花錢,網上有很多免費資源。當然免費資源多是事實,
但要一個完全的白紙靠網路上任何免費的資源自己自學,其實有點殘忍。(天賦異稟的人除外)

如果曾經碰過好老師,你會知道有沒有一個會帶會教的人來講解差別有多大。(包括學校裡的),比方以前一樣都是會計,我碰過三個老師,真的上課感覺差很多。應該大部分人在當學生的時候都體會過這種感覺吧?

而且一個完全沒有頭緒的白紙,真的會知道要如何開始嗎?恐怕很難。
一開始可能興緻勃勃的航向偉大的航道....... 然後很快就沉船了(合掌)。

因為一開始真的很無聊,而且會不知道這些東西和自己腦裡想要做的東西關聯性在哪,書上文字又單調,可能你一行行看過去,然後也跟著打一打,還是滿頭問號。
我認為有老師在比較可以減少前面摸不著頭緒的情形。

而且有老師就代表你會有同學,就算是線上課程,通常也會有討論區。當然你要去外面任何一個網站問也都可以,但是其實感覺是不一樣的,對我來說在課程討論區裡面問問題的壓力是很小的,因為我是學生,我就是不懂才會花錢上你這個課,問的問題就算很淺也是理所當然。

但是,如果是外面網站呢?就算沒碰到酸民好了,真的問題太簡單也有可能被說自己好好會去看書,或者這google一下就有了。這當然有可能是事實,可是新手會需要人解決他心中那些在老手眼中看起來淺到不行的問題也是事實。

如果什麼問題都是得到"你google就好了",這其實很讓人受挫,會讓人開始覺得"是我比別人笨嗎?是只有我才會有這些問題嗎?"
但是如果是課程的討論區,你會很容易發現其實大家一開始的問題都差不多,不是只有你一個人在同樣的地方卡關。這點我覺得在最一開始的時候是非常重要的事。

最後,有些人會說不會自學才需要那些線上或實體的課程,....... 這兩回事好嗎?需要人領進門的不代表他稍微自己有點底之後不會自學。

2017年5月19日 星期五

hinative trek

https://trek.hinative.com/
老實說出的題目都很實用,什麼時候回答也都是看自己很自由,不過主題是一個月換一次
如果某個月的主題自己沒興趣的話好像有點麻煩

2017年5月14日 星期日

第三次上五倍紅寶石rails課 5/14

service

要使用別的功能的時候可以把method定義在service裡面
不過這邊其實我沒作筆記囧
參考一下

routes

後面接path的話可以方便改變網址,而且不用特別改link_to裡面的path

  resources :candidates, path: 'users'
        Prefix Verb   URI Pattern               Controller#Action
          root GET    /                         welcome#index
    candidates GET    /users(.:format)          candidates#index
               POST   /users(.:format)          candidates#create
 new_candidate GET    /users/new(.:format)      candidates#new
edit_candidate GET    /users/:id/edit(.:format) candidates#edit
     candidate GET    /users/:id(.:format)      candidates#show
               PATCH  /users/:id(.:format)      candidates#update
               PUT    /users/:id(.:format)      candidates#update
               DELETE /users/:id(.:format)      candidates#destroy

:id

其實我最一開始不知道什麼時候才要在path後面加東西,後來才瞭解到網址後面有id的都需要,其實寫candidate.id也是一樣的,但因為rails會幫忙把id抽出來,所以寫短一點的就可以了
  <% @candidates.each do |candidate| %>
    <li>
      <%= link_to candidate.name, candidate_path(candidate) %>
      <%= link_to '編輯', edit_candidate_path(candidate) %>
      <%= link_to '刪除', candidate_path(candidate), method: :delete, data: {confirm: '刪除嗎??'} %>
      <%= candidate.party %>
      <%= candidate.age %>
      <%= candidate.politics %>
    </li>
  <% end %>
candidate_path(candidate)可以只寫candidate就好,只把物件給rails也會自己判斷,但我個人會因為搞不清楚我在幹嘛,所以會寫完整的。(編輯的path不能改)
實際上html會變成下面這樣,都會變成data-*, 所以method其實放在data裡面也可以(只是也沒必要),或者想要另外傳一些資料進去的時候也可以寫在data裡面
<a data-confirm="刪除嗎??" rel="nofollow" data-method="delete" href="/candidates/1">刪除</a>

path

因為下面那幾個的path是共用的,所以刪除資料的時候記得後面method要說是delete,不然會跑到show,這也是我當初常用錯的東西
     candidate GET    /users/:id(.:format)      candidates#show
               PATCH  /users/:id(.:format)      candidates#update
               PUT    /users/:id(.:format)      candidates#update
               DELETE /users/:id(.:format)      candidates#destroy

find / find_by

Candidate.find_by(id: 1)
Candidate.find(1)
上面這兩個找得到id的時候得到的結果是一模一樣的,但找不到的時候的情形會不一樣,看你喜歡nil,還是喜歡處理例外
會回傳nil
Candidate.find_by(id: 999)
丟給你ActiveRecord::RecordNotFound: Couldn’t find Candidate with ‘id’={:id=>999}
Candidate.find(999)

edit的form

和new是可以共用的,而且畫面上會出現已經填好的資料(驚嚇),因為rails會去判斷你丟給form_for的是新的物件還是從資料庫抓出來的
(不過前提是要new和edit的變數名稱要取一樣的)
然後生出來的html長這樣,雖然method是寫post,不過因為是要更新資料,所以會偷偷幫你模擬用patch(瀏覽器實際上沒有支援patch,所以都是用模擬的)
<form class="edit_candidate" id="edit_candidate_1" action="/candidates/1" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="_method" value="patch">

partial

盡量不要在partial裡用實體變數

比方說最一開市像下面這樣子寫
# new / edit
<%= render 'form' %>
#_form.html.erb
<%= form_for @candidate do |f| %>
  姓名: <%= f.text_field :name %><br/>
  政黨: <%= f.text_field :party %><br/>
  年紀: <%= f.text_field :age %><br/>
  政見: <%= f.text_area :politics %><br/>
  <%= f.submit %>
<% end %>
雖然上面那樣也會動,因為他會自己去抓@candidate,但是如果controller裡面變數名稱不一樣就炸了,而且這樣子寫比較不好瞭解到底是在幹嘛。
比較清楚一點的方法是自己丟變數給他
#view
<%= render partial: 'form', locals: { candidate: @candidate } %>
#也可以這樣就好
<%= render 'form', candidate: @candidate %>
#_form.html.erb可以拿掉@了
<%= form_for candidate do |f| %>
  姓名: <%= f.text_field :name %><br/>
  政黨: <%= f.text_field :party %><br/>
  年紀: <%= f.text_field :age %><br/>
  政見: <%= f.text_area :politics %><br/>
  <%= f.submit %>
<% end %>

那如果是下面這種partial要拿掉@呢
<% @candidates.each do |candidate| %>
  <li>
    <%= link_to candidate.name, candidate_path(candidate) %>
    <%= link_to '編輯', edit_candidate_path(candidate) %>
    <%= link_to '刪除', candidate_path(candidate), method: :delete, data: {confirm: '刪除嗎??'} %>
  </li>
<% end %>
那render就改成這樣,然後上面把@拿掉就好了
  <%= render 'candidate', candidate: @candidates %>
但是這樣只是複製code貼上到另一個地方沒什麼意義,其實有辦法讓你連<% @candidates.each do |candidate| %>都不用寫
<%= render partial: 'candidate', collection: @candidates %>

#或者下面這樣,但因為精簡過頭我會不知道我在幹嘛,所以我不愛,記得第一次看到的時候整個滿頭問號

<%= render @candidates %>
#裡面一定要是單數candidate
<li>
  <%= link_to candidate.name, candidate_path(candidate) %>
  <%= link_to '編輯', edit_candidate_path(candidate) %>
  <%= link_to '刪除', candidate_path(candidate), method: :delete, data: {confirm: '刪除嗎??'} %>
</li>

view helper

所有的helper其實都會被載入,那如果不同helper裡面有同樣名稱的method會發生什麼事?
雖然大家都會被載進來,但是畢竟載入還是有先後順序的,而順序是照英文字母的排列a..z,所以放在檔名開頭字母順序比較後面的那個method會被執行

自訂action member / collection

有member和collection兩種方法,差別是前者會幫你帶id進來,後者不會
Rails.application.routes.draw do
  root 'welcome#index'

  resources :candidates do 
    collection do 
      post :vote1
    end

    #post :vote1, on: :member 其實只有一個的話這樣也可以寫
    member do 
      post :vote2
    end
  end
  # post "/candidates/:id/vote", to: 'candidates#vote'
end
#結果
vote1_candidates POST   /candidates/vote1(.:format)     candidates#vote1
 vote2_candidate POST   /candidates/:id/vote2(.:format) candidates#vote2

關聯

下面兩種寫法都可以設好Foreign Key,但我偶爾references會忘記加s=.=
另關聯其實是在model裡面做的,並不是在表格裡面做
#這兩個是一樣的
rails g model VoteLog ip_address candidate_id:integer
rails g model VoteLog ip_address candidate:references
如果是用下面那種寫法的話會幫你加以下的東西
class VoteLog < ApplicationRecord
  belongs_to :candidate
end

has_many

慣例上has_many後面會用複數,但其實用單數也可以正常跑(但是打一串完全無關的字是不行的),因為他會去找model名字或是類別,只是就會用動,還是照慣例走吧
#其實都會動
has_many :vote_logs
has_many :vote_log

counter cache

http://railsbook.tw/chapters/14-crud-part-2.html#step14-counter-cache
一般來說想要找出每一個candidate的vote_log的時候會需要去一筆筆的sql count查詢,像下面這樣
  Candidate Load (0.2ms)  SELECT "candidates".* FROM "candidates"
   (0.3ms)  SELECT COUNT(*) FROM "vote_logs" WHERE "vote_logs"."candidate_id" = ?  [["candidate_id", 5]]
   (0.3ms)  SELECT COUNT(*) FROM "vote_logs" WHERE "vote_logs"."candidate_id" = ?  [["candidate_id", 6]]
   (0.7ms)  SELECT COUNT(*) FROM "vote_logs" WHERE "vote_logs"."candidate_id" = ?  [["candidate_id", 7]]
   (0.1ms)  SELECT COUNT(*) FROM "vote_logs" WHERE "vote_logs"."candidate_id" = ?  [["candidate_id", 8]]
效能可能會比較不好,這時候可以用counter cache
先在Candadite新增一個欄位叫vote_logs_count
class AddCounter < ActiveRecord::Migration[5.0]
  def change
    add_column :candidates, :vote_logs_count, :integer, default: 0
  end
end
rails db:migrate之後在model裡面改成下面這樣

class VoteLog < ApplicationRecord
  belongs_to :candidate, counter_cache: true
end
然後在view裡面把count改成size,重新整理會發現sql變成只需要下面這樣
  Candidate Load (0.5ms)  SELECT "candidates".* FROM "candidates"

reset_counter

但會發現之前的票數不見了?!
可以直接進rails console去用,也可以寫個rake來執行
namespace :db do 
  desc "重置counter cache"
  task :reset_counter => :environment do 
    Candidate.all.each do |candidate|
      Candidate.reset_counters(candidate.id, :vote_logs)
    end
  end
end
執行之後票數就會正常了。
Written with StackEdit.

2017年5月12日 星期五

第三次上五倍紅寶石rails課 5/12

http://railsbook.tw/chapters/13-crud-part-1.html
這次的課有點不知道要怎麼有條理的做筆記,所以只記了一些我當初最一開始搞不清楚的東西比方說裡面什麼東西都沒有可是會動的action,或是不知道打哪來的params,還有充滿謎的form_for

想當初我第一次看controller的時候都很疑惑為什麼有些裡面明明什麼都沒有寫,可是為什麼還是有作用,後來才知道有些是因為before_action做了,外加預設都會幫你去render同名的view出來
#像這種不知道幹嘛的action
  def show
  end
那如果今天我把上面的index action也砍掉會發生什麼事呢?
答案是什麼事都不會發生XD
他還是會顯示出index(驚)
原因是因為雖然你沒有action,但是他還是會繼續去找同名的view
所以如果今天一個action什麼特別的事都沒有做,是可以不寫action的。
(不過我應該還是會照寫XD)
另外public資料夾裡面的檔案的優先權會在最前面,因為他不需要經過routes,如果你今天放一個index檔案在裡面,你在首頁看到的會是public裡面的index,而不是view裡面那一個

params

  get "/candidates/:id", to: "candidates#show"
比方routes像上面那樣子寫的話,一開始的時候其實我知道params[:id]可以抓到id,但我並不知道那個id到底是哪來的,為什麼這樣子就可以抓得到,等我發現原來是url裡面有的已經是又過一陣子的事了….(遠目)
<ActionController::Parameters {"controller"=>"candidates", "action"=>"show", "id"=>"1"} permitted: false>
有一個是我這次上課才知道的事,像上面這種你會發現不管是params[:id]還是params[“id”]你都可以抓到1,這是因為rails有特別做一些處理讓你可以不管是字串還是symbol都抓的到id。
不然原本ruby的hash用字串或symbol是當成不同的key,因為內部是用”===”來比較key是否一樣

resource / resources

如果今天routes是用resources :candidates,會得到下面這樣
        Prefix Verb   URI Pattern                    Controller#Action
          root GET    /                              welcome#index
    candidates GET    /candidates(.:format)          candidates#index
               POST   /candidates(.:format)          candidates#create
 new_candidate GET    /candidates/new(.:format)      candidates#new
edit_candidate GET    /candidates/:id/edit(.:format) candidates#edit
     candidate GET    /candidates/:id(.:format)      candidates#show
               PATCH  /candidates/:id(.:format)      candidates#update
               PUT    /candidates/:id(.:format)      candidates#update
               DELETE /candidates/:id(.:format)      candidates#destroy
如果你改成resources :candidate上面的網址和controller都會變成單數,所以一開始生成controller的時候就要用單數的,不過慣例上controller是用複數
如果是用resource :candidates的話,和上面會長得差不多,但通通不會有:id接在後面

form_for

雖然很好用,但是想當初對我來說是最大的黑魔法,很多東西我都不知道怎麼來的,畢竟我連html都不熟
<%= form_for @candidate do |f| %>
  姓名: <%= f.text_field :name %><br/>
  政黨: <%= f.text_field :party %><br/>
  年紀: <%= f.text_field :age %><br/>
  政見: <%= f.text_area :politics %><br/>
  <%= f.submit %>
<% end %>
> f.class #=>ActionView::Helpers::FormBuilder
form_for建出來的表單裡面會包含一個authenticity_token,在下一個步驟的時候(比方new到create的時候)會是檢查這一串東西是不是自己生出來的,會被擋掉,可以某種程度上防止有人亂來
(等我知道有這東西大概是半年後了吧XD)
<input type="hidden" name="authenticity_token" value="nGETyiPlewIYWrhrWI2M60V0oSxzXjy7eiNhh9MQTuN/7vg++OLprwmk3E6BgYFwbrgFOFWKECYBRE/ZH9hbxw==">

form params的值

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"nMX+QtDWxq0wp/9gR9HAmF5VtG0cAqW4vI4BWVVQM8N/ShW2C9FUACFZm0We3c0DdZkQeTrWiSXH6S8HmZgm5w==", "candidate"=>{"name"=>"tests", "party"=>"fdsf", "age"=>"fds", "politics"=>"fds"}, "commit"=>"Create Candidate", "controller"=>"candidates", "action"=>"create"} permitted: false>
以前我並不知道這些params是哪來的
我只知道params[:candidate][:name] 可以抓到我剛剛在form裡面填的名子,但我不知道到底哪來的
到我自己發現原來是來自name,而name是form_for幫忙按照規則建好的又是好一陣子以後了。
當初我真的很搞不清楚各種params到底打哪來的,對我來說都像是莫名冒出來的。
<form class="new_candidate" id="new_candidate" action="/candidates" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="gbNo9SfPSRpfCjlOUC60LtHy6o08C0ZcVUQaGgFwoTWFWqHKwO+IO1GksoAVvQ8icy1CMdcE+0NZTpc9kERR8w==" />
  姓名: <input type="text" name="candidate[name]" id="candidate_name" /><br/>
  政黨: <input type="text" name="candidate[party]" id="candidate_party" /><br/>
  年紀: <input type="text" name="candidate[age]" id="candidate_age" /><br/>
  政見: <textarea name="candidate[politics]" id="candidate_politics">
</textarea><br/>
  <input type="submit" name="commit" value="Create Candidate" data-disable-with="Create Candidate" />
</form>

strong parameters

為了防止被亂塞東西進來,所以rails4之後有了strong parameter,只有允許的幾個欄位會被處理
params.require(:candidate).permit(:name, :party, :age, :politics)
不過下面這樣就不用管strong parameter了,因為不是整坨吃進去,但是一般不會這樣子寫就是了
name = params[:candidate][:name]
party = params[:candidate][:party]

驗證錯誤後的行為

通常會像下面這樣處理
  def create
    @candidate = Candidate.new(cadidates_params)
    if @candidate.save
      redirect_to candidates_path
    else
      render 'new'
    end
  end
為什麼不用redirect_to呢?雖然功能上不會有任何問題,但是資料會被清掉,這是很惹人厭的UX體驗。
render只是借用new這個action的template,action沒有被重新執行一次,你人還是在create裡,所以本來填的資料都還會在。
另外create本身不需要view,那為什麼要用實體變數呢?因為不這樣子的話你render “new”的時候就會炸掉了,因為new需要@candidate這個變數。
如果只是create本身的話你變數取什麼都不會有影響(其實我之前都沒想過這問題XD)
不過你可能會看到你的view好像歪掉了,因為form_for會在驗證錯誤的時候多塞了一個field_with_errors
<div class="field_with_errors"><input type="text" value="" name="candidate[name]" id="candidate_name"></div>
.field_with_errors {
  display: inline;
}
#config/application.rb
config.action_view.field_error_proc = Proc.new { |html_tag, instance| html_tag }
Written with StackEdit.

當初學ruby的時候一個小小的困擾

就是
就是我一直記不起來for迴圈怎麼寫
for num in 1..3 do
  print("num = ", num, "¥n")
end
print("End")
我就是一直記不起來QQ
應該說雖然我大學畢業之後就沒有碰程式了,但意外的當初學的東西很根深蒂固的在我腦袋,像下面這種寫法
    int sum = 0;

    for (int i = 0; i < 10; i++){
      sum += 2;
    }
所以我始終腦中都會浮現滿滿的++,一直到現在其實也還是有點不太習慣
Written with StackEdit.

幾年來的QA感想

先說這不是針對某家公司的心得,而是我在幾家不同公司當過QA之後心裡的感受。(同時我也不會講到任何公司的名字)

先說結論,我不會推薦人當QA,至少在臺灣是這樣

why?因為要先在意品質QA才有存在意義,這種公司QA講話才有力量,但台灣這種公司多嗎?有是有啦,如果你進去了,真心恭喜你。

我待過專門幫人驗證各種logo或是產品的公司,現在想一想那家公司的QA要負責的東西是最單純的,我是指在部門間的政治關係上。
因為每個部門負責的東西不一樣,客人也不一樣,所以不會有互相背後射箭的問題,你就是把你分到的東西測好就好了,至於你可以學到什麼,就看你的造化了,畢竟每個部門都不一樣,但我認為你本來在什麼部門會影響到你之後容不容易轉到別家公司。比方測電視 v.s 測電腦的部門,後者出路會比較多。


之後我待的都是oem廠,這就........讓我深深感覺到之前的環境有多單純,但面對的人/部門多,其實對自己是有好處的,你可以更加知道一個產品要出去之前到底會經過哪些東西,工作上需要和人溝通的機率也會增加,之前畢竟只是外包出去的測試公司,你能接觸到的流程有限,但在oem廠通常黑暗(?)面也會看得更多。

更正確說是會看到部門鬥爭,雖然要一家公司沒有部門鬥爭很難啦,但.....Q是一個遠永會被箭射到的部門,雖然PM也是,但是差別在哪裡呢?QA沒有更後面的人可以拉到你前面撐十秒,PM/RD,全世界都可以說“為什麼Q沒有測到“,但是Q沒有什麼人可以在推出來了。

“為什麼你沒有測到”“為什麼你沒有測到”
這是每個Q都會聽過好幾次的話,的確我們的職責是要把東西測好,但現實上也很難保證一個東西完全沒有任何bug了,我相信如果時間夠的話,不管是pm還是rd還是q都可以把事情做得更好,偏偏時間永遠不夠,但這種事,發生在不同公司處理方法卻會很不一樣。

為什麼沒有測到或是是一個必須要問的問題,因為知道為什麼才能預防下一次(即使有時候真的沒有為什麼)但有些公司會讓我覺得其實大家沒有真的很在意“這個問題為什麼會發生”而是在意“反正先把箭射到別的部門那邊去啦,然後順邊刷一下存在感”,於是重點就會在先找出代罪羔羊,而不是解決問題。

有時候也會發現有些部門的人在聽到比方說odm那邊回報bug的時候會不管三七二十一先子彈打到Q來,但稍微問一下你會發現它根本搞不清楚狀況,比方說別人根本用不對的版本測試,或是測試手法沒有寫清楚。其實他就是想要讓上面的人知道他有在做事而已,存在感++
甚至有些人你可以從他表情就看得出來一副見獵心喜的樣子。

於是我始終有一種,QA在某些公司的最大作用似乎是背黑鍋?
平常不被重視,出事的時候大家才想到你
這就是我為什麼做不下去的原因。

當然還是有天生很適合當Q的人,但是,真的很少很少,很多人去問其實會發覺可能
1.他想轉但也不知道要轉什麼
2.想轉,但是沒有機會
3.反正工作就這樣吧(攤手)
雖然我認識的Q很多,但是有轉職成功的真的不算多。
平心而論Q是一個很好入門的職業,但至少在臺灣,我覺得很少人想要一直做下去,很多做很久的人其實最後都是變成和公務員一樣。
但是我還是會覺得如果你內心對自己到底適不適合Q有疑惑,那還是想辦法出去看看吧。

QA和QC有什麼差別?這個嘛......反正很多時候兩邊都是一大塊部分重疊的,所以自己google一下,反正只是參考答案,現實很難那麼理想。

最後我還是想強調一下,我不是討厭這個職業,只是真的要待對公司,然後那個公司要活得久。






2017年5月11日 星期四

到多有多少個“等於”?_?

程式裡面總是有很多長得很像的東西
== , === , eql? , equal?
比方像上面這四個不知道想搞死誰

==

https://ruby-doc.org/core-2.2.0/Method.html#method-i-3D-3D
應該是最常用的一個,可以用來判斷到底值是不是一樣。
浮點數和小數會自動轉換,所以下面這個會是true
1 == 1.0 #=> true
但是不會幫你轉換數值和字串,所以下面是false(記得javascript的話這樣是true)
1 == "1" #=>false

eql?

https://ruby-doc.org/core-2.2.0/Method.html#method-i-eql-3F
基本上和==大部分的時候都是一樣的動作,但對於數字的行為不一樣
1.eql? 1.0
 => false
看起來如果只是要比較兩邊值一不一樣的時候用==就好了,如果需要更嚴謹一點的判斷,比方說hash內部用來判斷key到底一不一樣的時候就是用eql?

equal?

檢查是不是同一個object
cat1 = 'cat'
cat2 = 'cat'

puts cat1.object_id # => 70301044011860
puts cat2.object_id # => 70301043992280

puts cat1.equal?(cat2) # => false
puts cat1.equal?(cat1) # => true

===

嗯…不同地方作用不一樣的樣子,感覺有點討厭(?!)
case裡面用來比較的方法就是用===,所以下面這兩個是相等的
case x
when A
  puts "AAAA"
when B
  puts "BBBB"
else
  puts "meow~"
end
if A === x
  puts "AAAA"
if B === x
  puts "BBBB"
else
  puts "meow~"
end
如果是數值或是字串的話行為和==是一樣的,不過還有一些不一樣的情形
#たのしいruby裡面的範例
p /zz/ === "xyzzy" #=> true
p String === "xyzzy" #> true
p (1..3) === 2 #=> true
如果有些錯的地方麻煩各位大大可以指正我
Written with StackEdit.