南澗跳菜為節日添彩_網頁設計公司網頁設計公司,網頁設計,台北網頁設計

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

  跳菜之猴子嬉鬧。
  適志宏攝

  跳菜之空手疊塔。
  適志宏攝

  “南澗跳菜”又被叫做“抬菜舞”或者“捧盤舞”,將舞蹈、音樂與雜技、飲食融為一體,是雲南南澗彝族自治縣群眾流傳已久的習俗。彝族跳菜2008年被列入第二批國家級非物質文化遺產名錄。

  “跳菜有‘宴席跳菜’和‘表演跳菜’兩種形式。‘表演跳菜’主要是在舞台上,菜不是真菜,主要是通過舞蹈和音樂來表現。我們日常做的主要是‘宴席跳菜’,抬的是真菜,這是每一次宴席慶典的必備儀式,往往是我們接待賓客的最高禮節。”跳菜隊隊長張玉香說。

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  音樂聲響,張玉香和另一位隊員從廚房跳出,一人在前面引舞護菜,另一人在後面舞着托盤,兩人踏着節拍登場。輕快敏捷的舞步,幽默逗人的扮相,混着激昂的嗩吶聲,引起現場陣陣歡笑。

  “口功送菜”和“空中送菜”是張玉香的拿手絕技。在村裡跳菜,還有許多套路,張玉香說:“不管採用什麼樣的形式,最關鍵的就是保證把這些寓意吉祥的菜平平穩穩地上到桌上。”

  在舞姿的變化中,跳菜隊員們利落地把菜擺放到桌上。不僅跳舞有講究,擺菜的形式也很講究。“梅花形是我們常用的擺法,等這些農家菜上齊了,大家就可以一起享受這些美味佳肴啦。”張玉香說。

  版式設計:蔡華偉 張丹峰

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

三秦大地看賀歲_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

張燈結綵辭舊歲,龍騰虎躍鬧新春。三秦大地上,拜年賀歲的“傳統”與“現代”,正紅紅火火地交織相融。

一聲腰鼓、一個燈籠、一條視頻……這個春節里,陝北大地上,拜年,有老傳統、有新氣象,甚至有了國際范兒!

一聲腰鼓·記憶

一入臘月,延安的川梁溝峁里,年味漸濃。

在陝北過年,蜿蜒山徑上,秧歌隊、腰鼓陣已成為陝北人最溫暖的春節記憶。

“秧歌、腰鼓拜大年,就是‘沿門子’,就圖個紅火喜慶。”說起“沿門子”傳統,64歲的山王河村民張征侃侃而談,“正月敲敲打打,能保四季平安。”

很多年前,張征還是小伙子時,也曾是拜年的“絕對主力”。鏘鏘鑼鼓聲中,男男女女穿紅戴綠,娃娃們一個個小臉凍得通紅。秧歌、腰鼓在黃土地上奔騰開來,盡顯新年新氣象。

春去秋來,黃土地里“沿門子”,祝福了歲歲年年。一轉眼,“小娃娃”張軍明已過不惑之年,成了山王河村支書。30年時空流轉,村莊也“換了人間”:2萬多畝退耕地褪去黃沙、披上綠衣,經濟林木漫山遍野。富餘勞力搞起了“黃土風”腰鼓隊,還跨出國門,去過秘魯、新西蘭演出。

一個燈籠·傳承

西安東郊白鹿原上,82歲的王學坤,編了一輩子竹燈籠。握一把篾刀、坐一個馬扎,老人與燈籠結緣了一輩子,看慣了原上過年的喜慶與熱鬧。

灞橋孫家溝村的王學坤和侄孫王少波,春節前夕在院子的柿子樹下,忙着趕製竹燈籠。破竹、划篾、編織、收口、糊紙……十幾道工序下來,一個個精巧玲瓏的“火葫蘆”竹燈,就在爺孫倆手裡誕生了。

“在關中民俗里,‘外甥拜年,舅舅送燈’。火紅的燈籠,是小娃娃正月里最期盼的禮物。”今年40歲的王少波仍記得,兒時去舅家拜大年的場景。“大年初二進了門,挨個給姥爺、姥姥、舅舅磕頭。紅包裝兜里,心裏還盼着打燈籠哩。”

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

白鹿原上,歲歲拜年,輩輩送燈。見證這一幕幕溫馨場景的竹編燈籠,已有300多年歷史。若論“原上編燈第一人”,當屬“非遺”傳承人王學坤;而跟爺爺學藝的王少波,已是王家的第九代傳人。

時代變遷,如今白鹿原上,建起了白鹿倉景區。王少波腦子活,在景區的“非遺”街上,開了一家“竹編燈籠”鋪子,平日里專攻編燈技藝。

王少波肯琢磨,要給老技藝融入新創意。端詳店裡的小物件兒,“燈籠檯燈”最有設計感,“燈籠花籃”工藝巧,成為年輕人拜年賀歲的時髦禮物……

“時代變,燈籠變,白鹿原也在變。”王少波十分感慨,“唯有這竹燈里藏着的拜年祝福,從未改變過。”

一條視頻·新潮

相機、自拍桿、三腳架……趁着飛曼谷的航班還沒到,李希梅又檢查了一遍行李。滿懷憧憬的旅途中,有個“重頭戲”——給家裡老人錄拜年視頻,送上異國他鄉美美的祝福。

前兩年,李希梅和丈夫結婚,定居西安。前陣兒剛入冬,身邊好幾個姐妹盤算着春節出國游,聽得多了,小兩口也動了心思。

臘月底出發前,夫妻倆回了趟渭南老家。“趕不上除夕,就提前給爺爺奶奶拜個年。”

爺爺奶奶,是李希梅最大的牽挂。前些年,她在美國留學時,每逢除夕夜,都惦記着“叮咚作響”彈出消息的家裡社交群。視頻群聊一開,先給長輩拜年。爺爺奶奶挺新潮,學會了發紅包;一幫小輩兒一擁而上,紅包個個“秒光”。

“每次放假回國,我都把自己的留學生活講給爺爺奶奶聽。”李希梅愛攝影,圖書館里的壁畫、海邊衝浪的年輕人、給美國室友做的火鍋……“爺爺奶奶年紀大了,但對外面世界的嚮往,一點兒都不少。”

如今,老人出國不方便,李希梅便帶上相機,用鏡頭記錄旅程。“我還想邀請幾位華人店家,站在鏡頭前,用中文送上新春祝福。”李希梅春節時還製作洋溢着泰國風情的拜年視頻,“發回去,爺爺奶奶肯定喜歡!”

“新年新氣象,新人新玩法。”李希梅笑言,“傳統中國年,也有國際范兒!”

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

海關“龍騰行動2019”扣留侵權嫌疑貨物超1700萬件_台中搬家

※台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

新華社北京1月25日電(記者劉紅霞)記者近日從海關總署獲悉,以打擊侵權假冒為主題的海關“龍騰行動2019”專項行動戰果豐碩,共扣留侵權嫌疑貨物4.5萬批,涉及貨物1745萬件,價值1.07億元。

據了解,本次專項行動為期6個月,持續至2019年年底。專項行動期間,全國海關查獲涉及我國自主品牌侵權嫌疑貨物356批,扣留侵權貨物627.1萬件,價值3019.78萬元;對外資品牌實施保護措施8617次,查獲侵犯外資品牌貨物4.23萬批,涉及貨物1032.57萬件,價值6239.38萬元。

