關於 Golang 的亂數

https://ithelp.ithome.com.tw/articles/10193907

官方範例有展示 math/rand 的兩種用法,一種是全域的:

rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Int())

另一種是用種子取得結構後,再開始產生亂數:

t := time.Now().UnixNano()
r1 := rand.New(rand.NewSource(t))
r2 := rand.New(rand.NewSource(t))

fmt.Println(r1.Int())
fmt.Println(r1.Int())
fmt.Println(r1.Int())
fmt.Println(r2.Int())
fmt.Println(r2.Int())
fmt.Println(r2.Int())



https://lihaoquan.me/2016/10/15/rand-in-go.html

使用golang生成随机数的时候,官方提供了两种方式,分别是 math/rand 和 crypo/rand ,那么它们两者之间究竟有什么 不同呢?如果通过它们来生成我们的随机数呢?

Go 的rand包:math/rand 和 crypo/rand, 前者是一种伪随机数生成方式,后者是真正意义上的随机数生成方式。

随机数至少具备两个条件: 数字序列在统计上是随机的 不能通过已知序列推算后面的序列 自从计算机诞生起,寻求用计算机产生高质量的随机数序列的研究就一直是研究者长期关注的课题。
一般情况下,使用计算机程序产生一个真正的随机数是很难的,因为程序的行为是可预测的,计算机利用设计好的算法结合用户提供的种子产生的随机数序列通常是“伪随机数”(pseudo-random number),伪随机数就是我们平时经常使用的“随机数”。伪随机数可以满足一般应用的需求,但是在对于安全要求比较高的环境和领域中存在明显的缺点:
例如:
1.伪随机数是周期性的,当它们足够多时,会重复数字序列
2.如果提供相同的算法和相同的种子值,将会得出完全一样的随机数序列
3.可以使用逆向工程,猜测算法与种子值,以便推算后面所有的随机数列
生成随机数是密码学中的一项基本任务,是生成加密密钥、加密算法和加密协议所必不可少的,随机数的质量对安全性至关重要。

总的来说math/rand是最简单的随机数,例如你要随机一个1-100之间的数字, 而crypto/rand是更加复杂的,例如beego里面的sessionid,他有一个很大的特点是不可预测。所以如果你要实现一些涉及安全的 上下文,建议还是使用crypto/rand, 如果只是简单生成随机数,math/rand是首选。

真隨機數,crypto/rand 的用法:https://blog.sqrtthree.com/articles/random-number-in-golang/
結果為 big int ,使用前需要進行各種轉換:https://medium.com/orbs-network/big-integers-in-go-14534d0e490d
https://golang.org/pkg/math/big/#Int.String
https://birdben.github.io/2017/01/10/Go/Go%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%89%EF%BC%89Go%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E6%80%BB%E7%BB%93/

Golang 爬蟲

Get the content of a web page (golang):
https://www.daniweb.com/programming/computer-science/code/495192/get-the-content-of-a-web-page-golang

package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "http://tour.golang.org/welcome/1"
fmt.Printf("HTML code of %s ...\n", url)
resp, err := http.Get(url)
// handle the error if there is one
if err != nil {
panic(err)
}
// do this now so it won't be forgotten
defer resp.Body.Close()
// reads html as a slice of bytes
html, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
// show the HTML code as a string %s
fmt.Printf("%s\n", html)
}


為什麼 Response.Body 需要被關閉?
https://www.jianshu.com/p/407fada3cc9d
簡言之,與其額外處理各種錯誤導致的資源無法回收,使用後就 close Response.Body 是最好的做法。

容易踩到的 50 個坑
35. 關閉 HTTP 的響應體 (譯本這段的程式碼有誤,應參見原文)
https://segmentfault.com/a/1190000013739000#articleHeader38

原文:
http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/
Closing HTTP Response Body

https://stackoverflow.com/questions/32818472/do-we-need-to-close-the-response-object-if-an-error-occurs-while-calling-http-ge



正則處理:
https://www.kancloud.cn/kancloud/web-application-with-golang/44184


Youtube 與 Netflix 聯合研究:影片廣告百百種,最有效的長度只需 6 秒鐘

許多人都會在平日閒暇之餘觀看 Youtube 影片,不過看久了總是會遇到影片插入廣告的情況,有些廣告短短五六秒,也有些廣告長達半小時。

在這些廣告當中,有些令你著迷、也有些會讓你一秒跳過,但你知道在這麼多種類的 Youtube 廣告中,哪種廣告的效益最好嗎?

