<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4753782280520564049</id><updated>2024-10-02T18:53:07.207+08:00</updated><category term="ORACLE"/><category term="PHP"/><category term="ASP.NET"/><category term="MISC"/><category term="MSSQL"/><category term="Raspberry Pi"/><category term="DIY"/><category term="UNIX"/><category term="Python"/><category term="Windows"/><category term="Android"/><category term="Apache"/><category term="C#"/><category term="GPS"/><category term="Linux"/><category term="SSRS"/><category term="API"/><category term="Elasticsearch"/><category term="Google"/><category term="Joomla"/><category term="Kibana"/><category term="Swagger"/><category term="Xamarin"/><category term="filebeat"/><category term="Anaconda"/><category term="CUDA"/><category term="Flask"/><category term="Git"/><category term="JavaScript"/><category term="Keras"/><category term="Line Bot"/><category term="MySQL"/><category term="NSwag"/><category term="Nodejs"/><category term="OpenSource"/><category term="Projectfork"/><category term="RapiDoc"/><category term="SQLite"/><category term="SVN"/><category term="Swashbuckle"/><category term="Teamviewer"/><category term="Tensorflow"/><category term="VB.NET"/><category term="VB6"/><category term="VM"/><category term="ZXing"/><category term="adafruit_circuitpython_dht"/><category term="bower"/><category term="cuDNN"/><category term="dht22"/><category term="letsencrypt"/><category term="pymssql"/><category term="syslog"/><category term="virtualenv"/><category term="wsgi"/><title type='text'>賈霸金營</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-1286453977515592077</id><published>2022-05-31T11:52:00.006+08:00</published><updated>2022-05-31T11:52:57.906+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="NSwag"/><category scheme="http://www.blogger.com/atom/ns#" term="Swagger"/><category scheme="http://www.blogger.com/atom/ns#" term="Swashbuckle"/><title type='text'>在Swagger UI 中顯示Controller的描述字詞</title><content type='html'>Controller的描述字詞,如下圖所示:

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVBQIw6NGtZr_g2SsFs0ln0cosfkPbxZEDBiR-73IC4pDs9a2HRGhGhuwD_WebJrIDMCG2wYFC2pHGLusB0hXdoqjIkAaAJPYCnqjaQ_Pt8v6uG2mE_9JdfojGECxbE23utsUYl5dMlxTsskItyYxtbWFE7Vya6I_9S8u6MCA-e33w5RNlTh5devL8TQ/s1296/2022-05-31_112050.png&quot; style=&quot;display: block; padding: 1em 0px; text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;523&quot; data-original-width=&quot;1296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVBQIw6NGtZr_g2SsFs0ln0cosfkPbxZEDBiR-73IC4pDs9a2HRGhGhuwD_WebJrIDMCG2wYFC2pHGLusB0hXdoqjIkAaAJPYCnqjaQ_Pt8v6uG2mE_9JdfojGECxbE23utsUYl5dMlxTsskItyYxtbWFE7Vya6I_9S8u6MCA-e33w5RNlTh5devL8TQ/s320/2022-05-31_112050.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
顯示方法,兩種NuGet套件,也包含了顯示方法的註解&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Swashbuckle:&lt;/div&gt;&lt;div&gt;1. Program.cs&lt;/div&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;Services.AddSwaggerGen(c =&amp;gt;&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; var xmlFile = $&quot;{Assembly.GetExecutingAssembly().GetName().Name}.xml&quot;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; c.IncludeXmlComments(xmlPath, includeControllerXmlComments: true);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NSwag:&lt;/div&gt;&lt;div&gt;1.Edit &amp;lt;project_name&amp;gt;.csproj,加入以下項目&lt;/div&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;GenerateDocumentationFile&amp;gt;true&amp;lt;/GenerateDocumentationFile&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;NoWarn&amp;gt;$(NoWarn);1591&amp;lt;/NoWarn&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2.Program.cs&lt;/div&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;Services.AddSwaggerDocument(config =&amp;gt;&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; config.UseControllerSummaryAsTagDescription = true;&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/1286453977515592077/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2022/05/swagger-ui-controller.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1286453977515592077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1286453977515592077'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2022/05/swagger-ui-controller.html' title='在Swagger UI 中顯示Controller的描述字詞'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVBQIw6NGtZr_g2SsFs0ln0cosfkPbxZEDBiR-73IC4pDs9a2HRGhGhuwD_WebJrIDMCG2wYFC2pHGLusB0hXdoqjIkAaAJPYCnqjaQ_Pt8v6uG2mE_9JdfojGECxbE23utsUYl5dMlxTsskItyYxtbWFE7Vya6I_9S8u6MCA-e33w5RNlTh5devL8TQ/s72-c/2022-05-31_112050.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-2203525722665002082</id><published>2022-05-31T10:02:00.001+08:00</published><updated>2022-05-31T10:03:16.423+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="RapiDoc"/><category scheme="http://www.blogger.com/atom/ns#" term="Swagger"/><title type='text'>切換 Swagger UI 為 RapiDoc UI 的方式步驟</title><content type='html'>&lt;span style=&quot;font-family: Merriweather;&quot;&gt;開發環境: .net core 6.0 with MongoDB&amp;nbsp;&lt;/span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;程式功能: web API

&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;原本Swagger 的經典界面&amp;nbsp;&lt;a href=&quot;https://petstore.swagger.io/&quot; target=&quot;_blank&quot;&gt;Petstore&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;可以換換其他UI -&amp;gt;RapiDoc嚐鮮&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;1.NuGet安裝 IGeekFan.AspNetCore.RapiDoc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;2.Program.cs&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;add&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;using IGeekFan.AspNetCore.RapiDoc;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;then replace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; app.UseSwaggerUI(c =&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.SwaggerEndpoint(&quot;/swagger/api/swagger.json&quot;, &quot;myAPI&quot;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.RoutePrefix = &quot;swagger&quot;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;to&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; app.UseRapiDocUI(c =&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.SwaggerEndpoint(&quot;/swagger/api/swagger.json&quot;, &quot;myAPI&quot;);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.RoutePrefix = &quot;swagger&quot;;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;預設是黑色+側邊欄&amp;nbsp;&lt;a href=&quot;https://rapidocweb.com/examples/read-mode-dark.html#overview&quot; target=&quot;_blank&quot;&gt;Demo&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;如果API只有少數幾個是沒差&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;當你有數十個API時&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;有側邊欄的可讀性是大大加分&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;其他的設定,&lt;/span&gt;&lt;span style=&quot;font-family: Merriweather;&quot;&gt;有空再貼上來分享&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/2203525722665002082/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2022/05/swagger-ui-rapidoc-ui.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2203525722665002082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2203525722665002082'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2022/05/swagger-ui-rapidoc-ui.html' title='切換 Swagger UI 為 RapiDoc UI 的方式步驟'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-6665545330500529867</id><published>2021-11-09T12:05:00.004+08:00</published><updated>2021-11-09T12:08:24.716+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="letsencrypt"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><title type='text'>Raspberry Pi SSL 憑證 使用 Let&#39;s Encrypt 免費 服務</title><content type='html'>先執行系統更新
&lt;code&gt;
sudo apt-get update&lt;br&gt;
sudo apt-get upgrade&lt;br&gt;
&lt;/code&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
安裝套件(RASPI有用APACHE服務)
&lt;code&gt;
sudo apt-get install python-certbot-apache
&lt;/code&gt;

啟動設定(要先確認PORT 80及443是映射到樹莓派的80及443)
&lt;code&gt;
sudo certbot --apache
&lt;/code&gt;

以下是設置過程
&lt;code&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br&gt;
Plugins selected: Authenticator apache, Installer apache&lt;br&gt;
Enter email address (used for urgent renewal and security notices) (Enter &#39;c&#39; to&lt;br&gt;
cancel): XXXX@gmail.com&lt;br&gt;
&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
Please read the Terms of Service at&lt;br&gt;
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must&lt;br&gt;
agree in order to register with the ACME server at&lt;br&gt;
https://acme-v02.api.letsencrypt.org/directory&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
(A)gree/(C)ancel: A&lt;br&gt;
&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
Would you be willing to share your email address with the Electronic Frontier&lt;br&gt;
Foundation, a founding partner of the Let&#39;s Encrypt project and the non-profit&lt;br&gt;
organization that develops Certbot? We&#39;d like to send you email about our work&lt;br&gt;
encrypting the web, EFF news, campaigns, and ways to support digital freedom.&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
(Y)es/(N)o: Y&lt;br&gt;
&lt;br&gt;
Which names would you like to activate HTTPS for?&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
1: www.domain.net&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
Select the appropriate numbers separated by commas and/or spaces, or leave input&lt;br&gt;
blank to select all options shown (Enter &#39;c&#39; to cancel): 1&lt;br&gt;
Obtaining a new certificate&lt;br&gt;
Performing the following challenges:&lt;br&gt;
http-01 challenge for www.domain.net&lt;br&gt;
Enabled Apache rewrite module&lt;br&gt;
Waiting for verification...&lt;br&gt;
Cleaning up challenges&lt;br&gt;
Deploying Certificate to VirtualHost /etc/apache2/sites-enabled/default-ssl.conf&lt;br&gt;
&lt;br&gt;
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
1: No redirect - Make no further changes to the webserver configuration.&lt;br&gt;
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for&lt;br&gt;
new sites, or if you&#39;re confident your site works on HTTPS. You can undo this&lt;br&gt;
change by editing your web server&#39;s configuration.&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
Select the appropriate number [1-2] then [enter] (press &#39;c&#39; to cancel): 1&lt;br&gt;
&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
Congratulations! You have successfully enabled https://www.domain.net&lt;br&gt;
&lt;br&gt;
You should test your configuration at:&lt;br&gt;
https://www.ssllabs.com/ssltest/analyze.html?d=www.domain.net&lt;br&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br&gt;
&lt;br&gt;
IMPORTANT NOTES:&lt;br&gt;
 - Congratulations! Your certificate and chain have been saved at:&lt;br&gt;
   /etc/letsencrypt/live/www.domain.net/fullchain.pem&lt;br&gt;
   Your key file has been saved at:&lt;br&gt;
   /etc/letsencrypt/live/www.domain.net/privkey.pem&lt;br&gt;
   Your cert will expire on 2022-02-07. To obtain a new or tweaked&lt;br&gt;
   version of this certificate in the future, simply run certbot again&lt;br&gt;
   with the &quot;certonly&quot; option. To non-interactively renew *all* of&lt;br&gt;
   your certificates, run &quot;certbot renew&quot;&lt;br&gt;
 - Your account credentials have been saved in your Certbot&lt;br&gt;
   configuration directory at /etc/letsencrypt. You should make a&lt;br&gt;
   secure backup of this folder now. This configuration directory will&lt;br&gt;
   also contain certificates and private keys obtained by Certbot so&lt;br&gt;
   making regular backups of this folder is ideal.&lt;br&gt;
 - If you like Certbot, please consider supporting our work by:&lt;br&gt;
&lt;br&gt;
   Donating to ISRG / Let&#39;s Encrypt:   https://letsencrypt.org/donate&lt;br&gt;
   Donating to EFF:                    https://eff.org/donate-le&lt;br&gt;
&lt;/code&gt;

這樣就完成了！</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/6665545330500529867/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/11/raspberry-pi-ssl-lets-encrypt.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6665545330500529867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6665545330500529867'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/11/raspberry-pi-ssl-lets-encrypt.html' title='Raspberry Pi SSL 憑證 使用 Let&#39;s Encrypt 免費 服務'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-6101847023300289333</id><published>2021-04-15T12:02:00.002+08:00</published><updated>2021-04-19T20:36:36.259+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL"/><category scheme="http://www.blogger.com/atom/ns#" term="pymssql"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><title type='text'>在樹莓派(raspberry pi 4) 上安裝 pymssql 連接MS SQL</title><content type='html'>裝這pymssql套件,花了點時間爬文,做個記錄&lt;br&gt;
&lt;br&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
若安裝過程遇到下列訊息&lt;br&gt;
&lt;br&gt;
&lt;code&gt;error: command &#39;arm-linux-gnueabihf-gcc&#39; failed with exit status 1&lt;/code&gt;
&lt;br&gt;
照著下面步驟安裝就OK了&lt;br&gt;
&lt;code&gt;
sudo apt-get install python3-dev freetds-dev -y&lt;br&gt;
sudo apt-get install libffi-dev&lt;br&gt;
sudo apt-get install libzbar-dev&lt;br&gt;
sudo apt-get install clang -y&lt;br&gt;
sudo apt-get install libssl-dev&lt;br&gt;
&lt;/code&gt;
其他的套件&lt;br&gt;
&lt;code&gt;
pip3 install Cython&lt;br&gt;
pip3 install pymssql&lt;br&gt;
&lt;/code&gt;
最後的執行成功訊息
&lt;code&gt;pi@raspberrypi:~ $ pip3 install pymssql&lt;br&gt;
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple&lt;br&gt;
Collecting pymssql&lt;br&gt;
  Using cached https://files.pythonhosted.org/packages/da/bd/ebe3a088c8642e34f2f4ed9e0d58492ddca39e4aa3c57b42bf94d8bb974c/pymssql-2.2.0.tar.gz&lt;br&gt;
  Installing build dependencies ... done&lt;br&gt;
Building wheels for collected packages: pymssql&lt;br&gt;
  Running setup.py bdist_wheel for pymssql ... done&lt;br&gt;
  Stored in directory: /home/pi/.cache/pip/wheels/a9/09/de/27b23b9020f54a039101c9e7e9c65f27c53368bfba56204d40&lt;br&gt;
Successfully built pymssql&lt;br&gt;
Installing collected packages: pymssql&lt;br&gt;
Successfully installed pymssql-2.2.0&lt;br&gt;
&lt;/code&gt;
&lt;br&gt;
以下是官網所提供的範例:&lt;BR&gt;
&lt;code&gt;
conn = pymssql.connect(server, user, password, &quot;tempdb&quot;)&lt;BR&gt;
cursor = conn.cursor(as_dict=True)&lt;BR&gt;
&lt;BR&gt;
cursor.execute(&#39;SELECT * FROM persons WHERE salesrep=%s&#39;, &#39;John Doe&#39;)&lt;BR&gt;
for row in cursor:&lt;BR&gt;
    print(&quot;ID=%d, Name=%s&quot; % (row[&#39;id&#39;], row[&#39;name&#39;]))&lt;BR&gt;
&lt;BR&gt;
conn.close()&lt;BR&gt;
&lt;/code&gt;
&lt;br&gt;
如果主機不使用預設的PORT,可以透過以下寫法連接:&lt;br&gt;
&lt;code&gt;
conn = pymssql.connect(server=&#39;192.168.1.100&#39;, port=9899, user=&#39;username&#39;, password=&#39;password&#39;, database=&#39;tempdb&#39;)&lt;br&gt;
cursor = conn.cursor(as_dict=True)&lt;BR&gt;
&lt;/code&gt;
&lt;br&gt;
SQL查詢 可以也能使用OPENQUERY,例如:&lt;br&gt;
&lt;code&gt;
select * from OPENQUERY( linked_server ,&#39;SELECT * FROM dbname.schema.table&#39;) 
&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/6101847023300289333/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/04/raspberry-pi-4-pymssql-ms-sql.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6101847023300289333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6101847023300289333'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/04/raspberry-pi-4-pymssql-ms-sql.html' title='在樹莓派(raspberry pi 4) 上安裝 pymssql 連接MS SQL'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-4438078689893352316</id><published>2021-04-08T11:14:00.003+08:00</published><updated>2021-04-08T11:18:29.046+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Anaconda"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="cuDNN"/><category scheme="http://www.blogger.com/atom/ns#" term="Keras"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Tensorflow"/><title type='text'>安裝 Tensorflow + Keras 環境安裝( Anaconda )</title><content type='html'>雖然簡單,還是筆記一下&lt;br&gt;
&lt;br&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
Anaconda雖然肥了點,但省去很多麻煩,開發階段的好夥伴&lt;br&gt;
&lt;br&gt;
1.下載Anaconda Individual Edition&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://www.anaconda.com/products/individual&quot; target=&quot;_blank&quot;&gt;Anaconda Individual Edition&lt;/a&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;這裡遇到要選的地方:&lt;br&gt;
&amp;nbsp;&amp;nbsp;Install For&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JUST ME(安裝在C:\Users\&lt;user_name&gt;\Anaconda3)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;All Users(安裝在C:\ProgramData\Anaconda3)&lt;br&gt;
&amp;nbsp;&amp;nbsp;勾選Add Anaconda to my PATH environment variable&lt;br&gt;
&amp;nbsp;&amp;nbsp;其他的都可以下一步&lt;br&gt;
2.使用系統管理員開啟Anaconda Prompt,在提示字元前多了個(base),建立給 Tensorflow 用的 env&lt;br&gt;
&lt;code&gt;(base) C:\Users&gt;conda create -n tfenv python anaconda&lt;/code&gt;&lt;br&gt;
也可以使用系統管理員開啟命令提示字元後輸入以下指令
&lt;code&gt;C:\Users&gt;conda activate&lt;br&gt;
(base) C:\Users&gt;conda create -n tfenv python anaconda&lt;/code&gt;&lt;br&gt;
3.建立完成後進入tfenv 安裝tensorflow keras&lt;br&gt;
&lt;code&gt;C:\Users&gt;conda activate tfenv&lt;br&gt;
(tfenv) C:\Users&gt;pip install tensorflow keras&lt;/code&gt;
這時候安裝的版本如下,也可稍後在jupyter中驗證&lt;br&gt;
&lt;code&gt;Keras 2.4.3&lt;br&gt;
tensorflow 2.4.1&lt;/code&gt;&lt;br&gt;
4.安裝CUDA Toolkit,取消勾選Visual Studio integration &lt;br&gt;
&lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot; target=&quot;_blank&quot;&gt;CUDA Toolkit 11.2 Update 2 Downloads&lt;/a&gt;&lt;br&gt;
5.再下載NVIDIA cuDNN ,GPU-accelerated library, 備用放著(這個要先註冊登入)&lt;br&gt;
&lt;a href=&quot;https://developer.nvidia.com/rdp/cudnn-download&quot; target=&quot;_blank&quot;&gt;cuDNN Download&lt;/a&gt;&lt;br&gt;
6.進入jupyter notebook 驗證是否安裝完成&lt;br&gt;
&lt;code&gt;(tfenv) C:\Users&gt;jupyter notebook&lt;/code&gt;&lt;br&gt;
在jupyter notebook右上角,開啟新的python notebook,輸入下列程式碼&lt;br&gt;
&lt;code&gt;import tensorflow as tf&lt;br&gt;
tf.__version__&lt;br&gt;
tf.config.list_logical_devices(&#39;CPU&#39;)&lt;br&gt;
tf.config.list_physical_devices(&#39;GPU&#39;)&lt;br&gt;
import keras&lt;br&gt;
keras.__version__&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
執行結果應該類似下圖&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cJaRNYSUWohIpRLT41bUBvWAXkp3mA5h26s2duJQVWVSmLmImOmbRjmTiixlFFxjjAwP5xCPeYbNY8msJ6PHS7u6xbn9DoJsY55SoEsRjceJpZLKTpTMw9-yB1V4bKDmeizwSK6x3HE/s956/2021-04-08_103953.jpg&quot; &gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; width=&quot;400&quot; data-original-height=&quot;575&quot; data-original-width=&quot;956&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cJaRNYSUWohIpRLT41bUBvWAXkp3mA5h26s2duJQVWVSmLmImOmbRjmTiixlFFxjjAwP5xCPeYbNY8msJ6PHS7u6xbn9DoJsY55SoEsRjceJpZLKTpTMw9-yB1V4bKDmeizwSK6x3HE/s400/2021-04-08_103953.jpg&quot;/&gt;&lt;/a&gt;&lt;br&gt;
這樣就完成了!&lt;br&gt;
&lt;br&gt;
錯誤訊息解析:&lt;br&gt;
1.Could not load dynamic library &#39;cudart64_110.dll&#39;; dlerror: cudart64_110.dll not found&lt;br&gt;
這裡裝的是CPU版本的Tensorflow,在2.1版以後找不到CUDA函式庫,&lt;br&gt;
只會出現警告,可以不理會,Tensorflow還是能用,想消除只能裝CUDA Toolkit&lt;br&gt;
(上面步驟4有裝則不會出現這訊息,只是記錄一下)&lt;br&gt;&lt;br&gt;
2.Could not load dynamic library &#39;cusolver64_10.dll&#39;; dlerror: cusolver64_10.dll not found&lt;br&gt;
到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin目錄下&lt;br&gt;
複製cusolver64_11.dll一份,並更名為cusolver64_10.dll&lt;br&gt;&lt;br&gt;
3.Could not load dynamic library &#39;cudnn64_8.dll&#39;; dlerror: cudnn64_8.dll not found&lt;br&gt;
打開步驟5下載的cuDNN壓縮檔,在bin目錄下找到cudnn64_8.dll&lt;br&gt;
將它解壓到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin&lt;br&gt;
&lt;br&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/4438078689893352316/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/04/tensorflow-keras-anaconda.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4438078689893352316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4438078689893352316'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/04/tensorflow-keras-anaconda.html' title='安裝 Tensorflow + Keras 環境安裝( Anaconda )'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-cJaRNYSUWohIpRLT41bUBvWAXkp3mA5h26s2duJQVWVSmLmImOmbRjmTiixlFFxjjAwP5xCPeYbNY8msJ6PHS7u6xbn9DoJsY55SoEsRjceJpZLKTpTMw9-yB1V4bKDmeizwSK6x3HE/s72-c/2021-04-08_103953.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-2725092568261036047</id><published>2021-03-22T18:13:00.001+08:00</published><updated>2021-03-22T18:13:28.238+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Elasticsearch"/><category scheme="http://www.blogger.com/atom/ns#" term="filebeat"/><category scheme="http://www.blogger.com/atom/ns#" term="Kibana"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><title type='text'>filebeat 啟用 apache error log 後,在 kibana 中時區無法對應( Timezone error )</title><content type='html'>&lt;p&gt;啟用Apache error logs,把檔名改掉重啟服務即可&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;code&gt;
pi@raspberrypi:/ $sudo mv /etc/filebeat/modules.d/apache2.yml.disabled apache2.yml&lt;br /&gt;
pi@raspberrypi:/ $sudo systemctl restart filebeat
&lt;/code&gt;
&lt;p&gt;以上步驟會一併啟用Apache的access.log與error.log&lt;br&gt;
不過error的時區會有問題,利用下面修改可以讓時區不被轉換&lt;br&gt;
先做參數啟用,編輯以下檔案&lt;/p&gt;
&lt;code&gt;
sudo nano /etc/filebeat/modules.d/apache2.yml
&lt;/code&gt;
&lt;p&gt;加入以下參數設置,原則上Apache模組不支援以下設置&lt;br&gt;
要自己手動修改資料格式判斷&lt;/p&gt;
&lt;code&gt;
var.convert_timezone: true
&lt;/code&gt;
&lt;p&gt;再來修改filebeat pipeline讀入資料格式的json設定&lt;/p&gt;
&lt;code&gt;
sudo nano /usr/share/filebeat/module/apache2/error/ingest/pipeline.json
&lt;/code&gt;
&lt;p&gt;在date的formate後,加入下方這一行&lt;/p&gt;
&lt;code&gt;
{&lt; if .convert_timezone &gt;}&quot;timezone&quot;: &quot;Asia/Taipei&quot;,{&lt; end &gt;}
&lt;/code&gt;
&lt;p&gt;json的格式會長的像下面這段&lt;/p&gt;
&lt;code&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;date&quot;: {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;field&quot;: &quot;apache2.error.timestamp&quot;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;target_field&quot;: &quot;@timestamp&quot;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;formats&quot;: [&quot;EEE MMM dd H:m:s yyyy&quot;, &quot;EEE MMM dd H:m:s.SSSSSS yyyy&quot;],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt; if .convert_timezone &gt;}&quot;timezone&quot;: &quot;Asia/Taipei&quot;,{&lt; end &gt;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;ignore_failure&quot;: true&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br&gt;
&lt;/code&gt;
&lt;p&gt;依照這樣的改法,其他filebeat的模組有遇到時區問題都可以改&lt;br&gt;
接下來清掉原來的pipeline,重啟服務,步驟說在前一篇提過,不再贅述&lt;/p&gt;
&lt;code&gt;
sudo systemctl stop filebeat&lt;br&gt;
curl -XDELETE &quot;http://elastic:[password]@localhost:9200/_ingest/pipeline/filebeat*&quot;&lt;br&gt;
sudo rm /var/lib/filebeat/registry&lt;br&gt;
sudo systemctl restart filebeat&lt;br&gt;
&lt;/code&gt;
  
  </content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/2725092568261036047/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/03/filebeat-apache-error-log-kibana.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2725092568261036047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2725092568261036047'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/03/filebeat-apache-error-log-kibana.html' title='filebeat 啟用 apache error log 後,在 kibana 中時區無法對應( Timezone error )'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-3294170066927800476</id><published>2021-03-20T10:20:00.005+08:00</published><updated>2021-03-22T15:49:06.371+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Elasticsearch"/><category scheme="http://www.blogger.com/atom/ns#" term="filebeat"/><category scheme="http://www.blogger.com/atom/ns#" term="Kibana"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><category scheme="http://www.blogger.com/atom/ns#" term="syslog"/><title type='text'>filebeat 啟用System logs( system.yml )後,在 kibana 中 LOG 的時區無法對應( Timezone error )</title><content type='html'>&lt;p&gt;啟用System logs,把檔名改掉重啟服務即可&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;code&gt;
pi@raspberrypi:/etc/filebeat/modules.d $sudo mv system.yml.disabled system.yml&lt;br /&gt;
pi@raspberrypi:/etc/filebeat/modules.d $sudo systemctl restart filebeat
&lt;/code&gt;
&lt;p&gt;這樣在kibana中可以持續收到讀進來的LOG記錄,
但kibana 的 @timestamp卻無法對應system.auth.timestamp這個欄位(正確的時間),
反觀己啟用的Apache沒這個問題,
而且就自開啟了自動轉換時區旳設置,也無作用,
現在透過以下的步驟可以重新完成對應&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;打開轉換時區的設置&lt;/p&gt;
&lt;code&gt;
sudo nano /etc/filebeat/modules.d/system.yml
&lt;/code&gt;
&lt;p&gt;將此參數設為TRUE&lt;/p&gt;
&lt;code&gt;
var.convert_timezone: true
&lt;/code&gt;
&lt;p&gt;停掉filebeat服務&lt;/p&gt;
&lt;code&gt;
sudo systemctl stop filebeat
&lt;/code&gt;
&lt;p&gt;清掉原有 Elasticsearch 的 LOG,還有kibana裡的INDEX(&lt;/p&gt;
&lt;code&gt;
curl -XDELETE &#39;http://localhost:9200/_ingest/pipeline/filebeat-*&#39;
&lt;/code&gt;
&lt;p&gt;有設密碼的用這個方式連結&lt;/p&gt;
&lt;code&gt;
curl -XDELETE &quot;http://elastic:[password]@localhost:9200/_ingest/pipeline/filebeat*&quot;
&lt;/code&gt;
&lt;p&gt;如果想讓filebeat重抓原來的LOG,記得清掉registry,這個檔案是在記錄傳送的進度&lt;/p&gt;
&lt;code&gt;
sudo rm /var/lib/filebeat/registry
&lt;/code&gt;
&lt;p&gt;啟用filebeat服務&lt;/p&gt;
&lt;code&gt;
sudo systemctl restart filebeat
&lt;/code&gt;
&lt;p&gt;過幾分鐘就可以看到正常的@timestamp值&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/3294170066927800476/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/03/filebeat-system-logs-systemyml-kibana.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3294170066927800476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3294170066927800476'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/03/filebeat-system-logs-systemyml-kibana.html' title='filebeat 啟用System logs( system.yml )後,在 kibana 中 LOG 的時區無法對應( Timezone error )'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-7430016264456040618</id><published>2021-03-12T15:11:00.012+08:00</published><updated>2021-03-20T18:48:14.631+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Flask"/><category scheme="http://www.blogger.com/atom/ns#" term="Line Bot"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><category scheme="http://www.blogger.com/atom/ns#" term="virtualenv"/><category scheme="http://www.blogger.com/atom/ns#" term="wsgi"/><title type='text'>Line Bot + Python + Flask + Apache + virtualenv 架在Raspberry Pi 4上</title><content type='html'>&lt;p&gt;每個步驟有其他相關驗證細節,大概都有一大拖庫文章可搜尋,&lt;br /&gt;
  這裡只記錄關鍵設置步驟,詳細的部份有空再補上&lt;br /&gt;
  本來使用ngrok,但網址每次執行即變更,使用上不方便,改用APACHE&lt;/p&gt;
&lt;p&gt;1.安裝apache&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;code&gt;sudo apt-get install apache2&lt;/code&gt;
&lt;p&gt;在接下來設置過程,要常看/var/log/apache2/error.log,最好用tail指令&lt;/p&gt;
&lt;code&gt;tail -f /var/log/apache2/error.log&lt;/code&gt;
&lt;p&gt;2.確認Python版本&lt;br /&gt;原生的樹莓派OS己有內建,這裡使用的是3.7.3版本&lt;/p&gt;
&lt;code&gt;pi@raspberrypi:~ $python --version
&lt;br /&gt;Python 3.7.3
&lt;/code&gt;
&lt;p&gt;3.安裝mod_wsgi&lt;/p&gt;
&lt;code&gt;pip install mod_wsgi&lt;/code&gt;
&lt;p&gt;4.安裝virtualenv&lt;/p&gt;
&lt;code&gt;pip install virtualenv&lt;/code&gt;
&lt;p&gt;5.設定wsgi要使用的venv&lt;br /&gt;
python的主目錄設定在/var/www/app&lt;br /&gt;
app的名稱叫slinebot,目錄設定在/var/www/app/slinebot&lt;br&gt;
切換到/var/www/app/slinebot下,執行以下命令
&lt;/p&gt;
&lt;code&gt;virtualenv -p /usr/bin/python3 venv&lt;/code&gt;
&lt;p&gt;執行後會產生一個venv的目錄&lt;br&gt;
切換到venv/bin目錄底下,進入venv虛擬環境&lt;/p&gt;
&lt;code&gt;pi@raspberrypi:/var/www/app/slinebot/venv/bin $source activate&lt;br&gt;
(venv) pi@raspberrypi:/var/www/app/slinebot/venv/bin $&lt;/code&gt;
&lt;p&gt;有看到前面括號有venv的字樣即正確,接下來步驟6,7都要在venv裡安裝&lt;/p&gt;
&lt;p&gt;6.[venv虛擬環境裡]安裝Flask&lt;/p&gt;
&lt;code&gt;pip install flask&lt;/code&gt;
&lt;p&gt;7.[venv虛擬環境裡]安裝LineBot SDK&lt;/p&gt;
&lt;code&gt;pip3 install line-bot-sdk&lt;/code&gt;
&lt;p&gt;8.設置 LINE 的 Messaging API&lt;br /&gt;
確認取得Channel secret及Channel access token&lt;br /&gt;
確認設定Line developers的Messaging API裡的Webhook settings&lt;br /&gt;
Webhook URL:填入你的網址,必須是https開頭的&lt;br /&gt;
Use webhook:打開&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;9.設定apache2使用wsgi&lt;br /&gt;
python的主目錄設定在/var/www/app&lt;br /&gt;
在此目錄放置一檔案 app.wsgi 內容如下:&lt;br /&gt;
&lt;/p&gt;
&lt;code&gt;
#!/usr/bin/python3&lt;br /&gt;
import sys, os&lt;br /&gt;
import logging&lt;br /&gt;
activate_this = &#39;/var/www/app/slinebot/venv/bin/activate_this.py&#39;&lt;br /&gt;
with open(activate_this) as file_:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exec(file_.read(), dict(__file__=activate_this))&lt;br /&gt;
&lt;br /&gt;
logging.basicConfig(stream=sys.stderr)&lt;br /&gt;
sys.path.insert(0, &quot;/var/www/app/&quot;)&lt;br /&gt;
&lt;br /&gt;
from slinebot import app as application
&lt;/code&gt;
&lt;p&gt;10.設定apache2使用ssl&lt;br /&gt;
&lt;p&gt;啟用 apache2 SSL 模組&lt;/p&gt;
&lt;code&gt;sudo a2enmod ssl&lt;/code&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;code&gt;sudo a2ensite default-ssl&lt;/code&gt;
&lt;p&gt;重啟apache2&lt;/p&gt;
&lt;code&gt;sudo service apache2 restart&lt;/code&gt;
&lt;p&gt;再到https://zerossl.com/&lt;br&gt;
申請免費的SSL憑證,申請完成可下載三個檔案
&lt;/p&gt;
&lt;code&gt;
private.key&lt;br /&gt;
certificate.crt&lt;br /&gt;
ca_bundle.crt&lt;br /&gt;
&lt;/code&gt;
&lt;p&gt;分別放到以下目錄,沒有手動建&lt;/p&gt;
&lt;code&gt;
/etc/ssl/certs/certificate.crt&lt;br&gt;
/etc/ssl/private/private.key&lt;br&gt;
/etc/ssl/ssl.crt/ca_bundle.crt&lt;br&gt;
&lt;/code&gt;
&lt;p&gt;修改/etc/apache2/sites-available/default-ssl.conf&lt;/p&gt;
&lt;code&gt;
SSLCertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/ssl/certs/certificate.crt&lt;br&gt;
SSLCertificateKeyFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/ssl/private/private.key&lt;br&gt;
SSLCACertificatePath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/ssl/certs/&lt;br&gt;
SSLCACertificateFile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/ssl/ssl.crt/ca_bundle.crt&lt;br&gt;
&lt;/code&gt;
&lt;p&gt;11.加入linebot主程式&lt;br /&gt;
  在/var/www/app/slinebot目錄下產生一檔案__init__.py,內容如下&lt;/p&gt;
&lt;code&gt;
import os, sys&lt;br&gt;
from flask import Flask, request&lt;br&gt;
from linebot import LineBotApi, WebhookHandler&lt;br&gt;
from linebot.models import *&lt;br&gt;
&lt;br&gt;
app = Flask(__name__)&lt;br&gt;
&lt;br&gt;
# get channel_secret and channel_access_token from OS environment variable&lt;br&gt;
channel_secret = os.getenv(&#39;LINE_CHANNEL_SECRET&#39;, None)&lt;br&gt;
channel_token = os.getenv(&#39;LINE_CHANNEL_ACCESS_TOKEN&#39;, None)&lt;br&gt;
&lt;br&gt;
if channel_secret is None:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&#39;Set LINE_CHANNEL_SECRET as environment variable.&#39;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(1)&lt;br&gt;
if channel_token is None:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&#39;Set LINE_CHANNEL_ACCESS_TOKEN as environment variable.&#39;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(1)&lt;br&gt;
&lt;br&gt;
line_bot_api = LineBotApi(channel_token)&lt;br&gt;
handler = WebhookHandler(channel_secret)&lt;br&gt;
&lt;br&gt;
@app.route(&quot;/&quot;, methods=[&#39;POST&#39;])&lt;br&gt;
def callback():&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signature = request.headers[&#39;X-Line-Signature&#39;]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body = request.get_data(as_text=True)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handler.handle(body, signature)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;&quot;&lt;br&gt;
&lt;br&gt;
@handler.add(MessageEvent, message=TextMessage)&lt;br&gt;
def message_text(event):&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg = event.message.text&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg = msg.encode(&#39;utf-8&#39;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if event.message.text == &quot;貼圖&quot;:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line_bot_api.reply_message(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.reply_token,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StickerSendMessage(package_id=1, sticker_id=2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line_bot_api.reply_message(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event.reply_token,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TextSendMessage(text=event.message.text)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;&quot;&lt;br&gt;
&lt;br&gt;
if __name__ == &quot;__main__&quot;:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app.run()&lt;br&gt;
&lt;/code&gt;
&lt;p&gt;12.設置LINE的OS環境變數&lt;br&gt;
在裡加入以下兩行&lt;/p&gt;
&lt;code&gt;
export LINE_CHANNEL_SECRET={你的SECRET}&lt;br&gt;
export LINE_CHANNEL_ACCESS_TOKEN={你的TOKEN}
&lt;/code&gt;
&lt;p&gt;重啟apache2&lt;/p&gt;
&lt;code&gt;sudo service apache2 restart&lt;/code&gt;

&lt;p&gt;最後應該可以在LINE裡打文字回文字,打貼圖回一個貼圖&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/7430016264456040618/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/03/linebotpythonflaskapachevirtualenv.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/7430016264456040618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/7430016264456040618'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/03/linebotpythonflaskapachevirtualenv.html' title='Line Bot + Python + Flask + Apache + virtualenv 架在Raspberry Pi 4上'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-1720399558229413109</id><published>2021-03-11T10:28:00.005+08:00</published><updated>2021-03-20T18:47:52.936+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="adafruit_circuitpython_dht"/><category scheme="http://www.blogger.com/atom/ns#" term="dht22"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><title type='text'> Raspberry Pi 連接 DHT22 偵測溫濕度(使用 Adafruit_CircuitPython_DHT )</title><content type='html'>&lt;span style=&quot;font-family: courier;&quot;&gt;硬體&amp;nbsp;&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;我的是三隻腳版本：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;正極(PIN1 3.3V)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;負極(PIN9 接地)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Data(中間那條線的接PIN7 - GPIO4)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;安裝 Adafruit_CircuitPython_DHT&amp;nbsp;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;libgpiod2這個在程式執行過程中,需要用到先裝&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo apt-get install libgpiod2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo pip3 install adafruit-circuitpython-dht&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;測試&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import adafruit_dht&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import board&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dht22 = adafruit_dht.DHT22(board.D4)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dht22.temperature&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dht22.humidity&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNsfGFnv8j-wfrVTy3pMyAwEuFWjY5iu-I-VQpopJBEcB_R92wt3t04SXAZXwPutyOgTyINPAa1ATOVvH0J_BOsKrpmxDcqhE4ZlB4gmNgDWNndh3iU3wIP92wbg8I4LYeFzt_ZvZDuTA/s0/2021-03-11_100920.jpg&quot; style=&quot;clear: left; display: block; float: left; padding: 1em 0px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;301&quot; data-original-width=&quot;1129&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNsfGFnv8j-wfrVTy3pMyAwEuFWjY5iu-I-VQpopJBEcB_R92wt3t04SXAZXwPutyOgTyINPAa1ATOVvH0J_BOsKrpmxDcqhE4ZlB4gmNgDWNndh3iU3wIP92wbg8I4LYeFzt_ZvZDuTA/w679-h170/2021-03-11_100920.jpg&quot; width=&quot;679&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNsfGFnv8j-wfrVTy3pMyAwEuFWjY5iu-I-VQpopJBEcB_R92wt3t04SXAZXwPutyOgTyINPAa1ATOVvH0J_BOsKrpmxDcqhE4ZlB4gmNgDWNndh3iU3wIP92wbg8I4LYeFzt_ZvZDuTA/s0/2021-03-11_100920.jpg&quot; style=&quot;clear: left; display: block; float: left; padding: 1em 0px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNsfGFnv8j-wfrVTy3pMyAwEuFWjY5iu-I-VQpopJBEcB_R92wt3t04SXAZXwPutyOgTyINPAa1ATOVvH0J_BOsKrpmxDcqhE4ZlB4gmNgDWNndh3iU3wIP92wbg8I4LYeFzt_ZvZDuTA/s0/2021-03-11_100920.jpg&quot; style=&quot;clear: left; display: block; float: left; padding: 1em 0px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;

撰寫程式&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;將以下存成DHT22.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;div&gt;import time&lt;/div&gt;&lt;div&gt;import adafruit_dht&lt;/div&gt;&lt;div&gt;import board&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;dht22 = adafruit_dht.DHT22(board.D4)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;while True:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; try:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temperature = dht22.temperature&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; humidity = dht22.humidity&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;Temperature: {:.1f} *C \t Humidity: {}%&quot;.format(temperature, humidity))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; except RuntimeError as e:&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&quot;Reading from DHT22 ERROR: &quot;, e.args)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; time.sleep(2)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;執行&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVv-NOuF1AK7a3J5h0SW8M6bDoyKV8aGMda9lW9jqqvBKF6EcTTLLzQsKNMuweofDW1SRXqMardAgltdfwVQgJnnE6DQEamKGTV3LW5gSUHp3w-C-HCAU2x4Dwo7nD9h6NYxWlQUS9vB0/s844/2021-03-11_102239.jpg&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;553&quot; data-original-width=&quot;844&quot; height=&quot;327&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVv-NOuF1AK7a3J5h0SW8M6bDoyKV8aGMda9lW9jqqvBKF6EcTTLLzQsKNMuweofDW1SRXqMardAgltdfwVQgJnnE6DQEamKGTV3LW5gSUHp3w-C-HCAU2x4Dwo7nD9h6NYxWlQUS9vB0/w677-h327/2021-03-11_102239.jpg&quot; width=&quot;677&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;有時候無法讀取屬正常現象~~&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;測試階段,可以印出,順便檢視有什麼問題&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/1720399558229413109/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2021/03/raspberry-pidht22adafruitcircuitpythond.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1720399558229413109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1720399558229413109'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2021/03/raspberry-pidht22adafruitcircuitpythond.html' title=' Raspberry Pi 連接 DHT22 偵測溫濕度(使用 Adafruit_CircuitPython_DHT )'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNsfGFnv8j-wfrVTy3pMyAwEuFWjY5iu-I-VQpopJBEcB_R92wt3t04SXAZXwPutyOgTyINPAa1ATOVvH0J_BOsKrpmxDcqhE4ZlB4gmNgDWNndh3iU3wIP92wbg8I4LYeFzt_ZvZDuTA/s72-w679-h170-c/2021-03-11_100920.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-3385280532459809038</id><published>2018-07-28T23:48:00.001+08:00</published><updated>2018-07-28T23:49:38.354+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="SQLite"/><category scheme="http://www.blogger.com/atom/ns#" term="Xamarin"/><title type='text'>Xamarin Error System.TypeInitializationException: The type initializer for &#39;SQLite.SQLiteConnection&#39; threw an exception.</title><content type='html'>Xamarin 在建立SQLite連線時&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;var conn = new SQLite.SQLiteConnection(path);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
出現下列錯誤:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;System.TypeInitializationException: The type initializer for &#39;SQLite.SQLiteConnection&#39; threw an exception.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
最快解決的方法,在NuGet 套件管理員中找到下列套件&lt;br /&gt;
&lt;br /&gt;
Android專案裝這個&lt;br /&gt;
&lt;b&gt;SQLitePCLRaw.lib.e_sqlite3.android&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
iOS專案裝這個&lt;br /&gt;
&lt;b&gt;SQLitePCLRaw.lib.e_sqlite3.osx&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
重新執行專案,應該就沒問題了</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/3385280532459809038/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2018/07/xamarin-error-systemtypeinitializatione.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3385280532459809038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3385280532459809038'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2018/07/xamarin-error-systemtypeinitializatione.html' title='Xamarin Error System.TypeInitializationException: The type initializer for &#39;SQLite.SQLiteConnection&#39; threw an exception.'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-5652289347713835062</id><published>2018-07-27T21:58:00.000+08:00</published><updated>2018-07-28T09:09:01.304+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Xamarin"/><category scheme="http://www.blogger.com/atom/ns#" term="ZXing"/><title type='text'>Xamarin ZXing Unhandled Exception:System.NullReferenceException</title><content type='html'>當寫Xamarin程式,要寫條碼掃描的功能&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;,一定不會錯過ZXing這個套件,&lt;br /&gt;
網上有很多教學,不再重述,&lt;br /&gt;
當初寫條碼掃描功能時,&lt;br /&gt;
這個問題解法找了許久,&lt;br /&gt;
後來才發現不少教學網站並未提到。&lt;br /&gt;
&lt;br /&gt;
當程式跑到啟用條碼掃描的功能時,&lt;br /&gt;
可能會收到類似下方的錯誤訊息：&lt;br /&gt;
&lt;br /&gt;
UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object&lt;br /&gt;
&lt;br /&gt;
照字面翻譯就很簡單,&lt;br /&gt;
物件沒有抓到,代表沒有初始化&lt;br /&gt;
後來找到個解法,&lt;br /&gt;
在MainActivity.cs的onCreate函式,&lt;br /&gt;
加入下方這一行:&lt;br /&gt;
&lt;br /&gt;
ZXing.Mobile.MobileBarcodeScanner.Initialize(Application);&lt;br /&gt;
&lt;br /&gt;
再重新執行就成功了。&lt;br /&gt;
&lt;br /&gt;
真的是沒有初始化的原因。</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/5652289347713835062/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2018/07/zxing-unhandled-exceptionsystemnullrefe.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/5652289347713835062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/5652289347713835062'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2018/07/zxing-unhandled-exceptionsystemnullrefe.html' title='Xamarin ZXing Unhandled Exception:System.NullReferenceException'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-6508734299459944149</id><published>2017-05-02T16:47:00.000+08:00</published><updated>2017-05-03T09:09:33.358+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL"/><title type='text'>MSSQL FIREWALL 防火牆怎麼開?</title><content type='html'>裝好MSSQL後，在防火牆裡的設定，&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;一般會開PORT 1433來讓遠端存取SQL服務，這是屬於預設實例(DEFAULT INSTANCE)的設定，若是第二個實例(INSTANCE)要怎麼開呢？&lt;br /&gt;
&lt;br /&gt;
請依下面步驟設定防牆，即可完成：&lt;br /&gt;
&lt;br /&gt;
1.使用第二個實例(INSTANCE)，需啟用SQL SERVER BROWSER服務，這樣外部連入時才找的到您設定的第二個實例。&lt;br /&gt;
&lt;br /&gt;
2.外部防火牆的設定：&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SQL SERVER BROWSER: &lt;span style=&quot;color: blue;&quot;&gt;PORT 1434&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;DEFAULT INSTANCE: &lt;span style=&quot;color: blue;&quot;&gt;PORT 1433&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SECOND INSTANCE: &lt;span style=&quot;color: blue;&quot;&gt;PORT 自訂&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
以上設定好即可以讓遠端存取MSSQL上的實例。&lt;br /&gt;
&lt;br /&gt;
祝順利~~</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/6508734299459944149/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2017/05/mssql-firewall.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6508734299459944149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6508734299459944149'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2017/05/mssql-firewall.html' title='MSSQL FIREWALL 防火牆怎麼開?'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-4663935024119179815</id><published>2017-01-16T18:16:00.002+08:00</published><updated>2017-01-16T22:35:02.055+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bower"/><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Nodejs"/><title type='text'>Nodejs+Git+bower for windows 安裝</title><content type='html'>&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;1.&lt;/b&gt;&lt;/span&gt;下載&lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;Git&lt;/a&gt;,直接安裝,其中有一步驟筆者選整合命令提示字元,其他預設選項,下一步到最後。&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6vVP0VXgVlXENIb5bwvP0hbl6spZYaCtJjIj4q2R9GNvJNo86L3P8-kS_KtEDuIgRDkvPO9JVyLNj_yKK7VJqKJBs7sMUsjQFZTTXA1I_8GFFOrIWKGQPhJeHt6hK1YtpTrwP9YaGEpg/s1600/2017-01-16_222235.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;248&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6vVP0VXgVlXENIb5bwvP0hbl6spZYaCtJjIj4q2R9GNvJNo86L3P8-kS_KtEDuIgRDkvPO9JVyLNj_yKK7VJqKJBs7sMUsjQFZTTXA1I_8GFFOrIWKGQPhJeHt6hK1YtpTrwP9YaGEpg/s320/2017-01-16_222235.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;2.&lt;/span&gt;&lt;/b&gt;下載&lt;a href=&quot;https://nodejs.org/en/download/&quot;&gt;Nodejs&lt;/a&gt;,直接安裝,沒什麼特別的,直接下一步到最後。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;2.1.&lt;/b&gt;&lt;/span&gt;設定Nodejs的Global與Cache&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;命令提示字元下輸入(記得使用管理者權限開啟)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;或是使用Node.js command prompt&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;gt;npm config set prefix &quot;C:\Program Files\nodejs\node_global&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;gt;npm config set cache &quot;C:\Program Files\nodejs\node_cache&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;筆者的安裝路徑在C:\Program Files\nodejs,這裡請自行變更。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;2.2.&lt;/b&gt;&lt;/span&gt;設定環境變數&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;設定NODE_PATH:(C:\Program Files\nodejs\node_global是前步驟所設定的Global路徑)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;NODE_PATH=C:\Program Files\nodejs\node_global\node_modules&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;設定PATH:(將Global的路徑加到PATH變數去)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;PATH=......;C:\Program Files\nodejs\node_global&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;3.&lt;/b&gt;&lt;/span&gt;安裝bower&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;命令提示字元下輸入&lt;/span&gt;或是使用Node.js command prompt&lt;span style=&quot;font-family: inherit;&quot;&gt;(-g 代表全域安裝)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;npm install -g bower&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;4.&lt;/b&gt;&lt;/span&gt;驗證&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;4.1.&lt;/b&gt;&lt;/span&gt;進NODE SHELL驗證&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;命令提示字元下輸入&lt;/span&gt;或是使用Node.js command prompt&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;node&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;在NODE SHEEL下輸入,沒有錯誤訊息就成功。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;gt;require(&#39;bower&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;4.2.&lt;/b&gt;&lt;/span&gt;使用bower驗證,查詢版本訊息&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;命令提示字元下輸入&lt;/span&gt;或是使用Node.js command prompt&lt;span style=&quot;font-family: inherit;&quot;&gt;,若無錯誤訊息就成功&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;bower -v&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: inherit;&quot;&gt;以上祝各位成功。&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/4663935024119179815/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2017/01/nodejsgitbower-for-windows.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4663935024119179815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4663935024119179815'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2017/01/nodejsgitbower-for-windows.html' title='Nodejs+Git+bower for windows 安裝'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6vVP0VXgVlXENIb5bwvP0hbl6spZYaCtJjIj4q2R9GNvJNo86L3P8-kS_KtEDuIgRDkvPO9JVyLNj_yKK7VJqKJBs7sMUsjQFZTTXA1I_8GFFOrIWKGQPhJeHt6hK1YtpTrwP9YaGEpg/s72-c/2017-01-16_222235.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-1281252255015885734</id><published>2015-07-08T11:03:00.000+08:00</published><updated>2015-07-08T11:22:54.433+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android Studio 如何修改模擬器的大小(resize the AVD emulator)</title><content type='html'>新版的Android Studio的模擬器每次開起來都好大一個&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;，有兩個方法可以縮小到適合的尺寸：&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9C71E2ekjF0XdCoJGxd3WaO52CXd3q5WbXZMxO3A6SEHYAcBiu6mgZUM_85MYwMCfgkHvbs-caWkfkK_rehC0Azp_jDu792QOFJ3dU1GMXZ_5qZDmhgaOKyHMvNeM2dQxzgXmNJsLQoE/s1600/2015-07-08_104200.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9C71E2ekjF0XdCoJGxd3WaO52CXd3q5WbXZMxO3A6SEHYAcBiu6mgZUM_85MYwMCfgkHvbs-caWkfkK_rehC0Azp_jDu792QOFJ3dU1GMXZ_5qZDmhgaOKyHMvNeM2dQxzgXmNJsLQoE/s400/2015-07-08_104200.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
1.在Run-&amp;gt;Edit Configurations中的模擬器設定，使用附加命令(Additional command line options)中加入 -scale 0.X，0.X則是換算百分比，0.2指原尺寸的20%，可以依自己喜歡的尺寸做設定，我的電腦是縮到0.4才比較正常。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw8mcoccYml3x7ITDNXIrIiL4nmLvWRnYqdwl7ZwBtYBAVsoc3_wRoSph5bTjihsKSyMZ7X3lmE0m8k9w52RAf6qSQeYj0NxMYeHVa_fc_nC5jUli4mU6QqhKnD8KvmrtWdEXKlJtBXuI/s1600/2015-07-08_104431.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;157&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw8mcoccYml3x7ITDNXIrIiL4nmLvWRnYqdwl7ZwBtYBAVsoc3_wRoSph5bTjihsKSyMZ7X3lmE0m8k9w52RAf6qSQeYj0NxMYeHVa_fc_nC5jUli4mU6QqhKnD8KvmrtWdEXKlJtBXuI/s400/2015-07-08_104431.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomA99Teptn9z6T7hklyOuhZkRES03ZirEUhv_4y5x5DJZTyiuhPZUvYekg6IJ2dycYG9Cj-6E-2Sd0U3tUAqBHVZ4a0j34jEwuzogfXUEAdSeTZGqf4vRniIwg-qk0XTTQGf67juWx1o/s1600/2015-07-08_104842.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomA99Teptn9z6T7hklyOuhZkRES03ZirEUhv_4y5x5DJZTyiuhPZUvYekg6IJ2dycYG9Cj-6E-2Sd0U3tUAqBHVZ4a0j34jEwuzogfXUEAdSeTZGqf4vRniIwg-qk0XTTQGf67juWx1o/s320/2015-07-08_104842.png&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;2.另一個方式打開AVD的管理器(AVD Manager)，修改AVD的啟動設定：&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjluaV3xmU0SfyUgv8n4S4M3kduYFvNnPNEvcvAg9T6D_MeN0hsXn0TTf26YNWew-hkpyUAaEdmhom3Ih1YkRigSKXYDQ0Z9sOxdLqLriJSuOd8-TaFSpuDj4gYF1QFUnuoywRrIES2jK8/s1600/2015-07-08_105214.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjluaV3xmU0SfyUgv8n4S4M3kduYFvNnPNEvcvAg9T6D_MeN0hsXn0TTf26YNWew-hkpyUAaEdmhom3Ih1YkRigSKXYDQ0Z9sOxdLqLriJSuOd8-TaFSpuDj4gYF1QFUnuoywRrIES2jK8/s400/2015-07-08_105214.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;不過在這裡的選擇比較少，縮小的選項只有50%(2DP),25%(4DP),10%(10DP)，同樣依自己的喜好選擇好設定就可以了(如下圖)。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN-tT0WbA0nMnBvJtRut7f2hteFRX7Nw9lfZhTNuADuuh1YqlxgmZ_SxJoZtWCR7cwRSyXcNaVl2zFZVTMvJXMPlZnScJV86IszzYYlkm4tX4nEK-7xIXY9wYUcKD2fIBPwDf6P0yBfqo/s1600/2015-07-08_105452.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;233&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN-tT0WbA0nMnBvJtRut7f2hteFRX7Nw9lfZhTNuADuuh1YqlxgmZ_SxJoZtWCR7cwRSyXcNaVl2zFZVTMvJXMPlZnScJV86IszzYYlkm4tX4nEK-7xIXY9wYUcKD2fIBPwDf6P0yBfqo/s400/2015-07-08_105452.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;最後要提醒各位的，使用第一種方式附加命令的方式，是在每次執行啟動AVD時，會套用的參數設定，而第二種在AVD管理器裡設定時，必須預先啟動AVD(如下圖)，專案執行(Run)時，選擇已啟動的AVD即可，看自己喜好在那個地方設定。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikRQWkh8f9vyqoShCHT1T8AiXmLfazaAy_v8D4m7z3KI_duCbTV4oWR-M74Z3bDRssAc7n3883KO7NiwgpYEbdJb14GSirPvPsdURqwgxSLc1brN45Er3Kjxgex4b0ICM7K5KOnQSx50o/s1600/2015-07-08_110118.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;381&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikRQWkh8f9vyqoShCHT1T8AiXmLfazaAy_v8D4m7z3KI_duCbTV4oWR-M74Z3bDRssAc7n3883KO7NiwgpYEbdJb14GSirPvPsdURqwgxSLc1brN45Er3Kjxgex4b0ICM7K5KOnQSx50o/s400/2015-07-08_110118.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/1281252255015885734/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2015/07/android-studio-resize-avd-emulator.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1281252255015885734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/1281252255015885734'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2015/07/android-studio-resize-avd-emulator.html' title='Android Studio 如何修改模擬器的大小(resize the AVD emulator)'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9C71E2ekjF0XdCoJGxd3WaO52CXd3q5WbXZMxO3A6SEHYAcBiu6mgZUM_85MYwMCfgkHvbs-caWkfkK_rehC0Azp_jDu792QOFJ3dU1GMXZ_5qZDmhgaOKyHMvNeM2dQxzgXmNJsLQoE/s72-c/2015-07-08_104200.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-5983598180803323640</id><published>2015-06-23T11:38:00.002+08:00</published><updated>2015-07-08T11:04:23.968+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SVN"/><title type='text'>SVN 如何修改已簽入訊息(Edit message after commit)</title><content type='html'>Visual SVN Server 預設無法修改簽入(commit)後的訊息&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;，通常會遇到這個訊息：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bZ7iJc9IoTTB2jkaQ_C3yrdnF6nGEW5lCxnLVpzwSjNdnWoHZXUFQ1xqqU0QDF1BVSH8CPoNqT6TUIbGhvnT1cKvLDbLiiG7_GPMuMQSpLp_xeiNEHcj-sYDodZf0CT8E8L4AULVWEM/s1600/2015-06-23_105754.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bZ7iJc9IoTTB2jkaQ_C3yrdnF6nGEW5lCxnLVpzwSjNdnWoHZXUFQ1xqqU0QDF1BVSH8CPoNqT6TUIbGhvnT1cKvLDbLiiG7_GPMuMQSpLp_xeiNEHcj-sYDodZf0CT8E8L4AULVWEM/s320/2015-06-23_105754.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
可以到建立好的儲存庫(Repository)目錄下子目錄hooks，建立一檔名為pre-revprop-change.bat的批次檔，內容如下：&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;rem Only allow log messages to be changed.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;if &quot;%4&quot; == &quot;svn:log&quot; exit 0&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;echo Property &#39;%4&#39; cannot be changed &amp;gt;&amp;amp;2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;exit 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: yellow;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; 這樣就完成了，那些Repository需要開放編輯權限的就複製一份到hooks的目錄下即可。</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/5983598180803323640/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2015/06/svn-edit-message-after-commit.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/5983598180803323640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/5983598180803323640'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2015/06/svn-edit-message-after-commit.html' title='SVN 如何修改已簽入訊息(Edit message after commit)'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bZ7iJc9IoTTB2jkaQ_C3yrdnF6nGEW5lCxnLVpzwSjNdnWoHZXUFQ1xqqU0QDF1BVSH8CPoNqT6TUIbGhvnT1cKvLDbLiiG7_GPMuMQSpLp_xeiNEHcj-sYDodZf0CT8E8L4AULVWEM/s72-c/2015-06-23_105754.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-123667692674866941</id><published>2015-05-19T15:50:00.000+08:00</published><updated>2015-05-19T15:53:45.991+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joomla"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>取得安裝Joomla時的系統相關Config參數</title><content type='html'>當在撰寫Joomla相關功能時，在系統內部都能變數或是相關代碼取代設定參數&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;，像是在資料庫中TABLE的前綴字元(db_prefix)，在撰寫功能時不需在意為何，例如在內部可使用下列方式進行撰寫：&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #b45f06;&quot;&gt;select * from `#__component_users`&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Joomla會幫您代換成(假設前綴字元為vbgkf_)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #b45f06;&quot;&gt;select * from `vbgkf_component_users`&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
即為在MySQL中真實的TABLE名稱，寫程式時不需知Prefix為何，不過當開發不屬於Joomla系統中的功能時，像是提供WebService或傳送JSON檔案，皆必須從Joomla系統中的TABLE取出資料，這時就必須知道Prefix是什麼，才能正確存取資料。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Joomla把相關的設定參數都存成一個檔案，在安裝Joomla根目錄下檔名為configuration.php，利用下面語句就可以引用它，並可取得Joomla相關設定參數，連接資料庫，進行SQL查詢：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
include &#39;configuration.php&#39;;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #3d85c6;&quot;&gt;$config = new JConfig();&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
$link = mysql_connect($config-&amp;gt;host, $config-&amp;gt;user, $config-&amp;gt;password);&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
if (!$link) {&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; die(&#39;Could not connect: &#39; . mysql_error());&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
//選擇資料庫&lt;/div&gt;
&lt;div&gt;
$rv = mysql_select_db($config-&amp;gt;db, $link);&lt;/div&gt;
&lt;div&gt;
if (!$rv) {&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; die(&#39;Invalid DB: &#39; . mysql_error());&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
?&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
這樣未來Joomla改任何設定，這部份程式就直接套用，不需要再重新維護。&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/123667692674866941/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2015/05/joomlaconfig.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/123667692674866941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/123667692674866941'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2015/05/joomlaconfig.html' title='取得安裝Joomla時的系統相關Config參數'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-6181384528101927613</id><published>2015-03-22T00:21:00.002+08:00</published><updated>2015-03-22T00:26:33.095+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>利用 C# 清除IE相關暫存檔案</title><content type='html'>清除IE這些奇奇怪怪的暫存檔,&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;可以進入網際網路選項裡做清除,&lt;br /&gt;
利用C#的語法也可以做到相同的功能，參考下列語法。&lt;br /&gt;
&lt;br /&gt;
private void btnClearCache_Click(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
RunCmd(&quot;RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void RunCmd(string cmd)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//相關參數用法&lt;br /&gt;
//清除Temporary Internet Files  （Internet暫存檔案）&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8&lt;br /&gt;
//清除Cookies&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2&lt;br /&gt;
//清除History (歷史記錄)&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1&lt;br /&gt;
//清除Form Data （表單數據）&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16&lt;br /&gt;
//清除Passwords (密碼）&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32&lt;br /&gt;
//清除Delete All  （全部刪除）&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255&lt;br /&gt;
//清除Delete All - &quot;Also delete files and settings stored by add-ons&quot;&lt;br /&gt;
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351&lt;br /&gt;
&lt;br /&gt;
System.Diagnostics.Process p = new System.Diagnostics.Process();&lt;br /&gt;
p.StartInfo.FileName = &quot;cmd.exe&quot;;&lt;br /&gt;
// 關閉Shell的使用&lt;br /&gt;
p.StartInfo.UseShellExecute = false;&lt;br /&gt;
// 重定向標準輸入&lt;br /&gt;
p.StartInfo.RedirectStandardInput = true;&lt;br /&gt;
// 重定向標準輸出&lt;br /&gt;
p.StartInfo.RedirectStandardOutput = true;&lt;br /&gt;
//重定向錯誤輸出&lt;br /&gt;
p.StartInfo.RedirectStandardError = true;&lt;br /&gt;
p.StartInfo.CreateNoWindow = true;&lt;br /&gt;
p.Start();&lt;br /&gt;
p.StandardInput.WriteLine(cmd);&lt;br /&gt;
p.StandardInput.WriteLine(&quot;exit&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/6181384528101927613/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2015/03/c-ie.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6181384528101927613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6181384528101927613'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2015/03/c-ie.html' title='利用 C# 清除IE相關暫存檔案'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-3877546479029974803</id><published>2015-02-06T11:32:00.002+08:00</published><updated>2015-03-22T00:02:35.337+08:00</updated><title type='text'></title><content type='html'>年輕-似乎看不清自己需要的是什麼，看到的都是表面，只能讓時間告訴你一切。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;成熟-認識且更瞭解自己，更清楚自己的需求，歷經不少卻也都過去，時間卻在此時告訴你已不夠。&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;br /&gt;
在對的時間遇上不對的人&lt;/div&gt;在不對的時間遇上對的人&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;常看到的字眼，卻也深刻人心&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/3877546479029974803/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2015/02/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3877546479029974803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3877546479029974803'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2015/02/blog-post.html' title=''/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-9123389815278091728</id><published>2014-07-16T20:28:00.003+08:00</published><updated>2014-08-15T12:05:27.335+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Teamviewer"/><title type='text'>更換Teamviewer ID(9.0以上)</title><content type='html'>現在免費使用的期間似乎越給越短了...&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
1. 開始 &amp;gt; 執行，輸入%appdata%，刪除TeamViewer的資料夾；&lt;br /&gt;
&lt;br /&gt;
2. 開始 &amp;gt; 執行，輸入regedit；&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 刪除 HKEY_LOCAL_MACHINE\SOFTWARE\ 之下的 TeamViewer；&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 刪除 HKEY_CURRENT_USER\SOFTWARE\ 之下的 TeamViewer；&lt;br /&gt;
&lt;br /&gt;
3.用&lt;a href=&quot;http://www.neset.com/&quot;&gt;K-MAC&lt;/a&gt;(免費)或SMAC(不是免費需要序號)更改MAC。&lt;br /&gt;
&amp;nbsp; 或&lt;br /&gt;
&amp;nbsp; 裝置管理員 &amp;gt; 網路界面卡 &amp;gt; 內容 &amp;gt; 進階 &amp;gt; 本機管理位址&lt;br /&gt;
&amp;nbsp; 第二碼須為2,6，A，E，才會生效。&lt;br /&gt;
&lt;br /&gt;
4.改過MAC,記得停用再啟用~&lt;br /&gt;
&lt;br /&gt;
5.再啟動TEAMVIEW時，先把其他的界面都停用(保留一個已修改過的網卡連接網路)，才能取得新ID。&lt;br /&gt;
&amp;nbsp; (這是最重要的，目前版本會記住所有的網路卡MAC，只要有一個相同就丟舊的ID回來)&lt;br /&gt;
&lt;br /&gt;
執行環境:Windows 8.1&lt;br /&gt;
Teamviewer:9.0.29947&lt;br /&gt;
&lt;br /&gt;
&lt;strike&gt;如果可以變更無線網卡的MAC就不用停用了，&lt;/strike&gt;&lt;br /&gt;
&lt;strike&gt;目前還沒找到可以變更Intel無線網卡的MAC方法。&lt;/strike&gt;&lt;br /&gt;
&lt;br /&gt;
已找到變更無線網卡的方法,整理後再貼出分享~&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/9123389815278091728/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2014/07/teamviewer-id9029947.html#comment-form' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/9123389815278091728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/9123389815278091728'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2014/07/teamviewer-id9029947.html' title='更換Teamviewer ID(9.0以上)'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-244792562942913659</id><published>2012-07-09T23:30:00.000+08:00</published><updated>2012-07-09T23:48:00.911+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="SSRS"/><title type='text'>如何讓您的ReportViewer 通吃各種瀏覽器？</title><content type='html'>&lt;br /&gt;
使用WEB的解決方案，最需要的是各種平台、各家系統都能通用&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;，但是各個瀏覽器對於ReportViewer 所設定寬高都不能很確切的顯示，寬度還好，尤其是使用高度是100%的設定，如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html;&quot;&gt;&lt;rsweb:reportviewer height=&quot;100%&quot; id=&quot;ReportViewer1&quot; processingmode=&quot;Remote&quot; runat=&quot;server&quot; width=&quot;100%&quot;&gt;
&lt;/rsweb:reportviewer&gt;
&lt;/pre&gt;&lt;br /&gt;
在FF與IE都能正常顯示，但是在CHROME就只剩下一行工具列了，除非明確的指定高度為500px，如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html;&quot;&gt;&lt;rsweb:reportviewer height=&quot;500px&quot; id=&quot;ReportViewer1&quot; processingmode=&quot;Remote&quot; runat=&quot;server&quot; width=&quot;100%&quot;&gt;
&lt;/rsweb:reportviewer&gt;
&lt;/pre&gt;&lt;br /&gt;
這樣才能正確顯示，或是指定 SizeToReportContent=&quot;True&quot; ，此時報表會自動把報表的寬度與高度設定與內容相同，如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html;&quot;&gt;&lt;rsweb:reportviewer height=&quot;100%&quot; id=&quot;ReportViewer1&quot; processingmode=&quot;Remote&quot; runat=&quot;server&quot; sizetoreportcontent=&quot;True&quot; width=&quot;100%&quot;&gt;
&lt;/rsweb:reportviewer&gt;
&lt;/pre&gt;&lt;br /&gt;
不過依照筆者的想法，只希望顯示垂直的捲軸，水平的捲軸不希望出現，所以高度100%是最佳的設定，所以就藉助了JAVASCRIPT，來抓取Client端瀏覽器的高度與寬度，如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: js;&quot;&gt;function ResizeReport() {
   var viewer = document.getElementById(&quot;&amp;lt;%= ReportViewer1.ClientID %&amp;gt;&quot;);
   var htmlheight = document.documentElement.clientHeight;
   viewer.style.height = (htmlheight - 150) + &quot;px&quot;;
}
&lt;/pre&gt;&lt;br /&gt;
透過這個函式可以抓到瀏覽器的高寬來設定ReportViewer的高寬，這樣不管在網頁載入時或是瀏覽器視窗高寬變更時，ReportViewer的尺寸也會跟著變動。如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: js;&quot;&gt;window.onload = function load() { ResizeReport(); }
window.onresize = function resize() { ResizeReport(); }
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/244792562942913659/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2012/07/reportviewer.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/244792562942913659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/244792562942913659'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2012/07/reportviewer.html' title='如何讓您的ReportViewer 通吃各種瀏覽器？'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-2267366074967446364</id><published>2012-07-09T22:51:00.000+08:00</published><updated>2013-03-07T22:45:14.459+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joomla"/><category scheme="http://www.blogger.com/atom/ns#" term="Projectfork"/><title type='text'>Projectfork 繁體中文語言包</title><content type='html'>最近在研究OPEN SOURCE的PM系統，雖然ProjectPier的功能很誘人，&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;但是畢竟是內部的專案平台，還是選了架在Joomla上的模組Projectfork，它的最大特點是簡單易用，對於使用方法不需要花費太多時間教育訓練，不過他沒有繁體中文語言包，而選Joomla平台的另一個原因，是小弟曾經用它寫了不少案子，除了增加它的功能，當然改語系檔就不是什麼困難的工作了。雖然翻的不是很好，但同仁在語意大致可以清楚瞭解，目前改到第009版，未來還會繼續修正的，有需要的讀者可以留言給我，再分享給各位。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjwz5yxTgjcUq0_F_OqZULWlvdjKiF6Ol4ntJQPS3Vjg1afyRlJMBOkg1K7hTjNRjykXTe9heIWiFOf9Vu6MMH1VVvzS_-UDti10pw4GkN6DLMqppJ6xHYyn-Dh60T-q7RlTCsVOviTsE/s1600/2012-07-09_224853.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjwz5yxTgjcUq0_F_OqZULWlvdjKiF6Ol4ntJQPS3Vjg1afyRlJMBOkg1K7hTjNRjykXTe9heIWiFOf9Vu6MMH1VVvzS_-UDti10pw4GkN6DLMqppJ6xHYyn-Dh60T-q7RlTCsVOviTsE/s400/2012-07-09_224853.png&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;2013.03.07附加&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;各位:目前筆者忙於工作，升版4.0的計劃有些延誤，若完成會再發佈文章與大家分享。&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/2267366074967446364/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2012/07/projectfork.html#comment-form' title='27 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2267366074967446364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2267366074967446364'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2012/07/projectfork.html' title='Projectfork 繁體中文語言包'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjwz5yxTgjcUq0_F_OqZULWlvdjKiF6Ol4ntJQPS3Vjg1afyRlJMBOkg1K7hTjNRjykXTe9heIWiFOf9Vu6MMH1VVvzS_-UDti10pw4GkN6DLMqppJ6xHYyn-Dh60T-q7RlTCsVOviTsE/s72-c/2012-07-09_224853.png" height="72" width="72"/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-3962369979427990992</id><published>2012-03-30T22:22:00.003+08:00</published><updated>2012-03-30T22:22:59.641+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MSSQL"/><title type='text'>變更MSSQL Server的主機名稱(ServerName)</title><content type='html'>SQL Server的ServerName預設都會抓安裝時的ComputerName，&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;若需要更改機器的命名規則以方便管理時，就需要一併變更SQL Server的ServerName，否則無法以機器名稱連線的。&lt;br /&gt;
&lt;br /&gt;
以下指令需在SSMS下的查詢視窗執行&lt;br /&gt;
&lt;br /&gt;
select @@servername&lt;br /&gt;
sp_dropserver &quot;MyOldServerName&quot;&lt;br /&gt;
sp_addserver &quot;
MyNewServerName&amp;nbsp;&quot;,local&lt;br /&gt;
&lt;br /&gt;
重啟服務後生效新的主機名稱，為什麼要加local呢？可以將前面的 ServerName 定義為本機伺服器的名稱，並且讓操作者在查詢 @@SERVERNAME 函數時傳回 ServerName 的值。&lt;br /&gt;
&lt;br /&gt;
若非預設的INSTANCE時，使用下列方式做變更。&lt;br /&gt;
&lt;br /&gt;
select @@servername&lt;br /&gt;
sp_dropserver &quot;JBERP-DVP\PRC&quot;&lt;br /&gt;
sp_addserver &quot;JBERP_DVP\PRC&quot;,local&lt;br /&gt;
&lt;br /&gt;
一樣是重啟服務後生效新的主機名稱。&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/3962369979427990992/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2012/03/mssql-serverservername.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3962369979427990992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/3962369979427990992'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2012/03/mssql-serverservername.html' title='變更MSSQL Server的主機名稱(ServerName)'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-4498480764274576672</id><published>2012-03-30T19:55:00.002+08:00</published><updated>2012-03-30T19:58:49.262+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="VB.NET"/><title type='text'>VB.NET重新啟動Windows服務</title><content type='html'>平常在寫監控的朋友，一般應該都是使用net start / net stop / net pause / net continue系列的指令，&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;做成批次檔，然後定時來重啟服務。不過工具程式應該要整合這些功能在工具軟體裡，而且重要的一點是，必須將相依的服務一起停止與啟動，讓我們來看看怎麼做：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim Controller As New ServiceController(&quot;DHCP Client&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim RunningDService As String = &quot;&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim scServices As ServiceController() = Controller.DependentServices&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;沒有依存的服務&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If scServices.Length = 0 Then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If Controller.Status = ServiceControllerStatus.Running Then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.Stop()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.WaitForStatus(ServiceControllerStatus.Stopped)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WriteToLog(&quot;停止服務 COM+ Event System 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End If&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.Start()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.WaitForStatus(ServiceControllerStatus.Running)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;等待啟動成功後再寫LOG&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WriteToLog(&quot;啟動服務 COM+ Event System 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Else &#39;有依存服務時需先停止依存服務&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim scTemp As ServiceController&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; For Each scTemp In scServices&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If scTemp.Status = ServiceControllerStatus.Running Then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scTemp.Stop()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scTemp.WaitForStatus(ServiceControllerStatus.Stopped)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;等待停止成功後再寫LOG&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WriteToLog(&quot;停止相依服務 &quot; &amp;amp; scTemp.DisplayName &amp;amp; &quot; 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RunningDService = RunningDService &amp;amp; scTemp.DisplayName&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End If&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next scTemp&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If Controller.Status = ServiceControllerStatus.Running Then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.Stop()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.WaitForStatus(ServiceControllerStatus.Stopped)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;等待停止成功後再寫LOG&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;WriteToLog(&quot;停止服務 &quot; &amp;amp; Controller.DisplayName &amp;amp; &quot; 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End If&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.Start()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Controller.WaitForStatus(ServiceControllerStatus.Running)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;WriteToLog(&quot;啟動服務 &quot; &amp;amp; Controller.DisplayName &amp;amp; &quot; 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;啟動主要服務後，再啟動依存服務&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; For Each scTemp In scServices&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If InStr(RunningDService, scTemp.DisplayName) &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scTemp.Start()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scTemp.WaitForStatus(ServiceControllerStatus.Running)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;等待啟動成功後再寫LOG&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;WriteToLog(&quot;啟動相依服務 &quot; &amp;amp; scTemp.DisplayName &amp;amp; &quot; 成功!!&quot;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End If&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next scTemp&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
以上程式直接放在按鈕的CLICK事件中即可執行，在程式中加了一些註解希望對看倌們有幫助。當然可以更進階的使用，把程式弄成常駐，每隔一段時間去詢問Service的狀態，如果不是已啟動時，使重啟它，這個方法還蠻簡單好用的，筆者常拿來使用。</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/4498480764274576672/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2012/03/vbnetwindows.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4498480764274576672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/4498480764274576672'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2012/03/vbnetwindows.html' title='VB.NET重新啟動Windows服務'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-6392560977518033933</id><published>2012-03-29T23:38:00.000+08:00</published><updated>2012-03-30T20:36:50.342+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="VB6"/><title type='text'>變數宣告最容易忽略的東西</title><content type='html'>&lt;br /&gt;
在資料庫程式設計時，很容易把表格中的自動遞增的欄位做為主鍵值，但這就無法避免在程式裡把他取出來做條件判斷或搜尋，&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;而這裡存此欄位值的暫存變數則要小心宣告，常遇到有同事把範圍設的太小，導致一開始程能跑，一但資料開始增加超過資料型態所能接受的數值範圍時，就會出現OverFlow的錯誤，這提供一些範圍讓大家參考：&lt;br /&gt;
&lt;br /&gt;
Byte &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Store integer values in the range of 0 - 255&lt;br /&gt;
Integer &amp;nbsp; &amp;nbsp; Store integer values in the range of (-32,768) - (+ 32,767)&lt;br /&gt;
Long &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Store integer values in the range of (- 2,147,483,468) - (+ 2,147,483,468)&lt;br /&gt;
Single &amp;nbsp; &amp;nbsp; &amp;nbsp; Store floating point value in the range of (-3.4x10-38) - (+ 3.4x1038)&lt;br /&gt;
Double &amp;nbsp; &amp;nbsp; Store large floating value which exceeding the single data type value&lt;br /&gt;
Currency &amp;nbsp; store monetary values. It supports 4 digits to the right of decimal point and 15 digits to the left&lt;br /&gt;
&lt;br /&gt;
通常如果是要存放遞增欄位值的暫存變數，我都宣告成Long，這樣能接受的範圍比較大。</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/6392560977518033933/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2012/03/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6392560977518033933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/6392560977518033933'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2012/03/blog-post.html' title='變數宣告最容易忽略的東西'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4753782280520564049.post-2900570907460587485</id><published>2011-01-26T13:31:00.000+08:00</published><updated>2015-05-19T15:55:33.014+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="SSRS"/><title type='text'>檔案 &#39;/XXXX.aspx&#39; 尚未完成先行編譯，因此無法要求此檔案。</title><content type='html'>當開發好的ASP.NET(含Report Viewer)網站，&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;想把網站部署到正式環境，筆者所使用的方式是在開發環境先行編譯後，再將編譯好的程式檔案複製到新機器的目錄上，不過最近遇到這個問題，在開發環境是正常執行，但到了正式環境後出現&quot;檔案 &#39;/XXXX.aspx&#39; 尚未完成先行編譯，因此無法要求此檔案。&quot;的錯誤訊息頁面，試著利用下列指今在新環境重新編譯：&lt;br /&gt;
&lt;br /&gt;
C:\Windows\Microsoft.NET\Framework\v2.0.50727&amp;gt;aspnet_compiler -v / -p &quot;D:\Temp\RPT&quot; c:\temp&lt;br /&gt;
&lt;br /&gt;
原始碼：D:\Temp\C2ERPRPT&lt;br /&gt;
編譯後：c:\temp&lt;br /&gt;
-v：網站虛擬目錄&lt;br /&gt;
&lt;br /&gt;
得到下列訊息：&lt;br /&gt;
D:\Temp\RPT\web.config(35): error ASPCONFIG: 無法載入檔案或組件 &#39;Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1&lt;br /&gt;
1d50a3a&#39; 或其相依性的其中之一。 系統找不到指定的檔案。&lt;br /&gt;
&lt;br /&gt;
原來是ReportViewer的函式庫沒有帶進來，需複製下面兩個檔案到目錄[網站根目錄\bin]下(筆者使用VS2010版本)：&lt;br /&gt;
&lt;br /&gt;
目錄：&lt;br /&gt;
C:\Program Files\Microsoft Visual Studio 10.0\ReportViewer&lt;br /&gt;
檔名：&lt;br /&gt;
Microsoft.ReportViewer.Common.dll&lt;br /&gt;
Microsoft.ReportViewer.WebForms.dll&lt;br /&gt;
&lt;br /&gt;
這樣找到問題點後，其實不需再從新編譯，直接將編譯好的程式檔案，目錄[網站根目錄\bin]放入上方兩個檔案，在新環境即可正常執行了。</content><link rel='replies' type='application/atom+xml' href='http://cch8.blogspot.com/feeds/2900570907460587485/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://cch8.blogspot.com/2011/01/xxxxaspx.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2900570907460587485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4753782280520564049/posts/default/2900570907460587485'/><link rel='alternate' type='text/html' href='http://cch8.blogspot.com/2011/01/xxxxaspx.html' title='檔案 &#39;/XXXX.aspx&#39; 尚未完成先行編譯，因此無法要求此檔案。'/><author><name>My Blog</name><uri>http://www.blogger.com/profile/00496829850931879745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>