以廣州海關為例,專項行動期間,廣州海關共查扣侵權嫌疑貨物1941批次、264.1萬件,129家知識產權權利人的406項知識產權得到保護。

※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

廣州海關綜合業務處處長唐慶林說,專項行動主要聚焦消費电子類產品、汽車配件、個人護理用品、服裝、箱包、鞋靴等涉及公眾健康安全的商品,加大了對重點國家和地區的貨物監管力度。

據介紹,全國海關充分依託“金關二期郵遞物品信息化管理系統”“智能審圖系統”“快件輔助申報平台”等科技手段,開展多角度立體分析和“精準畫像”,並加強區域協作,有效控制侵權商品口岸漂移態勢。

“專項行動期間,全國海關共開展各層級關際合作200餘次,區域聯動、跨區作戰體系初步形成,侵權商品口岸漂移態勢得到有效控制。”海關方面有關負責人說。

區域協作加強的同時,我國海關在打擊侵權假冒方面也在不斷加強國際合作,與歐盟、日本、俄羅斯等國家和地區海關的案件信息通報更加密切。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

重慶銅梁大力發展龍舞 舞出脫貧“一條龍”_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

  重慶市銅梁區太平鎮坪漆村村民王述珍在給龍燈上彩。
  趙武強攝

  今年過年,重慶市銅梁區高樓鎮卻有些冷清,回家的車子不多,外出的村民卻不少。這是為什麼?

  原來,很多鎮里人都在外面過年。“我有10多年沒有在家過年了,兒子、女兒和親戚們都跟我出去舞龍,西安、淄博,還有深圳的歡樂谷,我都去過。”高樓村村民李詩敏是一名舞龍帶頭人,年近七十,他收拾行裝,準備再次外出。

  銅梁是全國龍燈藝術之鄉,龍燈產品的扎制已有近千年歷史。2006年,銅梁龍舞被列入首批國家級非物質文化遺產名錄。近年來,銅梁大力發展龍舞,形成了演藝表演、龍燈製作和文化旅遊等“一條龍”產業,將這項非物質文化遺產發揚光大,還帶動了脫貧攻堅。

  在高樓鎮,像李詩敏一樣舞龍的村民大約有500名,他們每支隊伍30多人,在節日、慶典時受邀到各地演出,正常情況下,一名村民每年能賺3萬多元。

  與高樓鎮相比,太平鎮就熱鬧不少。龍燈扎制進入“龍忙”時節,扎制場訂單不斷,生意紅火。車間里,擺放着各式各樣的龍燈產品,扎龍藝人正在忙碌,有的編扎彩龍,有的扎制龍燈,有的在龍燈上進行彩繪。

※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

  “年底了,我們的訂單多了起來,一直要忙到元宵節。”龍燈非遺傳承人周建說,訂單來自好幾個省市,每條龍燈價格從2000多元到10多萬元不等。一般情況下,周建每年要賣出500多條龍燈。

  在龍燈產業的帶領下,當地村民也在脫貧致富。“做這個很方便,我可以拿回家裡,有空的時候就做。”坪漆村建檔立卡貧困戶王述珍在農閑期間製作龍燈,每年增收1萬多元,順利脫了貧。

  坪漆村是銅梁龍燈的發祥地之一。2018年底,村裡建立龍燈彩扎基地,成立彩扎專業合作社,採取“公司+專業合作社+農戶”模式,組織村民開展龍燈彩扎技術培訓,參与龍燈扎制,讓村民在家門口掙錢,吃上非遺飯。現在,這樣的龍燈彩扎基地一共有8個,其中4個設在市級貧困村。

  名氣大了,龍舞還帶動了旅游業發展。銅梁龍舞先後參加了北京奧運會開幕式、上海世博會、北京世園會等國內重大慶典活動,並遠赴30多個國家和地區開展交流。尤其是2019年國慶期間,身長60米的巨龍在天安門廣場中心表演區飛舞翻騰,銅梁龍舞獲得了更大的關注。

  為繼續挖掘龍舞產業潛力,銅梁去年舉辦了首屆龍燈藝術節,掀起了龍燈旅遊熱潮,吸引遊客400餘萬人次,實現旅遊收入12.5億元,助力脫貧攻堅,提升了銅梁的美譽度。

  今年元旦,第二屆龍燈藝術節舉辦,現場人頭攢動,熙熙攘攘。慕名而來的遊客越來越多,到銅梁看龍舞成了重慶旅遊的一張新名片。

  “我們要做好‘龍’文章,抬起文旅‘龍頭’,辦好一個節會、傳承一批技藝、發展一類產業、致富一方群眾。”銅梁區文旅委主任劉艷說,目前,銅梁龍舞文化產業直接經濟效益近億元,有力促進了銅梁農村地區脫貧攻堅。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

Sony Mobile 新旗艦 Xperia 1 III 爆料規格曝光:將搭載 S888 處理器、4K HDR 螢幕亮度提升_網頁設計

※網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

在首款搭載高通 Snapdragon 888 處理器的小米11 推出後,接下來在 2021 年包括華碩、黑鯊、聯想、LG、魅族、motorola、nubia、realme、OnePlus、OPPO、Sharp、vivo 與 ZTE 都確定將成為首批搭載的的手機品牌。而近期網傳 Sony Mobile  接下來的 Xperia 1 系列新旗艦 Xperia 1 III 也可能會搭載此處理器。

▲示意圖,圖為 Xperia 1 II

Sony Mobile 新旗艦 Xperia 1 III 爆料規格曝光:將搭載 S888 處理器、4K HDR 螢幕亮度提升

Sony Mobile 今年在台灣推出包括 Xperia 1 II 以及 Xperia 5 II 兩款旗艦級手機,而根據往年在 MWC(Mobile World Congress)也都會發表新機。然而受到疫情影響,接下來在 2021 年也還有許多變數。不過最近在 Twitter 也有人開始爆料 Xperia 1 系列下一代旗艦新機 Xperia 1 III(暫稱)的規格。

▲示意圖,圖為 Xperia 1 II

爆料指出 Xperia 1 III 將一樣採用 6.5 吋 4K OLED HDR 螢幕,不過螢幕亮度部分將比起 Xperia 1 II 提升 15% 。硬體規格方面,也機搭載高通 Snapdragon 888  5G 處理器、配備 8GB RAM 和 256GB ROM 。指紋辨識也延續採用側邊指紋辨識的方式,全機也支持 IP65/IP68 防塵防水等級。

▲示意圖,圖為 Xperia 1 II

而爆料尚未提到 Sony 一直以來強調的相機拍攝功能,若沒意外這次應繼續和蔡司認證的鏡頭,在相機鏡頭搭配、拍攝穩定性、夜拍方面進行升級。

▲示意圖,圖為 Xperia 1 II

不過爆料則有提到 Xperia 1 III 可能的售價,傳聞為 1,199 美元起(約合新台幣 33,770 元)。

▲圖片來源:Anthony (Twitter/@TheGalox_)

消息來源:Anthony (Twitter/@TheGalox_)

※台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

延伸閱讀:
realme 7 5G 開箱動手玩|天璣 800U 處理器、5G+5G 雙卡雙待、120Hz 更新率螢幕、5000mAh大電量與 30W Dart 閃充,萬元內 5G 超值選擇

