2022年3月23日 星期三

for xamarin.form (IOS)--「 System.Drawing is not supported on this platform. 」

 最近有個繪圖的需求,是要在contentpage顯示一些類似stack chart

原先設計好了用system.drawing 套件的image/graphics的一些繪製工作(輸出byte array,跟xamarin form page無關)的元件.

然而....移植到xamarion.ios就現問題了

ex:

var image=Image.FromStream(byteArra);  

就會遇到平台不支援的問題

雖然是有找到類似從stream 取得native image的方式,但是那又衍生出UIImage /Android Bitmap如何轉換成system.drawing.image的問題

你或許會說「不是有libgdiplus了嗎?安裝那個套件應該可以了吧」答案是linux可以,可是ios就是不行

最後解決方式就是用skiasharp套件了

是可以用SKCanvasView直接在上面繪製,參考此例

(而且SkCanvasview也支援gesture!! 參考這個skcanvasview繪圖板範例)

可是之前寫的元件真的是不用傳入content page的東西,只是要收byte array再顯示到xamarin.form.image裡

如何改才行!?

答案,還是在canva裡,只是要用surface來作存檔輸出

----example------

          var skImg = SKImage.FromEncodedData(backgroundPngByteArray);

            var info = new SKImageInfo(472, 866);//底圖寬高

            using (var surface = SKSurface.Create(info, info.RowBytes)) {

                SKCanvas canvas = surface.Canvas;

                 //繪製底圖

                canvas.DrawBitmap(SKBitmap.FromImage(skImg), 0, 0, null);

                ...

                 ...人生如畫布,自己是畫家,精彩好壞盡在自我.....

                 ....

                canvas.Flush();

                canvas.Save();

                surface.Flush();

//以下兩行不能少,直接拿「surface.Snapshot().EncodedData」來用是null的,要小心

                var snapshot = surface.Snapshot();

                var encodeData = snapshot.Encode();

                return encodeData.ToArray(); 最後,輸出byte array,就可以給之前的imageview做source了

            }

---------------------

先前一直堅持一定要用system.drawing,試了一堆東西花了二個工作日,都沒有適合的

(實在不想動之前寫好的元件)

最後,長痛不如短痛,直接去元件裡下手,改用Skiasharp,把一些原本的System.Draw.Graphics.Draw...改用skcanvas.Draw....

一下子半天就改好了 .

早知道就用skiasharp了.

同場加映--在這次修改補完計畫中,無意間遇到一個類似手繪「繪圖板/簽名區」的元件--他叫「DrawingView」看起來不錯用,影音示範請看這裡

順便在此分享


2022年1月20日 星期四

in ubuntu :把網卡從固定ip改為DHCP

 在很久很久以前,有一個VM,裡面有一個烏托邦...不,是烏邦圖(ubuntu),裡面有一張網卡是固定ip

結果在那之後的很久很久以後,它吃土了...不,是出土了,被拿來用了

可是現在wifi已經改了,原本的ip也要改為DHCP,如何是好?

很簡單,先用ifconfig 查一下要改的網卡的id

然後,還是ifconfig,用以下指令:

----------------------------------------------------

ifconfig 那網卡的id 0.0.0.0 0.0.0.0 && dhclient  
------------------------------------------------
記得!!以上這指令是要用root權限,才能作業
所以要先用「sudo -i」切換身份下去做,
可是,一旦重開機,ip又回去那個固定ip去了,彷彿可以聽到阿土在竊笑(以你為故事就這樣結束了嗎?)
好啦,真正要改的,還是在/etc/netplan裡那個yaml檔,
把ip拿掉,改成這樣
----------------------------------------
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: yes
      nameservers:
          addresses: [8.8.8.8, 168.95.1.1]
  version: 2	
----------------------------------------
(別忘了改完用「sudo netplan try」去給他跑一下)
於是,這個阿土(烏邦圖)它就又可上網了,過著無眠無日的網路伺服器的生活了,Ya....
(好爛的故事哦)
本篇技術參考


2022年1月17日 星期一