由 Youtube 與 Netflix 合作研究的結果指出:6 秒,6 秒的廣告效果最好。

Youtube 無法跳過的 6 秒廣告,成效卻是最好的

Youtube 曾經與 Netflix 合作研究,想知道短廣告的廣告效益是否能夠跟長廣告一樣好,在經過多次的測試與研究之後,他們發現大約 5 – 6 秒的短廣告效果最好,在某些案例下效果甚至超越長廣告。

事實上,早在 2014 年之前,Youtube 就開始推出「6 秒廣告」的影片廣告,這種「六秒鐘」的影片廣告無法被跳過,一般用戶只能乖乖看完這六秒鐘的短廣告。

時間超短的 6 秒,需要全新的廣告思考方式

但是到了這邊,一定就會有人開始詢問:一個廣告才 6 秒鐘,我是要怎麼推銷我的標的物?

沒錯,短短的 6 秒鐘,確實是很難描述廣告商所想表達的事物,但是既然打從一開始這 6 秒鐘就不可能讓你放入完整廣告,那們在設計廣告時就應該拋開「放入所有項目」的思維,而用別的觀點與角度來看待、利用這種 6 秒廣告的特性,打造出別的特色。

而且,可沒人說你只能放一次 6 秒廣告的。

短廣告「前菜」+ 長廣告「主餐」= 成功的廣告組合「套餐」

在思考時,不要想著把所有的故事內容塞進 6 秒鐘以內,而是利用 6 秒鐘廣告當成是誘餌,引誘大家想要看到更多的內容,或是對那 6 秒鐘背後的完整故事感到好奇,才能最大程度的利用到 6 秒廣告的特性。

一般來說,最理想的方式,是透過多段的 6 秒廣告,一段 15-30 秒的短廣告,以及一段 1 分半的完整廣告組合可以達到最好的效果。藉由依序對同一個使用者投送多段 6 秒廣告,吸引使用者的注意,等待使用者點進去後,再用短廣告與完整廣告來訴說完整的故事。

當然,在這邊就要開始思考,我該怎麼善用這 6 秒鐘的時間,該怎麼取捨廣告的內容依然是很重要的問題,不過總比起要把所有的故事內容塞進 6 秒鐘以內來得好多了。

當然,如果你能夠把一整部電影濃縮在 5 秒預告的話那就另當別論了,但應該沒人這麼做…… 的吧?



JavaScript 爬蟲

使用正則表達式解析的過程:https://medium.com/@realdennis/1684568f6cb4

使用 JavaScript 利用客戶端爬蟲必須面臨的最大難題為『瀏覽器有跨網域禁止訪問』的限制:
http://www.dewen.net.cn/q/7128/javascript

https://ithelp.ithome.com.tw/users/20107159/ironman/1325

用純客戶端JavaScript來爬蟲 (依賴瀏覽器擴充等):https://www.itread01.com/articles/1491156016.html

Pxer需要依賴瀏覽器擴充:https://github.com/FoXZilla/Pxer


Access-Control-Allow-Origin 跨域訪問相關議題

理解 Ajax 與跨來源請求:https://blog.techbridge.cc/2017/05/20/api-ajax-cors-and-jsonp/

原來 CORS 沒有我想像中的簡單:https://blog.techbridge.cc/2018/08/18/cors-issue/

HTML2Canvas:用Javascript來做螢幕截圖,仍然會受到 跨域訪問 限制
http://www.ladesign.tw/paper/info/jquery_html2canvas_download



ajax 设置Access-Control-Allow-Origin实现跨域访问
https://blog.csdn.net/fdipzone/article/details/46390573

摘要:
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。

如果跨域使用POST方式,可以使用创建一个隐藏的iframe来实现,与ajax上传图片原理一样,但这样会比较麻烦。

ps. 如何創建一個隱藏的 iframe:http://21st.each1.net/2018/07/csrf-cross-site-request-forgery.html

因此,通过设置Access-Control-Allow-Origin来实现跨域访问比较简单。

例如:客户端的域名是www.client.com,而请求的域名是www.server.com

如果直接使用ajax访问,会有错误

在被请求的Response header中加入

// 指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:POST');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');
就可以实现ajax POST跨域访问了。

實現的代碼摘要如下:

client.html 路径:http://www.client.com/client.html

<script type="text/javascript">
    $.post("http://www.server.com/server.php",{name:"fdipzone",gender:"male"})
      .done(function(data){
        document.getElementById("show").innerHTML = data.name + ' ' + data.gender;
      });