小米11 Pro 傳聞規格首次曝光:預計 2021 上半年推出, Redmi K11 將為同期最便宜 S888 旗艦新機之一

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

全台區間測速路段懶人包_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

今年上半年因省道台61線西濱公路彰化段區間測速發生爭議後,全台區間測速裝置大都多停用。經經濟部標準檢驗局訂定區間平均速率裝置檢定檢查技術規範後,警方將在2021年元月起陸續送檢37處裝置,待通過後就會加入執法。由於先前實施區間測速路段的超速罰單大增,倍增的區間測速路段上路後恐將成習慣飆速的汽車及機車車主荷包大失血。

什麼是【區間測速】? 超速會罰多少? 哪些路段將實施區間測速呢? 以下作一整理與說明:

掌握最新電信資費訊息,請加入小丰子3C俱樂部粉絲頁!

小丰子3C俱樂部

 

過去警察取締超速,大都採用固定式超速照相機,導致不少習慣超速開車的人都是快到固定式超速照相機地點才減速。為降低超速肇事,台灣警方參考國外做法自民國107年於新北市萬里隧道啟用【區間測速】,上路2年來共有18處區間測速裝置陸續加入執法,對於減少違規及降低交通事故發生有顯著成效。今年上半年因省道台61線西濱公路彰化段區間測速發生爭議而暫停後,在「區間平均速率裝置檢定檢查技術規範」110年元旦上路,警方將在全台裝置37處【區間測速】設施,陸續加入執法,多數路段最快2021年2月將重啟區間測速。以下是區間測速規定與目前全台預定實施路段:

 

1.區間測速規定:

「區間平均速率」指車輛行經某路段特定兩點之間(距離固定),除以所行駛的時間,即為平均速率。現行「雷達測速」也是偵測車輛在雷達波特定範圍內移動距離與時間差的關係計算車速(只是距離很短),一般認定是定點的測速,實際上也算是區間平均速率。
區間平均速率執法(簡稱區間測速),由點延伸為線,可大幅增加速率控制的有效範圍,除可抑制瞬間超速行為外,重點特色在於可減少車輛間行駛速度的差異,達到控制車行速度趨於穩定的效果,預期將會更有助減少事故發生。

 

區間測速大都使用在封閉或半封閉路段,且以常違規或易肇事的路段為主,實施區間測速的路段會設置「警52」警告牌面,一般道路設於起點前方100-300公尺(高快速公路為300-1000公尺),附牌文字為「前方區間測速長度○公里」。

 

在實施測速路段內必須依速限規定行駛,因速率係以平均值認定,故偶然不慎超速應不至於立刻構成違規,後續再注意減速即可,亦即存有補救之機會(固定桿則無)。以下是以台北市自強隧道通過的秒數換算車速。

 

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

行經區間測速路段若超速,將依行駛道路種類限速規定與透過經過時間換算的車速加以罰款。若是行駛快速道路超速逾10公里(時速101公里、通過時間約187秒)汽車罰緩至少3000元以上、6000元以下。汽、機車行駛限速50公里路段,時速60公里以上開罰,採累進制罰款,機車超速至少1200元、汽車超速至少1600元,各式車輛超速100公里以上均罰款2萬4千元,車輛超速愈高、罰款愈多。不管汽車或機車只要超速,就會收到以下超速照片與罰單通知。

 

2.區間測速實施路段:

目前警方將陸續在宜蘭縣、台北市、新北市、桃園市、苗栗縣、台中市、彰化縣、 高雄市、屏東縣、台東縣、花蓮縣..等37處路段設置區間測速。
以下區間測速資訊僅供參考,實際路段以交通警察局公布為準:

 PS: *苗栗兩路段夜間8時至隔日6時降為50公里

 

其中,北宜公路全路段被分成八路段實施區間測速,被網友喻為【區間測速大Boss】!

 

因應【區間測速】實施,目前已有區間測速超警示APP可以下載。不過,版主尚未實測過該APP,實際效果為何不得而知就是。

 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

新式數位身分證容易危害資安問題?_網頁設計公司

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

台灣新式身分證「數位身分識別證(New eID)」將於明年元月在新竹市試行換發,明年七月全面換發。由於身分證是個人最重要的個人身分憑證,但內政部對於「數位身分識別證(New eID)」揭露的資訊目前並不夠充分,導致不少專家與民眾對於數位身分證的資安問題有不少疑慮,讓新式身分證全面換發出現許多雜音,連原本要試辦的新竹市也釀釀喊卡。
台灣新式身分證「數位身分識別證(New eID)」是什麼? 由紙本變數位化的目的為何? 新式身分證資安破口會在哪裡呢? 以下作一解析:

掌握最新電信資費訊息,請加入小丰子3C俱樂部粉絲頁!

小丰子3C俱樂部

 

1.什麼是「數位身分識別證(New eID)」? 有何功能與用途?

「數位身分證」乃是將過去紙本身分證升級為具晶片功能的「數位身分證」,除了安全防偽性加強外,更可整合自然人憑證功能,成為一把數位鑰匙與虛擬世界的「數位分身」。

Note: 以上新式身分證圖樣非最終正式發行圖樣

 

過去台灣因為線上身分認證機制並不完善,民眾辦理各項政府或民間業務,都必須本人持身分證正本前往辦理。外來身分證數位化(晶片化)後,民眾就可以僅憑一張卡片,就可以申請與辦理如網路報稅、公民投票、申請電子病歷、數位金融交易、退休金查詢、申請各種社福津貼與補助..等等逾80%的線上政府業務,大幅簡化民眾多處申請服務的個人資料重複註冊與節省往返奔波時間,也可以省下老是在印身分證影本的麻煩。

 

根據臺灣大學生醫電資所資訊組研究生何明洋的研究,至今已有47國發行eID數位身分證,歐洲國家數量最多,但馬來西亞是全球第一。 相較於國外eID身分證還可以用做為i-Voting線上投票、健保卡、登入銀行帳號..等等多元應用,台灣數位身分證受限於朝野的不信任目前僅能作為身分證明、自然人憑證及供國內通關ICAO國際旅行證件使用。根據內政部報告指出,2021年全球預計89%的國家採用晶片身分證, 可見數位身分證是國際趨勢,別人已經上太空,我們還是在殺豬公,實在有辱台灣是科技之島美名。

 

2.「數位身分識別證(New eID)」更容易洩漏個資及危害資安問題嗎?

反對全面換發「數位身分識別證(New eID)」的理由之一就是對於台灣eID資安問題有疑慮。身份證由現行紙本改為晶片化後,會更容易洩漏個資及危害資安問題嗎? 以下作一探討:

A.數位身分識別證(New eID)個資隱私保護比紙本更好:
台灣「數位身分識別證(New eID)」的「卡面資料」比現行國民身分證更少,正面欄位資訊僅提供:姓名、身分證字號、出生日期、個人大頭照等 4 項目個資,背面有:結婚狀態、製證日期、應換領日期、證件號碼條碼、身分證字號條碼、機讀區(MRZ)。上方印有中華民國國旗與「中華民國國民身分證 TAIWAN, REPUBLIC OF CHINA」字樣。傳統身分證上的配偶名字、父母名字、戶籍地址、役別、出生地等 5 項個資,則儲存於晶片內,須授權才可讀取。
換言之,過去紙本身分證上的個資只要被影印或遺失被撿走通通被看光光,改為數位化後,需要輸入密碼才能看到,對個資隱私保護一定比較好。

 

