Blog Feed

在Window佈署Apache & Flask

這次是要佈署一個tensorflow的影像辨識在目前的系統上,既有的方式是在.NET上面呼叫bat檔案 再執行py檔完成這件事情

這樣做主要有幾個問題

速度慢:在每一次的request都需要重新開啟py檔,代表都會重新import,尤其tensorflow本身就需要時間

Debug困難:因為所有的錯都無法讀到,在.NET這邊就只會timeout error

先前的開發使用了試誤法,把環境變數 conda的環境位置都設定在bat檔案裏面才能開

SET python_root=
SET miniconda_root=
SET PATH=

這些設定好之後才能順利執行

而這次由於Debug實在太麻煩,我就決定直接寫Flask API把他完成

在執行面很快就可以架好一個local host在windows server上面,但是問題是要如何正式佈署

就是在重開機等操作之後仍正常開啟

我試過了 本篇文章 是利用windows task manager自動執行bat

不過也是不好debug,於是我就看到了用Apache開Flask

於是 第一步是開啟Apache

下載好Apache (從Apache Lounge) 之後解壓縮到 C:\Apache24

執行裡面bin\httpd.exe 就會在 local host看到 it works的字樣代表成功

這裡第一個會遇到的問題就是 如果預設的80 port已經有開了什麼服務,就必須換一個port

在 conf資料夾裡面的 httpd.conf可以修改

然後接下來就是要開啟Flask

在想要的資料夾 這裡用C:\dev

我試過好像在太多層也會出一些問題

資料夾裡面就是 appname資料夾 裡面放 __init__.py; wsgi_scripts資料夾裡面放appname.wsgi

結論 windows就用IIS佈署好了

自己架設Nuget server

如果遇到通用套件,自己內部使用又不想放到外面,除了使用dll傳送檔案之外,自己架設一個nuget server就是可以使用的選項

那在看microsoft自己的官方nuget server的時候,發現是dotnet framework,github的星星數量也才幾百,多找了幾個之後,選用Baget Server

原本的nuget server的問題就是會遇到core NET 5 6等 target framework的時候就會跑不出來

https://loic-sharma.github.io/BaGet/

在我測試Baget的時候都沒有遇到問題

不過需要再研究是 他接到database做搜尋的方式

那目前有做出來的就是

針對不同的framework

  <PropertyGroup>
    <TargetFrameworks>
		netstandard2.1;
		netcoreapp2.1;
		netcoreapp2.2;
		netcoreapp3.0;
		netcoreapp3.1;
		net5.0;
		net6.0;
	</TargetFrameworks>
    <Version>1.1.1</Version>
  </PropertyGroup>

在不同的framework用不同的dependency

<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
    <Reference Include="System.Net" />
    <PackageReference Include="Newtonsoft.Json" Version="6.0.5" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
    <PackageReference Include="Newtonsoft.Json" Version="8.0.3" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

在不同framework做不同的事情

        public static string version()
        {
#if NET5_0
            return "5.0";
#elif NET6_0
            return "6";
#elif NETCOREAPP2_1
            return "21";
#else
            return "else";
#endif
        }

docker compose for jenkins

docker-compose.yml

version: ‘3.7’
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
user: root
ports:
– 8083:8080
– 50003:50000
container_name: my-jenkins-3
volumes:
– ~/jenkins_data:/var/jenkins_home
– /var/run/docker.sock:/var/run/docker.sock

AspNet 新增user/role表格

在用了預設的 identity之後 就會要加欄位了

原本的用法是有userstore/ usermanager rolestore rolemanager

以下是已經改好之後的設定

        private UserStore<ApplicationUser> userStore;
        private UserManager<ApplicationUser> userManager;
        private RoleStore<ApplicationRole> roleStore;
        private RoleManager<ApplicationRole> roleManager;

            userStore = new UserStore<ApplicationUser>(applicationDbContext);
            userManager = new UserManager<ApplicationUser>(userStore);
            userManager.UserValidator = new UserValidator<ApplicationUser>(userManager) { AllowOnlyAlphanumericUserNames = false };
            roleStore = new RoleStore<ApplicationRole>(applicationDbContext);
            roleManager = new RoleManager<ApplicationRole>(roleStore);
繼續閱讀 “AspNet 新增user/role表格"

CODER的隨手筆記系列-註解

註解寫的是 為什麼要這樣做 程式碼本身就說明了做了什麼

例如 因為這裡要先排除undefined才能開始

或是 先檢查工程編號格式是否正確

抑或是 當下的trade-off

因為某些困難點,只能先放技術債在這邊,如果真的要重構的時候再來做

Angular Material Table 可排序、分頁的表格

好的,我的技能要新增Angular了,公司的上一個專案是單機程式,bentley Map的外掛功能,這次回到網頁的本業

雖然說是本業,但其實,也不是ESRI的地圖,也是擦屁股的其他系統,不過我覺得反而相對好,這次是Angular + Dotnet Core 2.2 + Docker發布 + Nginx

所以我就準備來寫Angular啦

Angular + dotnet core是VS內建的選項之一 另外一個是React

Angular的優勢在於一頁式網站,並且不需要那麼大量的外接Library

然後他是一個比較嚴謹的框架,照著他的架構來使用 components, service等等

其實網路上找來找去三大框架也都各有所長,既然手上遇到的是angular就直接用

繼續閱讀 “Angular Material Table 可排序、分頁的表格"