</script>

server.php 路径:http://www.server.com/server.php

<?php
$ret = array(
    'name' => isset($_POST['name'])? $_POST['name'] : '',
    'gender' => isset($_POST['gender'])? $_POST['gender'] : ''
);

header('content-type:application:json;charset=utf8');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST');
header('Access-Control-Allow-Headers:x-requested-with,content-type');

echo json_encode($ret);
?>

Access-Control-Allow-Origin:* 表示允许任何域名跨域访问
如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名

例如:header('Access-Control-Allow-Origin:http://www.client.com');

如果需要设置多个域名允许访问,这里需要用php处理一下

例如允许 www.client.com 与 www.client2.com 可以跨域访问

server.php 修改为

<?php
$ret = array(
    'name' => isset($_POST['name'])? $_POST['name'] : '',
    'gender' => isset($_POST['gender'])? $_POST['gender'] : ''
);

header('content-type:application:json;charset=utf8');

$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';

$allow_origin = array(
    'http://www.client.com',
    'http://www.client2.com'
);

if(in_array($origin, $allow_origin)){
    header('Access-Control-Allow-Origin:'.$origin);
    header('Access-Control-Allow-Methods:POST');
    header('Access-Control-Allow-Headers:x-requested-with,content-type');
}

echo json_encode($ret);
?>




經驗不足,憑什麼當老闆?一位 24 歲 CEO 的自白

在科技屢現創新的時代裡,不少新創科技公司紛紛設立,這些公司的創始人還幾乎都是年輕人,當這些「小」老闆要聘用和管理比自己資深的員工時,往往會遭遇一些難題。對此,科技教育公司「Learn to Code With Me」創始人 Laurence Bradford 投稿 Forbes 網站,與大家分享她從一些年輕老闆口中得到的應對方法。

Vivek Ravisankar 是 HackerRank 的創始人之一,24 歲就成為 CEO,他認為,保持自信是最重要的。「雖然論經歷你沒有比較強,但你身為公司創辦人,要記住兩件事,一,你熟悉公司的所有事物,二,你也是最熟知公司狀態和公司文化的人。」

自信不等同於自大,你不需要刻意表現你懂所有的事,你可以謙虛接受任何建議,關鍵是你要記住自己的角色,然後對自己的決策、能力有信心。

Christian Lanng 則在 19 歲就創辦了 Tradeshift,「幾乎所有員工都比我還資深,這是件好事,因為這會迫使我仔細思考自己的角色,我需要了解很多我還不懂的事情,同時也要帶領大家跳出固有思考框架。」他指出,

認清自己的角色最重要,作為公司負責人,要給員工清晰的未來藍圖,資深員工再怎麼資深,也只能幫助你執行。

但,如何在明知自己經驗不足的情況下當個好的領導者呢?對此,Vivek Ravisankar 說,他會採取幾個方式:

聘用未來一年半到兩年內你迫切需求的專業人才,而非發展五年後你才會需要的人

聘人之前做好周邊調查,了解受雇者的長短處,但調查結果僅作參考,除非評價真的很差
仔細思考你會如何與這些有經驗的下屬工作,你甚至可以先了解他們曾經共事的長官是什麼風格
樹立彼此的防線,即使他們比較資深,但別忘了你才是主事者
相信直覺,聽從內心告訴你「我適合跟這個人共事嗎?」的答案

聘用之後,人才的上線更是一大難關

Christian Lanng 認為,這些資深的員工或許先前待過大企業,但他們對「高成長」的理解可能不適用於初創公司,其他情況亦然,所以身為領導人要幫助他們適應自己的新角色和新的工作環境。
「基本上,如果聘請到對的人,在最初的 90 天就能看到正面成果。」Vivek Ravisankar 說,如果沒有,就要檢討是什麼環節出錯,到底是人員不適任還是其他因素,然後趕緊做出必要調整,但不是說要馬上換掉這個人,而是可以增加彼此的了解及溝通。 「每個資深主管都不同,你得知道什麼方式可以激勵他們,也得清楚他們的短處以及明確地指出來。」

此外,不同世代對福利的側重點也不同,根據 FlexJobs 今年 8 月的調查顯示,年輕一代重視彈性工作時間、旅遊、公司津貼等,而年長一點的主要關注財務福利和工作是否有意義。所以當需要提供福利條件時,不論你的員工是年輕或年長,除了給到一定的激勵外,針對不同世代可以給予不同福利措施。

使用 javascript 動態更改 CSS 的各種方式