B.數位身分識別證只是通往數位應用的「鑰匙」,並無用戶個人其他數位歷程或資訊會被揭露:
台灣「數位身分識別證」並無儲存功能,並不會有多餘原本紙本身分證可揭露資訊以外更多資訊會被揭露,這與現行健保卡或勞保卡可以直接讀取個人就醫或勞退保相關資訊是完全不一樣的。
至於有些民眾對數位足跡的擔憂,內政部表示相關讀卡記錄不會傳回內政部或者憑證管理中心,政府不會掌控民眾的數位足跡,民眾可以安心。

 

另外,內政部表示數位身分證採雙晶片備援機制,晶片均通過國際安全認證標準,並由台積電公司代工生產,其中主晶片6項功能中有5項為CC認證(Common Criteria),安全評估等級達EAL5+以上, 達軍事機密等級。為了讓民眾對於數位身分證資安問題能夠釋疑,內政部近日也公告【賞金獵人】,懸賞500萬來徵求可複製New eID駭客。
除此,台灣在《戶籍法》、《電子簽章法》、《資通安全管理法》、《個人資料保護法》都有相關法源根據及針對冒用、偽造或變造國民身分證立有相關罰則。如戶籍法第75條規定: 意圖供冒用身分使用,而偽造、變造國民身分證,足以生損害於公眾或他人者,處五年以下有期徒刑、拘役或科或併科新臺幣五十萬元以下罰金。」 行使前項偽造、變造之國民身分證者,亦同。是故,針對新式數位身分證除事前軍事機密等級晶片防護個資外,也有法律罰則可作為嚇阻之用。

 

C.其他識別卡晶片化沒問題,唯獨身分證就不行?
個人識別的工具晶片數位化是趨勢,舉凡信用卡、金融卡、健保卡、電信門號..早就晶片數位化,對資安或隱私保護只有變更好。高舉反對身分證晶片數位化的人,難道沒有使用信用卡、金融卡、健保卡、電信門號..? 上述卡片爽爽用,卻堅決反對身分證數位晶片化,豈不怪哉?

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

 

反對「數位身分識別證」民眾理由之一是認為數位身分識別證將擁有”巨無霸”的功能,將具備個人隱私資料、健保、財產、稅務、駕照、悠遊卡、聯屬公投、手機…等等。不過,根據目前內政部釋出訊息,因民眾對資安的疑慮,台灣數位身分識別証只有身分證+個人自然人憑證功能,並無成為”巨無霸”功能規劃,這個反對理由有些無限上綱、 杞人憂天。

全面換發新式身分證,要花30~40億公帑,太浪費!?
數位化應用是擋不住的世界潮流,別人已經上太空,台灣還要停留在殺豬公? 這次台灣面臨新冠肺炎疫情能夠讓民眾有條不紊領取口罩,讓台灣防疫成果為人稱道,健保卡採取晶片數位化設計功不可沒。身分證全面換成晶片數位化設計,是台灣邁入現代數位智慧社會必要的投資,40億公帑投入是必要且划算的。

 

3.新式身分證的資安保護萬無一失嗎? 資安破口會是在哪裡?

雖然新式數位身分證在隱私保密與資安上都有水準以上的保護,但全世界沒有產品可以保證在資安是萬無一失的。就版主的觀點,新式數位身分證的資安破口並不是新式身分證晶片會容易被破解,而是來自使用者的【壞習慣】。根據目前新式身分證的設計規劃,版主認為將可能會有五大資費破口,說明如下:

A.遺失機會變大,如何及時掛失配套措施很重要:
由於新式身分證具自然人憑證功能,在多數人大都習慣隨身攜帶身分證下,不慎遺失的機會就會變高出很多,自然會增加被冒用風險。幸好,若新式身分證遺失比照現行自然人憑證的暫時停用及緊急停用功能,只要多加宣導,應該可以將風險降到最低。

 

B.三組密碼設計,用戶容易設定不安全密碼:
由於新式身分證具備三道密碼功能,其中加密區及自然人憑證區的密碼必須自設,這對於許多三寶人物或是對於個資安全較為忽略的人,很容易採用懶人密碼,導致被破解冒用。再者,目前每個人數位帳號滿天飛,密碼萬一遺失,如何有較安全的機制重設,也需要仔細考量,才不會變成破口。

 

C.第三方中介軟體不安全:
新式身分證支援自然人憑證功能以後,國人使用其功能的頻度將可望出現爆炸性增加。然新式身分證被讀取機會越多,若使用不安全第三方的中介軟體,就有可能出現密碼或卡片個資被側錄產生風險。教導民眾安全使用第三方中介軟體,也是未來新式身分證普及後的重要課題。

 

D.隱私過度保護,與目前商業認證衝突,反而造成資安大缺口:
這次新式身分證可能為杜悠悠之口,將新式身分證的卡面上資訊最小化,弱化身分證原本認證功能,朝自然人憑證IC卡化方向設計。然而身分證是目前許多商業行為(如申辦門號或信用卡)最重要的認證工具,將現行紙本身分證的許多重要資訊埋入必須使用密碼的公開區或加密區後,反而會造成擾民且導致個資更容易被洩漏。
以申辦電信門號為例,為防止出現盜偽件或欠費問題,根據現行電信業者門號申裝書填寫與查核規定,申辦店家必須查核申辦者的戶籍地址是否正確且需要填寫完整的身分證換補紀錄。然而這些資訊已經不在新式身分證的卡片上,就會衍生店家必須將被隱藏的戶籍地址..相關個資螢幕列印出來附在門號書上以佐證已經做好相關查核,這將造成民眾申辦門號許多麻煩,新式身分證公開區或加密區的資料被列印出來,也容易衍生個資外洩風險。

 

版主強烈建議內政部趕快找電信業者與銀行業者來商討,將民眾生活息息相關的門號、信用卡、金融卡申辦規範做一檢核,研擬出妥適的新式身分證卡面資訊項目。
身分證就是身分證,千萬不要本末倒置,卡面個資最小化只是擾民,這並非德政。

 

E.新式身分證用途多,家賊難防,危害可能變更大:
社會上一直有部分民眾財務或智慧有缺口,自願或被騙將身分證借給不肖份子使用。因新式身分證具備自然人憑證功能,未來所產生的危害也會更大。除用法律懲戒來防堵外,如何事前防堵未來也是重要課題。

 

天底下沒有萬無一失的資安保護,誠實面對可能的缺失,提前加以防範,才是解決民眾疑慮的良方。目前台灣民眾對於台灣「數位身分識別證」資安的疑慮,除了內政部的宣傳有待加強外,關鍵還是在於有些民眾或政治人物對於政府的不信任,與台灣防疫該不該採取普篩的爭論類似。
世界在進步,台灣要前進,國民身分證全面改用數位晶片化絕對是條必走的路。新式身分證對於隱私與個資保護比現行紙本身分證還要好,所以大家其實不用因噎廢食。針對版主提出的新式身分證可能出現的資安破口,只要主管機關能夠提前佈署及因應,將可能產生的民怨降到最低,相信全換換發國民數位身分證才可以讓這把數位鑰匙可以順利帶領國人通往璀璨與便利的數位智慧生活大道上!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