Winform--自動折行的Label

 原本想說Label這種元件是再普通不過的了,所以應該有自動折行的功能(至少在IOS的UIlabel有這樣的屬性,想不到在歷史悠久的winform架構居然沒有!?
(果然真的歷史悠久,以下的帖子是2006來的)

好在這鐵板已經有人踢過了參考這裡,怕雄雄找不到連結,我還是Ctl+C Ctl+V一下了

---------------------------------------------------------------------------------------------------

using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

public class GrowLabel : Label {
  private bool mGrowing;
  public GrowLabel() {
    this.AutoSize = false;
  }
  private void resizeLabel() {
    if (mGrowing) return;
    try {
      mGrowing = true;
      Size sz = new Size(this.Width, Int32.MaxValue);
      sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
      this.Height = sz.Height;
    }
    finally {
      mGrowing = false;
    }
  }
  protected override void OnTextChanged(EventArgs e) {
    base.OnTextChanged(e);
    resizeLabel();
  }
  protected override void OnFontChanged(EventArgs e) {
    base.OnFontChanged(e);
    resizeLabel();
  }
  protected override void OnSizeChanged(EventArgs e) {
    base.OnSizeChanged(e);
    resizeLabel();
  }
}

-----------------------------------------------

可是我只想用拖拉的方式來設計,不想再一一填入座標、色彩等屬性了啊

輕鬆點,只要你把這東西編譯後,tools裡就可以找出來讓你拖拖拉拉了 (記得先設定MaxSize的width)

P.S.:

之前笑人家都什麼時代了還在寫winform,

結果現在客人就有要用winform,

真的是話別說太快的好



 




2022年1月11日 星期二

STM32板子雄雄無法連結(by st-link),如何重設?

 把東西搞當一直是我的才能之一,尤其是韌體相關的工作
最近在玩stm32F411CEU6 (black pill),範例程式沒改好,debug之後連Stm32CubeProgrammer用ST-Link也失連了(DEV_CONNECT_ERR ) 明明之前它還是可以連結的啊....

如何恢復最初的狀態?
先把它的「Boot0 」及「NRST」(即,低電位RESET)一起按著,這時,你在「Stm32CubeProgrammer」要連結它時,會出現以下訊息

(出現「DEV_TARGET_HELD_UNDER_RESET」)
出現這訊息後,放開那個女的放開那兩個按鈕,點左下角的橡皮擦圖示,就可以把板子重設了







遇到Stlink Upgrade視窗 (訊息:ST-Link is not in the DFU mode. Please restart it)要怎麼處理?

最近在玩Stm32,在debug燒錄時遇到stlink upgrade driver提示,「upgrade...好啊」我二話不說立即同意了,結果出現了這東西....

遇到這樣的視窗,首先,先點選視窗中「Open in upgrade mode」按鈕
之後,出現這樣的訊息 「ST-Link is not in the DFU mode. Please restart it」,如下圖











這時,別狂叫草泥馬狂點上面的Open in update mode按鈕, 一直點擊也沒有,你現在要做的,就只是把ST-Link重插拔就是了,

拔插後,聽到windows USB pnp-plugin的音效後,再點擊「Open in update mode」按鈕,這時畫面才會有所變動:



這時,「Upgrade」按鈕才會被enable,現在就點擊他,讓STLINK upgrade吧

stm32要學的真的太多了




2022年1月3日 星期一

用 Scaffold-DbContext 指令時遇到「Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.」錯誤訊息!?

 呃,應該是說之前為什麼沒遇到這問題吧

因為之前用Scaffold建置EF時是連到本機的資料庫,而這次是連接remote sql server的資料庫

所以原先的 connection string --「"Server=遠端DBIP;Database=資料庫;Trusted_Connection=True;"」

要改成「"Server=遠端DBIP;Database=資料庫;;User ID=帳號;Password=登入密碼;Trusted_Connection=True;"」 是的,題就出在trusted connection

以上參考這篇

老句話,要執行Scaffold指令前別忘了備份一下專案(最少DBcontext檔要備份)

新年快樂

2021年12月23日 星期四

Xamarin.form 如果你用的是shell架構,如何 handle "back button"事件

 最近因為要在back (< ) button事件中加上動畫(沒辦法,資料總是要從網路下載)

真的是試破頭殼了

其原因是因為我忘了是套用了shell架構,所以content page上方的back button點擊時是不會觸發OnBackButtonPressed 事件的 (但如果是用螢幕下方的 "<" button,是會觸發這個事件的)

好在先進有類似的情境(如,回上一頁時要先做確認的動作)

這時就可以參考這篇文章了

在此介紹給xamarin form的同好

一起加油吧!!

2021年12月21日 星期二

OSM圖資概念相關連結

 osm的技術官網:

https://wiki.openstreetmap.org/wiki/API

在的網頁內嵌入osm,ref https://noob.tw/openstreetmap/

tile的觀念: http://blog.changyy.org/2012/05/openstreetmap-api.html 

(觀念很重要,因為日後從緯經度推算tile一定會用到)

就static map而言,就應該是緯經度推算成tile,所以請參考以下網址

https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames


有了tile,那推算出大致位置的方式,就用比例去推算了

參考這則討論


如果,你真的只是要產出幾張圖,那就到

https://www.openstreetmap.org 用右手側工具區有個「分享」icon 
就可把你目前看到的地圖輸出成png/jpeg/pdv/svg 了
(有了底圖了,那在上面加些圖示標記就是你的事了)
大不了時辰到了,不,時間到了,再叫值日生來這下載圖片來用
(如果卡骨力一點,你直接用browser的debuger去看reuqest送出什麼,自己包api也行)

如果貴公司的用量(請求數)每月不超過15000次請求的話,那就去MapQuest註冊API來用吧
https://business.mapquest.com/pricing-plans


O.S.明明專案只是要幾張可能不會異動的地圖,居然花了半個月來study這東西,沒辦法,Google map是要錢的啊....





2021年12月10日 星期五

how to resize an existing vdi disk in vbox + resize an Ubuntu 18.04/20.04 LVM disk

step 1..to resize vdi of VBox ,please refer to :

https://www.howtogeek.com/124622/how-to-enlarge-a-virtual-machines-disk-in-virtualbox-or-vmware/

 File > Virtual Media Manager in the main VirtualBox window

step2 .extend to 100 free space.

ref:
https://kb.vander.host/operating-systems/how-to-resize-an-ubuntu-18-04-lvm-disk/

用sudo -i  (root身份去執行)

其中,

-------------------------------------

user@server:~# parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart
Partition number? 3
End? [26.8GB]?   <--這地方要自己輸入,不能只按enter,
因為parted 是不知道你有多少空間可以用 
(在上一個指令「fdisk -l」裡「Disk /dev/sda: 30.25 GiB」就是我們可用(用步驟1改的vdi大小)的大小,
所以請在此填入32.25G)
(parted) quit
Information: You may need to update /etc/fstab.
----------------------------------------------
接著用
 pvresize /dev/sda3
上述才會生效
又,我是直接用「lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv」
確定它出現以下訊息
------------------------------------------
 Size of logical volume ubuntu-vg/ubuntu-lv changed from <9.00 GiB (2303 extents) to 29.24 GiB (7486 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
---------------------------------------------
才是正確地完成了lvextend指令,
當然別忘了之後的「resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv」指令,再用df -h 確定LVM有擴充
才是真的功德圓滿了
以上,加油了!!

------------------------------------

apt-update時遇到「Err:1 http://tw.archive.ubuntu.com/ubuntu focal InRelease Splitting up /var/lib/apt/lists/tw.archive.ubuntu.com_ubuntu_dists_focal_InRelease into data and signature failed」錯誤訊息

 最近在用ubuntu 安裝sql server 時出現以問題
-------apt update後----
Hit:1 http://tw.archive.ubuntu.com/ubuntu focal InRelease
Hit:2 http://tw.archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:3 http://tw.archive.ubuntu.com/ubuntu focal-backports InRelease
Hit:4 http://tw.archive.ubuntu.com/ubuntu focal-security InRelease
Err:1 http://tw.archive.ubuntu.com/ubuntu focal InRelease
  Splitting up /var/lib/apt/lists/tw.archive.ubuntu.com_ubuntu_dists_focal_InRelease into data and signature failed
Err:2 http://tw.archive.ubuntu.com/ubuntu focal-updates InRelease
  Splitting up /var/lib/apt/lists/tw.archive.ubuntu.com_ubuntu_dists_focal-updates_InRelease into data and signature failed
Err:3 http://tw.archive.ubuntu.com/ubuntu focal-backports InRelease
  Splitting up /var/lib/apt/lists/tw.archive.ubuntu.com_ubuntu_dists_focal-backports_InRelease into data and signature failed
------------------------------------------
google了一下,有些解法
1.直接用「apt-get clean」在這討論的內容
2.dhcp問題  ,參考這裡
我是用apt-get clean解決的
為了怕日後遇到又要查很多,特此誌之