https://www.jianshu.com/p/0260cddff86a


在很多情况下,都需要对网页上元素的样式进行动态的修改。在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用、效果、以及缺陷。
1、使用obj.className来修改样式表的类名。
2、使用obj.style.cssTest来修改嵌入式的css。
3、使用obj.className来修改样式表的类名。
4、使用更改外联的css文件,从而改变元素的css

下面是一段html代码和css代码用来解释上面方法的区别的。

CSS

.style1{margin:10px auto ;background-color:#9999FF; display:block;color:White; border:1px solid white; padding:10px 25px; font-size:18px; }

.style1:hover{ background-color:#66B3FF; cursor:pointer;}

.style2{margin:10px auto ;background-color:gray; display:block;color:black; border:1px solid white; padding:10px 25px; font-size:18px; }

.style2:hover{ background-color:black; color:White; cursor:pointer}

HTML

 <div>
        <input id="btnB" type="button" name="btnLogin" value="登录" class="style1" />
        <div id="tool">
            <input type="button" value="【obj.style.className】更改样式" onclick="changeBackgroundColor()"/>
            <input type="button" value="【obj.style.cssText】更改样式" onclick="changeFontSize()" />
            <input type="button" value="【obj.className】更改样式" onclick="addRadius()" />
            <input type="button" value="更改外联css样式" onclick="recover()" />
        </div>
    </div>


一、使用obj.className来修改样式表的类名

从下面的代码可以看出ob.style.cssTest是如何来btnB的样式的。

 function changeStyle1() {
            var obj = document.getElementById("btnB");
            obj.style.backgroundColor= "black";

  }

该段代码修改btB的文字的颜色,在浏览器中打开调试工具,可以发现btB标签中多了一个属性【style="background-color:black"】,从而改变btB的样式。

缺陷:
在修改btB的背景色之后用鼠标放到btB上可以发现,btB的伪类hover里面的css根本不起作用。原来是当你修改了这个这样样式之后。在btB的内联样式中多了background-color属性了,在css的应用中也是有级别的,嵌入式>内联式>外联式。而btB的hove伪类的background-color样式写在内联式中,所以嵌入式的background-color覆盖了伪类中,这就使得鼠标放入btB上感觉不到背景颜色的变化。


二、使用obj.style.cssTest来修改嵌入式的css

直接上JavaScript代码:

 function changeStyle2() {
            var obj = document.getElementById("btnB");
            obj.style.cssText = "background-color:black; display:block;color:White;

}

该段代码和【一】中的效果是一样的,缺陷也是一样。


三、使用obj.className来修改样式表的类名

使用代码来修改btB引用样式的类名,如下段代码:

  function changeStyle3() {
            var obj = document.getElementById("btnB");
            //obj.className = "style2";
            obj.setAttribute("class", "style2");
    }

通过更改btB的css的类名的方式来更改样式,更改样式类名有两种方式。1、obj.className = "style2";  2、 obj.setAttribute("class", "style2");都是一样的效果。

用这种方式来修改css比上面的效果要好很多。

四、使用更改外联的css文件,从而改变元素的css

通过更改外联的css文件引用从而来更改btB的样式,操作很简单。代码如下:

首先得引用外联的css文件,代码如下:

<link href="css1.css" rel="stylesheet" type="text/css"  id="css"/>

function changeStyle4() {
            var obj = document.getElementById("css");
            obj.setAttribute("href","css2.css");
   }

这样也能方便的更改btB的样式,个人觉得这种方式是最好用的。是实现整体页面换肤的最佳方案。

屋價減損

若真的不慎租、買到凶宅,最保障的方法就是尋求法律途徑,法律上有一條關於「屋價減損」的相關條款,建議訴訟技巧,可以請求法院指定估價師進行鑑定,對雙方皆有保障。

CSS Fonts - 系統內建字體的相關設定

詳閱 https://www.w3schools.com/css/css_font.asp




文章的發布時間與更新時間

https://www.seoseo.com.tw/article_detail_275.html
https://www.biaodianfu.com/google-serp-date.html

文章類型的網頁應該要有『相關時間』,並放在文章的最上面;
更新日期放在發布日期之前。

要時常更新文章內容:
1. 部份的更新,例如:句子加長、添加新的關鍵字在文章中、標題調整、錯字更正
2. 調整更新日期,讓文章出現在最頂端,也就是網站中最新的一篇文章
3. 更新文章的 title、description 等 Metadata
4. 當作新文章去進行推廣,例如:利用電子報、社群去做宣傳

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...