一篇有趣的負載均衡算法實現_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

文章已經收錄在 Github.com/niumoo/JavaNotes ,更有 Java 程序員所需要掌握的核心知識,歡迎Star和指教。
歡迎關注我的公眾號,文章每周更新。

負載平衡(Load balancing)是一種在多個計算機(網絡、CPU、磁盤)之間均勻分配資源,以提高資源利用的技術。使用負載均衡可以最大化服務吞吐量,可能最小化響應時間,同時由於使用負載均衡時,會使用多個服務器節點代單點服務,也提高了服務的可用性。

負載均衡的實現可以軟件可以硬件,硬件如大名鼎鼎的 F5 負載均衡設備,軟件如 NGINX 中的負載均衡實現,又如 Springcloud Ribbon 組件中的負載均衡實現。

如果看到這裏你還不知道負載均衡是幹嘛的,那麼只能放一張圖了,畢竟沒圖說個啥。

負載均衡要做到在多次請求下,每台服務器被請求的次數大致相同。但是實際生產中,可能每台機器的性能不同,我們會希望性能好的機器承擔的請求更多一些,這也是正常需求。

如果這樣說下來你看不懂,那我就再舉個例子好了,一排可愛的小熊(服務器)站好。

這時有人(用戶)要過來打臉(請求訪問)。

那麼怎麼樣我們才能讓這每一個可愛的小熊被打的次數大致相同呢?

又或者熊 4 比較胖,抗擊打能力是別人的兩倍,我們怎麼提高熊 4 被打的次數也是別人的兩倍呢?

又或者每次出手的力度不同,有重有輕,恰巧熊 4 總是承受這種大力度啪啪打臉,熊 4 即將不省熊事,還要繼續打它嗎?

這些都是值的思考的問題。

說了那麼多,口乾舌燥,我雙手已經饑渴難耐了,迫不及待的想要擼起代碼了。

1. 隨機訪問

上面說了,為了負載均衡,我們必須保證多次出手后,熊 1 到熊 4 被打次數均衡。比如使用隨機訪問法,根據數學上的概率論,隨機出手次數越多,每隻熊被打的次數就會越相近。代碼實現也比較簡單,使用一個隨機數,隨機訪問一個就可以了。

/** 服務器列表 */
private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}

/**
 * 隨機路由算法
 */
public static String random() {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    // 隨機數隨機訪問
    int randomInt = new Random().nextInt(tempList.size());
    return tempList.get(randomInt);
}

因為使用了非線程安全的集合,所以在訪問操作時操作的是集合的拷貝,下面幾種輪詢方式中也是這種思想。

寫一個模擬請求方法,請求10w次,記錄請求結果。

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

public static void main(String[] args) {
    HashMap<String, Integer> serverMap = new HashMap<>();
    for (int i = 0; i < 20000; i++) {
        String server = random();
        Integer count = serverMap.get(server);
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        // 記錄
        serverMap.put(server, count);
    }
    // 路由總體結果
    for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
        System.out.println("IP:" + entry.getKey() + ",次數:" + entry.getValue());
    }
}

運行得到請求結果。

IP:192.168.1.3,次數:24979
IP:192.168.1.2,次數:24896
IP:192.168.1.5,次數:25043
IP:192.168.1.4,次數:25082

每台服務器被訪問的次數都趨近於 2.5w,有點負載均衡的意思。但是隨機畢竟是隨機,是不能保證訪問次數絕對均勻的。

2. 輪詢訪問

輪詢訪問就簡單多了,拿上面的熊1到熊4來說,我們一個接一個的啪啪 – 打臉,熊1打完打熊2,熊2打完打熊3,熊4打完打熊1,最終也是實現了被打均衡。但是保證均勻總是要付出代價的,隨機訪問中需要隨機,輪詢訪問中需要什麼來保證輪詢呢?

/** 服務器列表 */
private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}
private static Integer index = 0;

/**
 * 隨機路由算法
 */
public static String randomOneByOne() {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    String server = "";
    synchronized (index) {
        index++;
        if (index == tempList.size()) {
            index = 0;
        }
        server = tempList.get(index);;
    }
    return server;
}

由代碼里可以看出來,為了保證輪詢,必須記錄上次訪問的位置,為了讓在併發情況下不出現問題,還必須在使用位置記錄時進行加鎖,很明顯這種互斥鎖增加了性能開銷。

依舊使用上面的測試代碼測試10w次請求負載情況。

IP:192.168.1.3,次數:25000
IP:192.168.1.2,次數:25000
IP:192.168.1.5,次數:25000
IP:192.168.1.4,次數:25000

3. 輪詢加權

上面演示了輪詢方式,還記的一開始提出的熊4比較胖抗擊打能力強,可以承受別人2倍的挨打次數嘛?上面兩種方式都沒有體現出來熊 4 的這個特點,熊 4 竊喜,不痛不癢。但是熊 1 到 熊 3 已經在崩潰的邊緣,不行,我們必須要讓胖着多打,能者多勞,提高整體性能。

/** 服務器列表 */
private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
    serverMap.put("192.168.1.2", 2);
    serverMap.put("192.168.1.3", 2);
    serverMap.put("192.168.1.4", 2);
    serverMap.put("192.168.1.5", 4);
}
private static Integer index = 0;

/**
 * 加權路由算法
 */
public static String oneByOneWithWeight() {
    List<String> tempList = new ArrayList();
    HashMap<String, Integer> tempMap = new HashMap<>();
    tempMap.putAll(serverMap);
    for (String key : serverMap.keySet()) {
        for (int i = 0; i < serverMap.get(key); i++) {
            tempList.add(key);
        }
    }
    synchronized (index) {
        index++;
        if (index == tempList.size()) {
            index = 0;
        }
        return tempList.get(index);
    }
}

這次記錄下了每台服務器的整體性能,給出一個數值,數值越大,性能越好。可以承受的請求也就越多,可以看到服務器 192.168.1.5 的性能為 4,是其他服務器的兩倍,依舊 10 w 請求測試。

IP:192.168.1.3,次數:20000
IP:192.168.1.2,次數:20000
IP:192.168.1.5,次數:40000
IP:192.168.1.4,次數:20000

192.168.1.5 承擔了 2 倍的請求。

4. 隨機加權

隨機加權的方式和輪詢加權的方式大致相同,只是把使用互斥鎖輪詢的方式換成了隨機訪問,按照概率論來說,訪問量增多時,服務訪問也會達到負載均衡。

/** 服務器列表 */
private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
    serverMap.put("192.168.1.2", 2);
    serverMap.put("192.168.1.3", 2);
    serverMap.put("192.168.1.4", 2);
    serverMap.put("192.168.1.5", 4);
}
/**
 * 加權路由算法
 */
public static String randomWithWeight() {
    List<String> tempList = new ArrayList();
    HashMap<String, Integer> tempMap = new HashMap<>();
    tempMap.putAll(serverMap);
    for (String key : serverMap.keySet()) {
        for (int i = 0; i < serverMap.get(key); i++) {
            tempList.add(key);
        }
    }
    int randomInt = new Random().nextInt(tempList.size());
    return tempList.get(randomInt);
}

