星期四, 7月 23, 2020

[X.Form] Frame - 基礎屬性

閱讀官方文章時發現,原來 Frame 可以讓 View 具有圓角、陰影功能

Frame 重要屬性

屬性
型態
說明
BorderColor
Color
框線顏色
CornerRadius
Float
角落圓角半徑
HasShadow
Bool
框架是否有陰影

官方文章內的 HasShadow 說明
The HasShadow property behavior is platform-dependent. The default value is true on all platforms. However, on UWP drop shadows are not rendered. Drop shadows are rendered on both Android and iOS but drop shadows on iOS are darker and occupy more space.
很簡易地呈現一下效果
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="FrameDemo.MainPage">

    <StackLayout Padding="10">
        <Frame>
            <Label Text = "Frame - 預設" FontSize = "Large"/>
        </Frame>
        <Frame BackgroundColor="LightGray"
                   BorderColor="Orange"
                   CornerRadius="10"
                   HasShadow="True">
            <Label Text="Frame - 圓角、陰影" FontSize="Large"/>
        </Frame>
    </StackLayout>

</ContentPage>

[X.Form] Frame - 基礎屬性

星期四, 7月 16, 2020

[SQL] 逾時到期

模擬長時間 Block 時,一直出現 [逾時到期],如下圖

[SQL] 逾時到期-1

查 選項 => 查詢執行 => SQL Server => 執行逾時,發現是 0 表示不會逾時

[SQL] 逾時到期-2

在連線 SSMS 選項內發現,執行逾時預設為 3 秒,加大該設定就行

[SQL] 逾時到期-3

星期三, 7月 15, 2020

[SQL] Blocked Process Threshold - SQL Profile

延續該篇筆記 - [SQL] Blocked Process Threshold - Extended Events,只是工具改為 SQL Profile

SQL Profile 內選擇 Errors andWarmings 內的 [Blocked process report]

[SQL] Blocked Process Threshold - SQL Profile-1

當 Block 超過 15 秒,SQL Profile 就會抓到

[SQL] Blocked Process Threshold - SQL Profile-2

星期二, 7月 14, 2020

[SQL] Blocked Process Threshold - Extended Events

已封鎖的處理序臨界值伺服器組態選項 文章內容
  • 使用 blocked process threshold 選項,以秒為單位來指定產生已封鎖處理序報表的臨界值。 預設不會針對已封鎖的處理序產生任何報告。 對於系統工作或在等待不產生可偵測死結的資源的工作,並不會產生此事件。
  • 不保證即時或甚至接近即時的報告。

設定伺服器組態 - 「已封鎖的處理序臨界值 (blocked process threshold)」

設定重點
  • 根據需求設定鎖定秒數需觸發 blocking 事件,該篇筆記是設定 15 秒
  • 設定值為 0 到 86,400,但設定秒數必須大於等於 5,設定 1 - 4 秒,會造成死結監視器不斷執行,不建議長期使用,詳見 增加或停用 Blocked Process Threshold
  • 設定立即生效,伺服器不必停止再重新啟動

利用語法設定
EXECUTE sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXECUTE sp_configure 'blocked process threshold', 15 -- 設定 15 秒
GO
RECONFIGURE
GO
EXECUTE sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
利用 SSMS 設定

設定 Extended Events

一般:新增工作階段 - [Block Process Threadhold Demo],並勾選 [在伺服器啟動時啟動事件工作階段] 和 [在工作階段建立後立即啟動工作階段]
事件:透過搜尋功能,搜尋 Blocked 關鍵字,並選取 [blocked_process_report] 事件
資料存放區:加入 [event_file] 類型,並指定檔案存放位置
設定完後可以利用 [指令碼] 功能,產生 Extended Events Script 來觀察
CREATE EVENT SESSION [Blocked Process Threshold Demo] ON SERVER 
ADD EVENT sqlserver.blocked_process_report
ADD TARGET package0.event_file(SET filename=N'D:\Blocked Process Threshold Demo.xel')
WITH (STARTUP_STATE=ON)
GO