依舊 10 w 請求測試,192.168.1.5 的權重是其他服務器的近似兩倍,

IP:192.168.1.3,次數:19934
IP:192.168.1.2,次數:20033
IP:192.168.1.5,次數:39900
IP:192.168.1.4,次數:20133

5. IP-Hash

上面的幾種方式要麼使用隨機數,要麼使用輪詢,最終都達到了請求的負載均衡。但是也有一個很明顯的缺點,就是同一個用戶的多次請求很有可能不是同一個服務進行處理的,這時問題來了,如果你的服務依賴於 session ,那麼因為服務不同, session 也會丟失,不是我們想要的,所以出現了一種根據請求端的 ip 進行哈希計算來決定請求到哪一台服務器的方式。這種方式可以保證同一個用戶的請求落在同一個服務上。

private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}

/**
 * ip hash 路由算法
 */
public static String ipHash(String ip) {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    // 哈希計算請求的服務器
    int index = ip.hashCode() % serverList.size();
    return tempList.get(Math.abs(index));
}

6. 總結

上面的四種方式看似不錯,那麼這樣操作下來真的體現了一開始說的負載均衡嗎?答案是不一定的。就像上面的最後一個提問。

又或者每次出手的力度不同,有重有輕,恰巧熊 4 總是承受這種大力度啪啪打臉,熊 4 即將不省熊事,還要繼續打它嗎?

服務器也是這個道理,每次請求進行的操作對資源的消耗可能是不同的。比如說某些操作它對 CPU 的使用就是比較高,也很正常。所以負載均衡有時不能簡單的通過請求的負載來作為負載均衡的唯一依據。還可以結合服務的當前連接數量、最近響應時間等維度進行總體均衡,總而言之,就是為了達到資源使用的負載均衡。

最後的話

文章已經收錄在 Github.com/niumoo/JavaNotes ,歡迎Star和指教。更有一線大廠面試點,Java程序員需要掌握的核心知識等文章,也整理了很多我的文字,歡迎 Star 和完善,希望我們一起變得優秀。

文章有幫助可以點個「贊」或「分享」,都是支持,我都喜歡!
文章每周持續更新,要實時關注我更新的文章以及分享的乾貨,可以關注「 未讀代碼 」公眾號或者我的博客。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

Node.js躬行記(2)——文件系統和網絡_台北網頁設計台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

一、文件系統

  fs模塊可與文件系統進行交互,封裝了常規的POSIX函數。POSIX(Portable Operating System Interface,可移植操作系統接口)是UNIX系統的一個設計標準。fs模塊提供了多個操作目錄和文件的方法,大多會有同步和異步兩種版本,同步的方法名稱會以Sync為後綴。

1)目錄處理

  fs模塊的readdir()方法可異步的讀取目錄內容,回調函數包含兩個參數,第一個是錯誤對象,第二個是一個包含文件名稱的數組,對應的同步方法是readdirSync()。在下面的示例中,當前目錄包含兩個文件,上一級目錄包含一個目錄名稱。

const fs = require('fs');
fs.readdir('./', (err, files) => {
  console.log(files);        //[ 'demo.txt', 'index.js' ]
});
fs.readdir('../', (err, files) => {
  console.log(files);        //[ '1' ]
});

  其它處理目錄的方法還有opendir()、mkdir()等。

2)讀寫文件

  在fs模塊中,可使用批量方法readFile()將文件內容一次性的加載到內存中,如下所示。

const fs = require('fs');
fs.readFile('./origin.txt', (err, buf) => {
  console.log(buf.toString());        //"hello Node.js"
});

  對應的寫入方法是writeFile(),如下所示,文件路徑、寫入內容和回調函數是必傳的參數。如果文件不存在,那麼會自動創建。

fs.writeFile('./target.txt', 'hello Node.js', (err) => {
  if (err) throw err;
  console.log('文件已被保存');
});

  當文件很大時,像上面這樣直接讀取會有問題,可以改用流式方法createReadStream(),分批次的讀取文件,如下所示,每次只讀7個字節的內容。

const readable = fs.createReadStream('./origin.txt', {highWaterMark: 7});
readable.on("data", (chunk) => {
  /*************/
  /* "hello N"
  /* "ode.js"
  /************/
  console.log(chunk.toString());
});

  通過管道方法pipe()將origin.txt中的內容寫入到target-stream.txt中,如下所示,對於不存在的文件,也會自動創建。

const writable = fs.createWriteStream('./target-stream.txt');
readable.pipe(writable);

3)文件描述

  fs模塊的stat()方法可讀取文件的描述信息,如下所示。

fs.stat('./demo.txt', (err, stats) => {
  console.log(stats);
});

  回調函數中的stats參數是一個fs.Stats對象,其屬性如下所示。它還包含一些判斷方法,例如isDirectory()、isFile()等。

Stats {
  dev: 195650,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: undefined,
  ino: 36873221949682120,
  size: 13,
  blocks: undefined,
  atimeMs: 1586227933993.0217,
  mtimeMs: 1585882949091.0166,
  ctimeMs: 1586227933995.0222,
  birthtimeMs: 1586227933993.0217,
  atime: 2020-04-07T02:52:13.993Z,
  mtime: 2020-04-03T03:02:29.091Z,
  ctime: 2020-04-07T02:52:13.995Z,
  birthtime: 2020-04-07T02:52:13.993Z
}

  fs模塊還提供了fstat()方法,在功能上與stat()等價,只是fstat()方法的第一個參數是文件描述符。在POSIX系統中,文件描述符是一個正整數,它實際上是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當打開或創建一個文件時,就會被分配一個文件描述符。

  在下面的示例中,open()方法的回調函數中包含一個fd參數(即文件描述符),搭配fstat()方法就能讀取文件信息。

fs.open('./demo.txt', 'r', (err, fd) => {
  fs.fstat(fd, (err, stats) => {
    console.log(stats);
  });
});

4)監控文件

  fs模塊提供了兩種方法來監控文件:watch()和watchFile(),前者能監控文件或目錄的更改,後者只能監控文件的更改。

  watch()方法的監聽器回調包含兩個參數,第一個是事件類型(包括rename和change),第二個是觸發事件的文件名稱,如下所示。

fs.watch('./demo.txt', (eventType, filename) => {
  console.log(eventType, filename);
});

  執行node命令后,每次更改demo.txt文件,就會在控制台打印出下面這條語句。

$ node index.js
change demo.txt

  雖然watch()方法的性能優於watchFile()方法,但是watch()不是一個跨平台的方法,其表現在各個平台中並非百分百一致(例如filename參數不能保證提供),而watchFile()是跨平台的。

5)異步文件

  fs.promises是Node提供的一組備用的異步文件系統方法,它們會返回Promise對象而不是通過回調來處理結果。例如以Promise的方式使用stat()方法,如下所示。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

const fsPromises = require('fs').promises;
fsPromises.stat('./demo.txt').then(stats => {
  console.log(stats);
});

二、網絡

  Node可以處理的網絡協議包括HTTP、TCP、HTTPS等,本節將會重點分析HTTP協議。Node中的http模塊基於net、stream、events等模塊,提供了一系列的網絡傳輸的底層API,可創建HTTP服務器和客戶端,包含重定向、代理、上傳數據等功能。