利用 TSQL 產生 block 並開啟 [監看即時資訊] 來觀察或 sys.fn_xe_file_target_read_file 查詢 block 資訊


--在 TempDB 建立 tblBlockDemo 資料表,並透過 Begin Transaction 開啟交易,並鎖定資料表 20 秒
USE [TempDB]
GO

CREATE TABLE tblBlockDemo (ID int identity primary key)
GO

BEGIN TRANSACTION
INSERT INTO tblBlockDemo DEFAULT VALUES
WAITFOR DELAY '00:00:20'
COMMIT

--開啟另一個 T-SQL 視窗執行以下語法,查詢資料表 tblBlockDemo
USE [TempDB]
GO
SELECT * FROM tblBlockDemo
從即時訊息中就可以看到 block 資訊
點選 blocked_process 就可以叫出 xml 來觀察 block 細節

利用 sys.fn_xe_file_target_read_file 查詢
SELECT
    event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
    event_data.query('(event/data[@name="blocked_process"]/value/blocked-process-report)[1]') as [blocked_process_report]
FROM
(
    SELECT 
        CAST(event_data AS XML) AS event_data
    FROM sys.fn_xe_file_target_read_file('D:\Blocked Process Threshold Demo*.xel', NULL, NULL, NULL)
) AS T
GO

星期四, 7月 02, 2020

[VS] 視覺化檢視 - json

練習 [X.Form] FlexLayout 下中斷點時,發現原來 VS 就有把 json 視覺化功能

中斷點內,點選放大鏡,就可以看見 [json 視覺化檢視]

json 視覺化檢視-1

視覺化後的 json 資料

json 視覺化檢視-2

星期三, 7月 01, 2020

[X.Form] FlexLayout

根據 Xamarin.Forms FlexLayout 範例內的 PhotoWrap 來練習,該範例內示範的 url 練習時還是可以活著的,省去找圖片困惱

Xaml 配置

FlexLayout 使用屬性簡易說明
  • Direction="Row":由左往右排列
  • Wrap="Wrap":當擺不下時,往下折行
  • JustifyContent="SpaceAround":延排列方式各物件兩側各平均留邊
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="FlexLayoutDemo.PhotoWrapping">
    <ContentPage.Content>
        <Grid>
            <ScrollView Orientation="Vertical">
                <FlexLayout x:Name="flexLayout"
                        Direction="Row"
                        Wrap="Wrap"
                        JustifyContent="SpaceAround" />
            </ScrollView>

            <ActivityIndicator x:Name="activityIndicator"
                           IsRunning="True"
                           VerticalOptions="Center" />
        </Grid>
    </ContentPage.Content>
</ContentPage>
C# Code
namespace FlexLayoutDemo
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class PhotoWrapping : ContentPage
    {
        public PhotoWrapping()
        {
            InitializeComponent();

            ImageFillAsync();
        }

        private async void ImageFillAsync()
        {
            var files = await RecordParseAsync();

            foreach (string filepath in files)
            {
                Image image = new Image
                {
                    Source = ImageSource.FromUri(new Uri(filepath))
                };
                flexLayout.Children.Add(image);
            }

            activityIndicator.IsRunning = false;
            activityIndicator.IsVisible = false;
        }

        private async Task<List<string>> RecordParseAsync()
        {
            string rawJson = await DownloadDataAsync();
            JObject jsonObject = JObject.Parse(rawJson);
            var records = jsonObject["photos"]?.ToString();
            return JsonConvert.DeserializeObject<List<string>>(records);
        }

        private async Task<string> DownloadDataAsync()
        {
            string json = string.Empty;

            string url = "https://raw.githubusercontent.com/xamarin/docs-archive/master/Images/stock/small/stock.json";
            using (HttpClient http = new HttpClient())
            {
                json = await http.GetStringAsync(url);
            }
            return json;
        }
    }
}
拉到最下方觀察到 JustifyContent="SpaceAround" 效果

[X.Form] FlexLayout