1)HTTP服務器

  通過http.createServer()方法就能創建HTTP服務器,其內部會調用net.Server()方法,返回一個http.Server實例。當服務被創建后,就能通過server.listen()方法監聽一個端口。

  在下面的示例中,監聽的端口是8000,createServer()的回調函數包含兩個參數:req和res,分別表示HTTP的請求和響應,前者是IncomingMessage類(一個可讀流)的實例,後者是ServerResponse類(一個可寫流)的實例。__dirname是一個全局變量,保存着當前文件所處的路徑。

const http = require('http'); 
const fs = require('fs'); 
const server = http.createServer(function (req, res) {
  fs.readFile(__dirname + "/index.html", function (err, data) {
    if (err) {
      res.statusCode = 500;
      res.end(String(err));
    } else {
      res.end(data);
    }
  });
}).listen(8000);

  在回調函數中,可修改或解析響應報文,例如像上面當發生錯誤時,將狀態碼改成500。在瀏覽器中訪問http://localhost:8000,就能通過end()方法在頁面中輸出index.html的文件內容。

  注意,必須調用響應對象的end()方法結束此次響應,如果省略,那麼頁面將會一直處於加載中,阻塞內容渲染。

  http.Server包含一組事件,例如connection和request,如下所示。前者會在建立新的TCP流時觸發,後者會在每次請求服務器時觸發。

server.on("connection", function (socket) {
  console.log(connection");
});
server.on("request", function (req, res) {
  console.log('request');
});

2)重定向

  3XX格式的狀態碼用於重定向,例如在Node中實現302跳轉,如下所示。

http.createServer(function (req, res) {
  if(req.url == '/strick') {
    res.writeHead(302, {'Location': 'http://www.pwstrick.com'});
  }
  res.end();
}).listen(8000);

  當瀏覽器訪問http://localhost:8000/strick時,才會執行重定向。writeHead()方法可一次性設置響應的狀態碼和所有的首部。如果只想設置單個響應首部,可以使用setHeader()方法。

3)上傳數據

  在實際的業務開發中,免不了上傳數據的需求,例如表單提交、圖像上傳等。下面是一張form表單,包含一個文本框和一個提交按鈕。

<form action="http://localhost:8000" method="post">
  <input type="text" name="name" />
  <button type="submit">提交</button>
</form>

  點擊提交按鈕,會將整張表單提交到HTTP服務器(代碼如下所示),假設文本框中輸入的內容為“咖啡機strick”。

const http = require('http');
const querystring = require('querystring');

const server = http.createServer(function (req, res) {
  //聲明Content-Type響應首部,以免中文亂碼
  res.setHeader("Content-Type", "application/json; charset=utf-8");
  const arr = [];
  req.on("data", chunk => {
    arr.push(chunk);
  });
  req.on("end", () => {
    const buf = Buffer.concat(arr);        //拼接Buffer數據
    const params = querystring.decode(buf.toString());
    console.log(params.name);             //"咖啡機strick"
    res.write(JSON.stringify(params));    //響應數據
    res.end();
  });
}).listen(8000);

  在data事件中接收數據並添加到arr數組中,然後在end事件中由Buffer.concat()方法拼接Buffer數據。querystring模塊的decode()方法可將查詢字符串解析成一個對象。write()方法會將響應數據發送給客戶端。

4)客戶端服務

  http模塊提供了request()方法,可讓客戶端向服務器發起請求。在下面的示例中,postData變量是要發送的數據,options變量是各種配置參數,包括請求首部的信息。

const http = require('http'); 
const querystring = require('querystring');

const postData = querystring.stringify({
  'name': '咖啡機strick'
});
const options = {
  hostname: 'localhost',
  port: 8000,
  path: '/',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};
const req = http.request(options, (res) => {
  const code = res.statusCode;                    //狀態碼
  const headers = JSON.stringify(res.headers);       //響應首部
  res.setEncoding('utf8');         //為可讀流設置字符編碼
  res.on('data', (chunk) => {
    console.log(chunk);            //響應數據
  });
  res.on('end', () => {
    console.log('響應中已無數據');
  });
});
req.write(postData);
req.end();

  注意,在請求最後需要調用end()方法,結束本次請求。Node還提供了一個基於request()的便捷方法:get(),它會自動調用req.end()方法,並且請求方法是GET。

5)代理

  代理是一種特殊的網絡服務,允許一個客戶端通過這個服務與目標服務器進行間接的連接,也就是在它們之間建立了一層中轉,可用來過濾廣告、控制內部資源的訪問權限、保障終端的隱私或安全等。

  http模塊可搭建出一個簡易的HTTP代理服務器,下面示例引用自《Node.js硬實戰》技巧52一節。

const http = require('http');
const url = require('url');
http.createServer(function (req, res) {
  const options = url.parse(req.url);  //一個URL對象
  options.headers = req.headers;
  
  req.on('data', chunk => {            //將請求的原始數據發送給代理
    proxyRequest.write(chunk);
  });
  req.on('end', chunk => {             //完成原始請求
    proxyRequest.end();
  });
  
  //複製原始請求
  const proxyRequest = http.request(options, proxyResponse => {
    proxyResponse.on('data', chunk => {    //將響應的原始數據發送給客戶端
      res.write(chunk);
    });
    proxyResponse.on('end', chunk => {     //完成代理請求
      res.end();
    });
    //將響應報文發送給客戶端
    res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
  });
}).listen(8000);

  url模塊的parse()方法能將字符串轉換成一個URL對象。在綁定請求對象的data事件后,就能將客戶端的請求數據發送給代理。通過http.request()方法發起一次代理請求,並將服務器的響應數據發送給客戶端。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

第四篇-用Flutter手擼一個抖音國內版,看看有多炫_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

前言

這次對布局進行優化,主要包含了首頁tabview pageview 以及添加幾個按鈕的操作過程.主要使用到stack層疊布局,tabpview和pageview,tabview兩個頁面,一個關注,一個推薦,左右切換,pageview被包含在tabview裏面.

布局優化

抖音的頂部appbar 是懸浮層疊展示,而flutter的層疊組件是stack, 因此最外面採用stack, 其次中間是tabview,分別是關注和推薦兩個選項卡,關注在沒有登錄的時候會彈出一個提示需要認證登錄的頁面,這裏加了兩個頁面,subscriptionScreen.dart,另外一個是loginScreen.dart

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      //backgroundColor: Colors.transparent,
      body: Stack(
        //fit: StackFit.expand,
        children: <Widget>[
          TabBarView(
            controller: _tabController,
            children: <Widget>[
              Subscription(),
              PageView(
                allowImplicitScrolling: true,
                controller: _pageController,
                children: <Widget>[
                  Trending(),
                ],
                onPageChanged: (int index) {
                  setState(() {
                    currentIndex = index;
                  });
                },
              ),
            ],
          ),
          Column(
            children: [
              AppBar(
                backgroundColor: Colors.transparent,
                elevation: 0,
                centerTitle: true,
                leading: IconButton(
                    icon: Icon(Icons.tv),
                    onPressed: () {
                      print('點擊了直播按鈕');
                    }),
                actions: <Widget>[
                  //導航欄右側菜單
                  IconButton(
                      icon: Icon(Icons.search),
                      onPressed: () {
                        print('點擊了搜索按鈕');
                      }),
                ],
                title: TabBar(
                  indicator: UnderlineTabIndicator(
                      borderSide: BorderSide(width: 2.0, color: Colors.white),
                      insets: EdgeInsets.symmetric(horizontal: 18.0)),
                  labelStyle: TextStyle(fontSize: 18),
                  isScrollable: true,
                  controller: _tabController,
                  tabs: toptabs,
                  onTap: (index) {
                    print(index);
                  },
                ),
              )
            ],
          ),
        ],
      ),
      bottomNavigationBar: bottomItems(),
    );
  }

  

底部彈出提示認證頁面

在 onTap 方法里

Scaffold.of(context).showBottomSheet<void>((BuildContext context) {
          return Login();
        });

BottomSheet 是一個底部滑出的組件

new BottomSheet(
    onClosing: () {},
    builder: (BuildContext context) {
        return new Text('aaa');
    },
),

通常很少直接使用 BottomSheet 而是使用 showModalBottomSheet。直接時候的時候看到的知識 builder 里的內容。

Future<T> showModalBottomSheet <T>({
    @required BuildContext context,
    @required WidgetBuilder builder
});

看一個示例

new MaterialButton(
    color: Colors.blue,
    child: new Text('點我'),
    onPressed: () {
        showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
                return new Container(
                    height: 300.0,
                    child: new Image.network(this.imgurl),
                );
            },
        ).then((val) {
            print(val);
        });
 

 

 具體詳細介紹參考官網.

 

 

關注頁面

 

 整個頁面布局,左右都有邊距,頂部也有邊距,所有採用Container包含,邊距使用padding: EdgeInsets.only(top: 150.0, left: 65.0, right: 65.0),  背景顏色 color: Color.fromRGBO(14, 15, 26, 1),依次image,另外使用sizebox佔用空間,

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

其他的中間層都是居中,所以採用center都是居中,另外登錄按鈕是佔滿屏幕的,所以也採用SizeBox,並且把width:設置為double.infinity,這樣就佔滿屏幕,button採用默認的RaisedButton,在button的onpressed事件調用showBottomSheet

import 'package:flutter/material.dart';
import 'package:flutter_app/Screens/loginScreen.dart';

class Subscription extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _SubscriptionState();
}

class _SubscriptionState extends State<Subscription>
    with TickerProviderStateMixin {
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 150.0, left: 65.0, right: 65.0),
      color: Color.fromRGBO(14, 15, 26, 1),
      child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Image(image: AssetImage("assets/images/int_1581491273221.png")),
            SizedBox(height: 20),
            Center(
              child: Text(
                '你還沒有登錄',
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 20.0,
                    fontWeight: FontWeight.w400),
              ),
            ),
            SizedBox(height: 10),
            Center(
              child: Text(
                '登錄賬號,查看你關注的精彩內容',
                style: TextStyle(
                    color: Color.fromRGBO(253, 253, 253, 0.6),
                    fontSize: 14.0,
                    fontWeight: FontWeight.w400),
              ),
            ),
            SizedBox(height: 20),
            SizedBox(
              width: double.infinity,
              child: RaisedButton(
                color: Color.fromRGBO(252, 1, 86, 1),
                child: Text(
                  '登錄',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () {
                  Scaffold.of(context)
                      .showBottomSheet<void>((BuildContext context) {
                    return Login();
                  });
                },
              ),
            ),
          ]),
    );
  }
}

 

登錄頁面

布局如下圖:

 

 

這個頁面整體布局頂部,左右都有邊距,因此使用Container比較合適,設置背景顏色為color: Colors.white, 邊距設置為padding:EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0, bottom: 50.0),整體布局採用Column,因為是上下布局,因此Column 設置

crossAxisAlignment: CrossAxisAlignment.start,頂部的布局是左邊一個clear圖標按鈕,右邊一個幫助按鈕,所以使用
Row布局,並且設置Row的mainAxisAlignment: MainAxisAlignment.spaceBetween,這樣就左右布局了,其他依次採用SizeBox佔位, 中間則採用Center來展示文字控件,底部的登錄部分因為包含標籤 超鏈接,所有採用RichText比較合適,包含TextSpan即可.

全部代碼如下:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

class Login extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  TapGestureRecognizer _myTapGestureRecognizer;
  @override
  void initState() {
    super.initState();
    _myTapGestureRecognizer = TapGestureRecognizer()
      ..onTap = () {
        launch('https://open.douyin.com/platform');
      };
  }

  @override
  void dispose() {
    _myTapGestureRecognizer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      padding:
          EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0, bottom: 50.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              IconButton(
                icon: Icon(Icons.clear),
                onPressed: () {
                  Navigator.pop(context);
                },
                color: Colors.black,
              ),
              Text('幫助', style: TextStyle(color: Colors.black)),
            ],
          ),
          SizedBox(
            height: 150.0,
          ),
          Center(
            child: Text('180****2520',
                style: TextStyle(color: Colors.black, fontSize: 38)),
          ),
          Center(
            child: Text('認證服務由中國電信提供',
                style: TextStyle(
                    color: Color.fromRGBO(53, 53, 53, 1), fontSize: 12)),
          ),
          SizedBox(
            height: 50.0,
          ),
          SizedBox(
            width: double.infinity,
            child: RaisedButton(
              color: Color.fromRGBO(252, 1, 86, 1),
              child: Text(
                '本機號碼一鍵登錄',
                style: TextStyle(color: Colors.white),
              ),
              onPressed: () {
                showBottomSheet(
                    context: context, builder: (context) => Login());
              },
            ),
          ),
          SizedBox(
            height: 2.0,
          ),
          SizedBox(
            width: double.infinity,
            child: OutlineButton(
              color: Color.fromRGBO(252, 1, 86, 1),
              child: Text(
                '其他手機號碼登錄',
                style: TextStyle(color: Colors.black),
              ),
              onPressed: () {
                showBottomSheet(
                    context: context, builder: (context) => Login());
              },
            ),
          ),
          SizedBox(
            height: 5.0,
          ),
          Center(
              child: RichText(
            text: TextSpan(
              children: [
                TextSpan(
                  text: '登錄即表明同意',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '用戶協議',
                  style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '和',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '隱私政策',
                  style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                ),
              ],
            ),
          )),
          Center(
              child: RichText(
            text: TextSpan(
              children: [
                TextSpan(
                  text: '以及',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                    text: '《中國電信認證服務條款》',
                    style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                    recognizer: _myTapGestureRecognizer),
              ],
            ),
          )),
          Expanded(
              flex: 1,
              child: Center(
                  heightFactor: 25.0,
                  child: Text('其他方式登錄',
                      style:
                          TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8))))),
        ],
      ),
    );
  }
}

變更記錄

本次變更主要體現在首頁的選項卡設計,需要層疊展示,並且透明的採用appbar显示出頂部的關注、推薦按鈕,另外新增了關注頁,登錄頁,並且把底部按鈕以及右邊的按鈕都加上了觸發時間

 

接下來要完成的雙擊心形按鈕點贊,評論頁面,分享頁面,這些都可以採用showmodalbottomsheet方法打開一個底部抽屜頁面

 

還有底部的首頁刷新,消息頁面,拍短視頻頁面,消息頁面,我的個人信息頁面

 

結語

請繼續關注本博客,其他頁面持續更新完成,源碼地址:https://github.com/WangCharlie/douyin,歡迎fork和star,謝謝!!!

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