未找到

未发布 【示例教程】使用leadtools的WCF接口功能实现从web端上传Dicom影像文件
by Harriet666 keys 分享 1517903663716
Leadtools 19总套包下载>>>
 
leadtools为web端提供了wcf接口来供用户可以登录pacs系统,检索,查看以及上传影像。本篇博客讲解如何创建一个网页来实现上传功能,通过WCF进行dicom文件的上传时,是将dicom文件转换为base64数据流,分段进行传输。
 
本篇博客运行的前提是已经部署完成Leadtools HTML5 Web Viewer,可以正常浏览。参考https://www.evget.com/article/2018/2/6/27757.html
 
在部署完成后,将下面的代码复制到一个HTML文件中,即可运行进行测试。另外需要添加html文件所需的jquery.min.js到同文件夹路径下。
<head>
    <meta charset="UTF-8">
head>

<form onsubmit="return false;">
    <input type="hidden" name="file_base64" id="file_base64">
    <input type="file" id="fileup" multiple="multiple">
    <input type="submit" value="submit" onclick="$.post('./uploader.php', $(this).parent().serialize());">
    <div>
        <div id="msg">div>
    div>
form>
<script src="scripts/jquery.min.js">script>
<script>

    $(document).ready(function () {
        authcookie = login();
        document.cookie = "authcookie=" + authcookie;
        $("#fileup").change(function () {
            getauthcookie("authcookie");
            filelist = this.files;
            file = filelist[fileindex];
            upload(file);
        });
    });
    var authcookie;//保存authcookie
    var filelist;//上传文件列表
    var file;//当前上传文件
    var tempfile = "";//临时文件名称
    var position = 0;
    var size = 40000;//分段大小
    var done = false;
    var fileindex=0;//当前上传文件序列号

    function upload(tempfile) {
        if(position==0)
            done=false;
        var reader = new FileReader();
        if (file.size > position + 40000)
            reader.readAsArrayBuffer(file.slice(position, position + 40000));
        else 
            reader.readAsArrayBuffer(file.slice(position, file.size));
        reader.onload = function (e) {
            if (e.target.readyState === 2) {
                var base64string = base64ArrayBuffer(e.target.result);
                var data = {
                    authenticationCookie: authcookie,
                    dicomData: base64string,
                    fileName: tempfile,
                    status: position==0?"start":"append"
                };
                tempfile = senddata(JSON.stringify(data));
                if (!done) {
                    position += 40000;
                    upload(tempfile);
                    if (position+40000>file.size)
                        done = true;
                }
                else {
                    var data = {
                        authenticationCookie: authcookie,
                        dicomData: "",
                        fileName: tempfile,
                        status: "done"
                    };
                    tempfile = senddata(JSON.stringify(data));
                    position = 0;
                    $("#msg").html($("#msg").html()+"第"+(fileindex+1)+"个文件已经上传完成

"); fileindex += 1; if (fileindex < filelist.length) { file = filelist[fileindex]; upload(tempfile); } else { fileindex = 0; $("#msg").html($("#msg").html() + "文件全部已经上传完成

"); } } } }; } function senddata(data) { var result; $.ajax({ type:"post", url: "http://localhost/MedicalViewerService19/StoreService.svc/UploadDicomImage", data: data, contentType: "application/json", dataType: "json", success: function(data){result= data}, async: false }); return result; } function login() { var auth; var logininfo = { userName: "a", password: "a", userData: "" }; $.ajax({ type: "post", url: "http://localhost/MedicalViewerService19/AuthenticationService.svc/AuthenticateUser", data: JSON.stringify(logininfo), contentType: "application/json", dataType: "text", success: function (data) { auth= data }, async: false }); return auth; } function query() { } function getauthcookie() { document.cookie.split(";").forEach(function (val, index) { var index = val.indexOf("="); if ($.trim(val.substring(0, index)) == "authcookie") { authcookie = $.trim(val.substring(index + 1, val.length)); } }); return ""; } function base64ArrayBuffer(arrayBuffer) { var base64 = ''; var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var bytes = new Uint8Array(arrayBuffer); var byteLength = bytes.byteLength; var byteRemainder = byteLength % 3; var mainLength = byteLength - byteRemainder; var a, b, c, d; var chunk; // Main loop deals with bytes in chunks of 3 for (var i = 0; i < mainLength; i = i + 3) { // Combine the three bytes into a single integer chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; // Use bitmasks to extract 6-bit segments from the triplet a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 d = chunk & 63; // 63 = 2^6 - 1 // Convert the raw binary segments to the appropriate ASCII encoding base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; } // Deal with the remaining bytes and padding if (byteRemainder == 1) { chunk = bytes[mainLength] a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 // Set the 4 least significant bits to zero b = (chunk & 3) << 4; // 3 = 2^2 - 1 base64 += encodings[a] + encodings[b] + '=='; } else if (byteRemainder == 2) { chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 // Set the 2 least significant bits to zero c = (chunk & 15) << 2 // 15 = 2^4 - 1 base64 += encodings[a] + encodings[b] + encodings[c] + '='; } return base64; } script>

6

未发布 Edraw Office Viewer component教程(二):将Excel嵌入VB 6并使之自动化
by Harriet666 keys 分享 1494475186338
Edraw office viewer component对于开发人员来说是一个将Microsoft Excel电子表格嵌入到vb.net应用程序中的简单可靠的解决方案。
 
使用Edraw office viewer component,vb开发人员可以轻松地将一个现有的Excel电子表格嵌入到表单中,然后进行自动化。在加载表单时,开发人员可以使用Open方法从硬盘驱动器或服务器中加载* .xls、* .xlsx、* .xslm或* .cvs文件,并在窗口的某个区域中打开。Excel文件可以是只读、完全编辑或禁止保存等状态。开发人员还可以使用excel组件轻松实现excel自动化。
 
本文将演示如何逐步将Excel嵌入到VB中。如果你没有officeviewer.ocx文件,请先安装。

Office viewer component - 支持Word、Excel、PowerPoint、Visio和Project的vb6、vb.net项目

在VB 6中嵌入Excel组件

启动Visual Basic并创建一个新的标准项目。默认情况下创建Form1。
在“工具箱”面板中,右键单击空白区域。然后单击Component...
 
在弹出的对话框中,查看Edraw Office Viewer Component。
 
单击确定按钮。
Office Viewer Component便已添加到“工具栏”窗口中。

切换到VB 6窗口,然后添加组件。

该组件包括许多自定义Excel窗口的方法、事件和属性。
开发人员可以使用以下代码在Form_Load事件中打开一个excel文件。
Private Sub Form_Load()
EDOffice1.OpenFileDialog'EDOffice1.OpenWord 
“d:\ test.xlsx” 
'EDOffice1.Open“d:\ test.xls”,“Excel.Application” 
End Sub

为了保护Excel工作表不被最终用户修改,开发人员需要在DocumentOpened事件中添加以下代码。
Private Sub EDOffice_DocumentOpened()
EDOffice1.ProtectDoc 1'XlProtectTypeNormal 
End Sub
 
一些包含excel自动化的方法可用于创建或修改Excel数据。
bool ExcelAddWorkSheet(long Index); 
bool ExcelDeleteWorkSheet(long Index); 
bool ExcelActivateWorkSheet(long Index); 
长ExcelGetWorkSheetCount(); 
bool ExcelSetCellValue(long Column,long Row,BSTR Value); 
BSTR ExcelGetCellValue(长列,长行); 
bool ExcelSetRowHeight(long Row,double Height); 
bool ExcelSetColumnWidth(long Column,double Width); 
afx_msg bool ExcelDeleteRow(long Row); 
bool ExcelDeleteColumn(long Column); 
bool ExcelInsertRow(long Row); 
bool ExcelInsertColumn(long Column); 
bool ExcelInsertPageBreakInRow(long Row); 
bool ExcelInsertPageBreakInColumn(long Column); 
bool ExcelCopyToClipboard(); 
bool ExcelPasteStringToWorksheet(BSTR bstText);

 

使用Visual Basic自动化操作Excel

单击项目,然后单击引用。将显示“引用”对话框。向下滚动列表,找到Microsoft Excel object库(Microsoft Excel xx.x Object库),然后选择引用Excel。如果列表中没有正确的Excel Object库,请确认你是否安装了合适的Excel版本。
单击“确定”关闭“引用”对话框。
将CommandButton添加到Form1。
在Form1的代码窗口中,插入以下代码:
Private Sub Command1_Click()
 
Dim oXL As Excel.Application
Set oXL = EDOffice1.GetApplication()
Dim oWB As Excel.Workbook
Set oWB = EDOffice1.ActiveDocument()
Dim oSheet As Excel.Worksheet
Dim oRng As Excel.Range
Set oSheet = oWB.ActiveSheet
oSheet.Cells(1, 1).Value = "First Name"
oSheet.Cells(1, 2).Value = "Last Name"
oSheet.Cells(1, 3).Value = "Full Name"
oSheet.Cells(1, 4).Value = "Salary"
' Format A1:D1 as bold, vertical alignment = center.
With oSheet.Range("A1", "D1")
.Font.Bold = True
.VerticalAlignment = xlVAlignCenter
End With
' Create an array to set multiple values at once.
Dim saNames(5, 2) As String
saNames(0, 0) = "John"
saNames(0, 1) = "Smith"
saNames(1, 0) = "Tom"
saNames(1, 1) = "Brown"
saNames(2, 0) = "Sue"
saNames(2, 1) = "Thomas"
saNames(3, 0) = "Jane"
saNames(3, 1) = "Jones"
saNames(4, 0) = "Adam"
saNames(4, 1) = "Johnson"
' Fill A2:B6 with an array of values (First and Last Names).
oSheet.Range("A2", "B6").Value = saNames
' Fill C2:C6 with a relative formula (=A2 & " " & B2).
Set oRng = oSheet.Range("C2", "C6")
oRng.Formula = "=A2 & "" "" & B2"
' Fill D2:D6 with a formula(=RAND()*100000) and apply format.
Set oRng = oSheet.Range("D2", "D6")
oRng.Formula = "=RAND()*100000"
oRng.NumberFormat = "$0.00"
' AutoFit columns A:D.
Set oRng = oSheet.Range("A1", "D1")
oRng.EntireColumn.AutoFit
oXL.UserControl = True
End Sub
 
按F5运行项目。Excel将自动填充excel单元格。
自动化Excel时要注意的一点是Excel Macro Recorder。它仍然在Word 2007中,但隐藏在开发者功能区栏。
 
以上就是本次教程的全部内容,接下来会有更多相关教程,敬请关注!您也可以在评论者留下你的经验和建议。
未发布 扫描识别工具Dynamic Web TWAIN使用教程:属性/方法/事件介绍
by Harriet666 keys 分享 1511947096620
Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。
本文为你介绍Dynamic Web TWAIN中属性/方法/事件的具体操作代码,欢迎收藏。
 
Dynamic Web TWAIN最新版免费下载>>>
 
当正确实施后,Dynamic Web TWAIN将在页面加载后自动初始化。一旦初始化,你就可以像堆任何正常的JS对象一样控制它。您可以参考我们的在线API文档来查看Dynamic Web TWAIN的所有内置属性、方法和事件。
 
这里有三种使用Dynamic Web TWAIN的方法:

属性

属性用于在运行时从Dynamic Web TWAIN中获取或设置特定的值,例如Resolution、Duplex、IfShowUI等。
1
2
3
/* Property */
/* Scan pages in 200 DPI */
DWObject.Resolution = 200;

方法

方法用于调用Dynamic Web TWAIN对象的内置函数,如AcquireImage、SaveAsJPEG、Rotate等。语法非常简单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Method
   
///
<summary> /// Rotates the image of a specified index in buffer by a specified angle.
  /// </summary>
///
<param name="sImageIndex" type="short" data-filtered="filtered">
specifies the index of image in buffer. The index is 0-based.
 
///
<param name="fAngle" type="float" data-filtered="filtered">
specifies the angle.
///
<param name="bKeepSize" type="bool" data-filtered="filtered">
specifies whether to keep the original size
///
<returns type="bool" data-filtered="filtered"></returns>
DWObject.Rotate(0, 45, false); // rotate the 1st image in the buffer by 45 degrees

事件

当达到某个触发点时触发事件。例如,OnMouseClick鼠标点击事件等。与属性和方法相比,事件是有点难度的。在这里我们再多谈一下。
 
处理事件
添加一个事件监听器
 
要添加事件监听器,可以使用内置方法RegisterEvent。请参考下面的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
/* OnWebTwainReady event fires as soon as Dynamic Web TWAIN is initialized and ready to be used. It is the best place to add event listeners */
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   DWObject.RegisterEvent("OnPostTransfer", Dynamsoft_OnPostTransfer);
}
function Dynamsoft_OnPostTransfer() {
   /* This event OnPostTransfer will be triggered after a transfer ends. */
   /* your code goes here*/
}
</script>
 
在上面的代码中,我们添加了JavaScript函数Dynamsoft_OnPostTransfer()作为事件OnPostTransfer的事件监听器。另外,你可以写这样的代码:
1
2
3
4
5
6
7
8
9
10
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   DWObject.RegisterEvent("OnPostTransfer", function() {
    /* your code goes here*/
   });
}
</script>
 
有参数的事件
一些事件具有参数。以OnMouseClick事件为例:
1
2
/* sImageIndex is the index of the image you clicked on*/
OnMouseClick(short sImageIndex)
 
当您创建相应的JavaScript函数(AKA,事件侦听器)时,可以包含参数并在运行时进行检索。
1
2
3
function DynamicWebTwain_OnMouseClick(index) {
    CurrentImage.value = index + 1;
}

或者
1
2
3
DWObject.RegisterEvent("OnPostTransfer", function(index) {
    CurrentImage.value = index + 1;
});
 
特殊事件 -“OnWebTwainReady”
在所有的内置事件中,有一个特殊事件“OnWebTwainReady”。基本上这个事件在Dynamic Web TWAIN对象被初始化并准备好使用的时候触发。正如您在本文前面看到的那样,推荐使用它的方法是:
1
2
3
4
5
6
7
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
}
</script>

或者
1
2
3
4
5
<script type="text/javascript" data-filtered="filtered">
   Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', function() {
     DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   });
</script>

本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!

未发布 移动开发UI工具包Xamarin.Forms v2.3.5-pre6发布
by Harriet666 keys 分享 1500454563990
Xamarin.Forms是一个跨平台、原生支持UI的工具包,允许开发者轻松创建用户界面。这些用户界面可以通过安卓、iOS和Windows Phone共享,使用目标平台的原生控件进行渲染,让每个平台上Xamarin.Forms应用的界面外观搭配得当。
Xamarin
 
v2.3.5-pre6更新内容
  • Xamarin.Forms现在与.NET Standard项目兼容! 并非所有创建功能都能正常工作。
  • 行为变化:Device.RuntimePlatform现在在WinRT和UWP上返回。
  • 行为变化:使用新的AutomationProperties可能会影响Android上的UI测试。 AutomationId、Name和HelpText都将设置本机ContentDescription属性,Name或HelpText优先于AutomationId(Name和HelpText将被级联)。 这意味着如果在该元素上也设置了Name或HelpText,那么查找AutomationId的任何测试都将失败。 要解决此问题,请在此方案中更改您的UI测试以查找Name/HelpText的值。
  • 行为变化:在WinRT/UWP上调用焦点选择器现在将打开下拉列表。
  • 弃用:Android IVisualElementRenderer.ViewGroup现已过时,请改用View。
未发布 Oracle正式发布Java 9,引入新的Java编程组件
by Harriet666 keys 分享 1506566182619
Java SE 9.0于2017年9月21日发布。JDK 9的核心变化就是引入了一种新的Java编程组件,也就是模块,按照Oracle的说法,它是一个可命名的、自描述的代码和数据集合。模块技术的核心目标是减少Java应用和Java核心运行时环境的大小与复杂性。为此,JDK本身进行了模块化,Oracle希望通过这种方式提升性能、安全性和可维护性。

为了支持Java 9的模块,引入一种新的模块化JAR文件形式,按照这种形式会在其根目录中包含一个module-info.class文件。Oracle同时提供了工具,允许我们组合和优化一组模块,形成自定义的运行时镜像(image),这样的镜像不必将整个Java运行时包含进来。模块化所带来的其他变化包括从Java运行时镜像中移除了rt.jar和tools.jar。
Java社区进程(JCP)执行委员会的成员Ben Evans认为最急需重构的应用恰好就是最适合进行模块化的应用。如果你已经备受Lava Flow/God Class/Stovepipe System地狱的折磨,而且你的利益相关方明确知道这一点,那么你可能更容易说服他们进行一次完整的底层重构,通过渐进式的努力形成一个完成的模块解决方案(而不是简单重构并迁移至Java 8)是值得去做的。

Oracle宣布Java 8会是一个长期支持的发布版本,会一直支持到2022年,因此Evans认为很多的应用将会停留在Java 8上,根本不会升级到Java 9。Evans补充说,有些应用可能会让开发和构建工具链使用Java 8版本,而在生产环境使用Java 9的运行时。
对特定类型的应用来说,这是很有帮助的。例如,我曾经见到有的电子商务网站具有非常大的堆空间,其中包含了大约40G的字符串数据。Java 9的ompact Strings技术能够将这种类型的内存使用减半。这反过来又会对GC的性能带来积极的影响。对于有些应用来说(这可能就包括大型的Solr安装环境及类似场景),单单这一项收益就值得将运行时升级到Java 9。

Java 9使用G1作为默认的垃圾收集器,替代了之前默认使用的Parallel GC。Evans对这项变化的评论:
这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能。


在很多(甚至可以说大多数)场景中,这种额外的性能损耗都不是什么问题。但是,在这方面,我确实也曾经见过从Parallel切换到G1时,有一定比例的工作负载会引起性能的下降。对于这些应用来说,这种性能下降是无法接受的,所以他们无法切换至G1收集器。随着G1成为默认的收集器,这将会影响到升级至Java 9的每个应用。

JClarity的CEO Martijn Verburg认为大型的代码库需要重构为模块的形式。Verburg给出了一些通用的模块化建议,并且指出了开发人员在采用Java 9模块系统时,需要注意的一些事情:
  • 阅读Paul和Sander的图书“Java 9 modularity”:它是本权威指南,提到了所有需要注意的地方,阐述了模块、包以及JAR之间如何运行的关联关系; 
  • 在模块边界的地方,使用定义良好的接口并且针对这些接口编程; 
  • 不要拆分包(split package),也就是说一个包不要分散到两个模块中。Adopt OpenJDK有个探测工具,我们可以用它来探测已有的代码; 
  • 确保不要存在循环依赖(Jigsaw不允许这样); 
  • 模块在源码的布局上与我们已习惯的方式有所不同,需要确保构建工具能够进行对应的处理; 
  • Jigsaw不支持多版本。
 
按照Verburg的说法,核心要点在于处理循环依赖、拆分包的问题,并确保针对接口进行编码。在尝试使用Jigsaw模块化重构之前,针对已有的代码库,这些工作需要预先完成。他还澄清了一个误解,那就是只有模块化的应用才能在Java 9上运行。

由于误解,在这方面有一种FUD(恐惧、不确定和怀疑)情绪,有人误认为在Java 9上运行的必须是模块化的应用。事实并非如此,我们可以将已有的基于类路径的应用直接在Java 9上运行。这里会有一些新的安全限制,因此我们需要设置一些特定的运行时标记(除非你重构代码,使用更安全的方式来访问Java的内部资源),即便如此,默认的行为也只是警告,而不是完全阻止我们(Java 10的限制会更严格)。

Verburg认为Jigsaw会是一个基石,会让Java的演进更快,这要归功于Mark Reinhold、Alan Bateman、Mandy Chung以及Jigsaw团队的其他成员多年来不知疲倦的工作,正是他们的努力使这一切得以实现。

Java 9还引入了jshell工具。这个命令行环境为Java平台带来了读入-求值-打印-循环(Read-Eval-Print-Loop,REPL)功能。它的目的在于以即时结果和反馈的形式,简化原型的实现并帮助我们探索语言在编码时的可选项。

Verburg和Evans看到Java 9中包含了jShell都非常兴奋,但令他们失望的是,HTTP/2只是作为Java 9的一个孵化模块(incubator module)提供的。鉴于社区对这项特性的兴趣和提供的帮助,Evans认为Oracle应该投入足够的工程资源,将HTTP/2交付为GA版本。

JDK 9完整的变更列表可以在Oracle的站点上查阅。Oracle宣布会按照每六个月一次的节奏进行发布,意味着Java 9是最后一次“keystone”特性驱动的版本发布,这反映出了Oracle目前管理Java的特点。Java下一阶段的演化将会按照更短的发布周期并且会按照更加面向特性的方式来发布。Java是否依然能够在服务端技术中占据领导者地位尚有待观察。
更多资讯点击查看>>>



未发布 微软C# 8.0中的四个特性
by Harriet666 keys 分享 1504687137082

可空的引用类型(Nullable Reference Types)

可空的引用类型可概括地表述为,引用类型将不再默认可空。因此,开发人员必须使用定义可空值类型的同样语法“Type?”,显式地标记一个引用类型为可空。

如果将一个空值赋值给一个非可空的引用类型,那么将会给出一个编译器警告。与之相类似,从可空类型中读取也会给出编译器警告,除非显式地提前检查了被质疑的变量是否为空值。因此从理论上讲,开发人员需要做的唯一更改就是在代码的适当位置标上问号。

该特性新加了一个语法。该语法针对开发人员明知一个可空变量x并非实际为空值却无法证明给编译器的情况。在上述情况下,开发人员现在可以定义x!.Method(),消除编译器对于潜在空值引用异常的警告。
 

异步流(Async Streams),即foreach async

异步流是IEumerable的异步等价类。C#团队自2015以来就一直在努力实现异步流。在经历了很多争议后,其语法被定为:
foreach await (string s in asyncStream)
开发人员将使用如下的函数签名定义一个异步迭代器:
async IAsyncEnumerable MethodName()
就像使用一个正常的IEnumerable方法一样,开发人员可以使用“yield return”以懒方式(Lazy)构建对象流。

相比于源自响应式扩展(Reactive Extensions)的IObservable,使用这一方法的优点在于让消费者控制流速,这被称为“Pull模式”。与之相对,IObservable是一种“Push模式”,这意味着生产者可以使用高于消费者所能处理的流速让流涌向消费者。
 

缺省接口实现(Default Interface Implementations)

缺省接口实现在本质上是一种有限形式的多重继承。它允许抽象接口像抽象类一样,对方法进行完全的定义,只是抽象接口依然不能定义构造函数和字段。

需注意,开发人员可以通过使用ConditionalWeakTable在接口上模拟字段。

默认接口实现的主要好处是,开发人员可以在不破坏向后兼容的条件下,将一个新方法添加到一个已有的接口中。但是这并非是有保证的,因为默认接口只是在可以设计出适合的默认方法时才能工作。
 

扩展(Extension)

开发人员可以编写扩展方法,但是不能扩展属性,这是长期以来对C#一直存在的一个问题。事实上,如果使用当前的模式,甚至是不能定义一个扩展属性或事件的。此外,在很多开发人员看来,在静态类中放置扩展方法是“很诡异的”。

新的设计中新给出了一种称为“扩展”(Extension)的顶层语言构件。例如,如果开发人员想要为自定义的Customer类创建一个扩展方法和属性,可编写如下代码:
extension CustomerExt extends Customer {
    //定义方法和属性的代码。
}
就接口而言,是不能在扩展中定义实例字段的,但是可以使用ConditionalWeakTable实现模拟。定义静态字段也是允许的。

除了对属性、事件和操作符重载的扩展,C#团队甚至考虑允许扩展构造函数。扩展构造函数非常适用于工厂模式(Factory)和对象池场景。

扩展接口(Extension Interfaces)C#团队还考虑了扩展接口,即在已有类中添加新接口的能力。但是扩展接口将不会成为C# 8中的特性,因为它需要更改底层的运行时。
未发布 NetSarang旗下网络通讯系列产品v5版本更新合集丨附下载
by Harriet666 keys 分享 1492158153782
NetSarang Computer公司在全球市场研发、开拓和支持安全连接方案。公司开发用于PC端的X server和PC-Unix PC-Linux SSH客户端软件,并扩展TCP/IP技术到其他互联网企业。公司产品遍及世界90多个国家。

Xmanager Enterprise

Xmanager Enterprise是完整的网络连接套件,它带有一个高性能PC X服务器,支持OpenGL(GLX)、3d硬件加速、安全终端模拟器、文件传输客户端和LPD打印机服务器。Xmanager Enterprise 4使3d X应用程序运行得更快,通过SSH和TELNET来提供安全的远程终端访问,通过SFTP/FTP进行方便的文件传输,使用LPD在本地打印远程文件等。
•更新详情:Xmanager Enterprise更新至v5.1179>>>
•点击下载:最新版Xmanager Enterprise>>>

Xmanager

Xmanager是市场领先的PC X服务器,它能够带来Windows平台下强力的虚拟应用技术。使用Xmanager,能够使安装在远程的基于UNIX系统的X应用程序与一般的Windows应用程序完全一样。它提供了一个强大的会话管理控制台、易于使用的X应用程序启动器、X服务器概要文件管理工具、SSH模块和用于安全访问的远程高性能PC X服务器及虚拟化的UNIX/Linux环境。
•更新详情:Xmanager更新至v5.0992>>>
•点击下载:最新版Xmanager>>>

Xshell

Xshell是一个功能强大的终端模拟器,支持SSH、SFTP、TELNET、RLOGIN和SERIAL。它提供业界领先无法替代的性能和特性集。它有许多对企业用户有用的特性,包括:分页式环境、动态端口转发、自定义键映射、用户定义按钮、VB脚本以及显示2字节字符和支持国际语言的UNICODE终端。
•更新详情:Xshell更新至v5.1199>>>
•点击下载:最新版Xshell>>>

Xftp

Xftp是一个灵活和轻量级的SFTP / FTP客户端,它主要用于为用户提供通过网络安全的传输文件。它提供了许多强大的功能,比如直接编辑、多窗格、文件夹同步、支持FXP、服务器之间传输以及集成第三方编辑器。在处理远程文件方面Xftp将为你节省时间和精力。 对于家庭和学校的用户来说,Xftp是免费的。具体情况可参阅家庭和学校用户免费使用许可协议条款和条件。
•更新详情:Xftp更新至v5.1165>>>
•点击下载:最新版Xftp>>>

Xlpd

Xlpd是一个用于Windows系统的简单的行式打印机后台程序(LDP)和打印作业管理工具。它通过LPD协议从远程服务器接收打印任务并把该打印任务发送至本地打印机。LPD是一个支持多种操作系统的标准的打印协议,支持包括UNIX、Solaris和Linux等系统。
•更新详情:Xlpd更新至v5.1167>>>
•点击下载:最新版Xlpd>>>

 试用、下载、了解更多产品信息请点击"咨询在线客服"   

未发布 今年最新的30个Android库,你了解吗?
by Harriet666 keys 分享 1508476743851


Android开发技术越来越成熟,Android开发工具当然也层出叠现。本文就向大家介绍今年最新的深受开发者喜爱的30个Android库。希望对你的Android开发工作能起到助力。

1.MaterialStepperView

它是用Material Design实现Steppers的。
 
目前,Stepper只有垂直视图,但将来会有更多的风格。你可以尝试一下,如下图:
你可以自定义normal/active两个状态的颜色,完成图标,开启动画并设置动画时长。可通过Github上的设置项和样式查阅所有设置项。该库支持API 17+,详情请查阅wiki文档。
 

2. MultiSnapRecyclerView

这是分屏滚动的Android库。
MultiSnapRecyclerView为RecyclerView提供了分屏功能。
 
目前提供的功能有:
  • start, end和center三个位置的吸附, 
  • snap count 指定要分屏的数量, 
  • 支持水平和垂直分屏, 
  • 滚动时的回调。 


3. Garland View for Android

该库可实现如下的布局:
 
GarlandView 外部是一个水平滚动的视图,视图内的每一个子视图可垂直滚动。
你可以在README中找到其他重要信息。还有一个示例App。该库支持API 19及更高版本。


4. VegaLayoutManager

这是一个自定义的布局管理器——滚动时缩小并淡出头部。这是受到Dribble项目的启发。
 

5. ExpandableLayout

这个库的名字不言而喻,它是一个基于LinearLayout的可扩展的布局。
README里含有你启动时需要的所有信息,另外,还有一个示例App可以帮助你快速跳转到代码中。


6. SwipeBackLayout

SwipeBackLayout允许你使用手势返回上一个界面。
你可以设置滑动方向,如从左到右、从右到左、从顶部到底部、从底部到顶部。
你还可以设置是否只能从边缘滑动。

SwipeBackLayout只能包含一个子布局,例如:
  • LinearLayout,RelativeLayout,FrameLayout,TableLayout等。
  • ScrollView,HorizontalScrollView,NestedScrollView等。
  • RecyclerView,AbsListView(ListView)等子类。
  • ViewPager,WebView等。
该项目里面有一个详细说明的文档、示例APP和一个APK。


7. SmartCropper

这是一个可以智能剪裁图像的库,可以识别边框并修正裁剪后的图像,适用于身份证、名片、文件等其他图片文件的裁剪。

 
特征:
  • 以智能的方式裁剪图片,还可以识别边框;
  • 支持拖动、放大效果以提升定位体验;
  • 使用透视变换裁剪,可以修正先前裁剪的图片;
  • 支持多种UI设置,如辅助线、蒙版、设置锚点、放大等效果。
目前,此库采用优化点算法,CropImageView具有选择放大效果,而且它可以使用CropImageView XML来进行设置。


8. Date Range Picker

Date Range Picker是具有改进UI的自定义日期范围选择器。

项目的简介写得很好,易于理解。


9. StoriesProgressView

我们都知道Facebook和Instagram展现在他们App上的Stories ,这是介绍StoriesProgressView的一个库,它可以扩展LinearLayout和允许你添加以下视图。
 
该项目包含一个简短但详细的README以及示例App。


10. CosmoCalendar

这是一个可以自定义日历的库,它可以提供很多功能和UI设置,例如:
  • 改变日历方向;
  • 自定义文本颜色;
  • 设置类型和颜色;
  • 定义导航按钮等;
  • 还有很多其他功能;

 

11. Reflow Text Animator

相信大家都听过Plaid app,这是由Shazam工程团队开发的。
它是Plaid’s ReflowText的端口,无论它们的大小或风格怎样,都可以轻松地在同级的TextView之间进行转换。
这个库很容易使用,快去试试吧!
 

12. AdaptiveIconPlayground

这不是一个库,而是由Nick Butcher开发的用于试验自适应图标的AndroidApp。根据README:
此应用程序可以从已安装的App中查找支持自适应图标的App,并将其显示在网格中,然后你可以切换不同的蒙版形状以匹配不同设备的显示效果。
目前提供两种视觉效果:
  • 滚动效果;
  • 触摸时的尺寸缩放视差效果;
 

13.Tivi

Tivi是跟踪电视节目的App,它与Track.tv相连接,它的开发者是Chris Banes,虽然这项开发工作仍在进行中,但它使用的都是最前沿的组件、库和工具,其中包括Kotlin、RxJava 2、所有架构组件(Room,LiveData和Lifecycle-components)。


14.RxIdler

这是Espresso的IdlingResource
它的开发者是 Square Engineering
它支持RxJava 1 和 RxJava 2,祝你用得愉快!


15.MRichEditor

这是一个丰富的文本编辑器(基于summernote)。
它支持多种功能,包括粗体、斜体、下划线、快捷键、标题(包括六级标题)、段落、引用,有(无)序列表、代码、水平规则、链接、图像,对齐方式(居中、两端对齐、左对齐、右对齐)、下标、上标、字体名称和大小、缩进、减少缩进、撤消/还原。

在这种情况下,你需要仔细观察示例App,因为它几乎没有文档供你参考。


16.Android Clean Architecture Boilerplate

Buffer团队和Joe Birch开发的示例App展示了一种Android应用程序的干净架构。
创建此样板的原因:
实验模块化;
分享一些干净架构实现方式;
一开始采用干净架构能应对未来复杂的项目需求。
该项目的UI和单元测试都是用Kotlin编写。
它的文档里有详尽的介绍,非常适合想学习的开发者,力荐!


17.RxJava2Debug

使用过RxJava会发现有时很难读取异常,很难在Rx流中定位到问题。这就是为什么这个库被创建的原因。你可以在README中阅读更多关于的内容。
这个库的功能有:
  • 生成堆栈轨迹
  • 过滤堆栈轨迹


18. Resizer

Resizer是一个轻量级的,而且易于使用的Android库,用于图像缩放。它允许你将图像文件放大或缩小的同时,保持宽高比。
这个项目的灵感来自于Compressor。
说明书:
Minimum SDK: API 21
默认设置:
  • targetLength: 1080
  • quality: 80
  • outputFormat: JPEG
  • outputDirPath: the external files directory of your app
支持的输入格式:
  • BMP
  • GIF
  • JPEG
  • PNG
  • WEBP
支持的输出格式
  • JPEG
  • PNG
  • WEBP
支持的图像质量范围:0~100
  • 值越大,图像质量越好同时图片越大
  • PNG,无损格式,会忽略该设置


19.FaceDetector

该库允许你在相机里预览图片时,实时检测人脸。它与Fotoapparat库非常相似,但它也支持其他相机库和源。
它的使用过程十分简单,而且项目记录相当详细。
 

20.RxGps

它的开发者是Florent Champigny,它很容易找到我们各自的定位。
它兼容RxJava2,它还自动申请GPS的运行权限,并查看当下的服务是否适合您。


21. MapMe

MapMe是一个搭配地图功能使用的Android库。
MapMe将适配器模式带到Maps,简化了标记和注释的管理。
MapMe与Google Maps和Mapbox配合使用,README 里的内容很详细,而且它是用Kotlin编写的。


22. RevelyGradient

该库用于颜色渐变管理。
您可以用Java或Kotlin编写它,项目附带的说明文档很简短,但足够你能够使用它。


23. LiteUtilities

这是一个用Kotlin编写的库,它有助于从代码中消除样板。目前它的功能有:
  • RecyclerUtils—— 省去设置适配器的麻烦,现在只需4行代码就可以设置好适配器。
  • ScrollUtils—— 使用RecyclerView或NestedScrollView时,可以以轻松隐藏/滚动显示FloateActionButton。
  • ToastUtils—— 用于创建toasts。
  • SPUtils—— 用于共享选项的简单DSL。
  • ValidatorUtils—— 可以快速而轻易地进行文本检验。
  • LogUtils—— 简单易用的Android日志记录。


24.KOIN

KOIN是一个使用Kotlin来编写的依赖注入框架,它的功能是能够推动做事的进度。
据作者介绍,它
  • 没有代理/ CGLib
  • 没有代码生成
  • 没有内省
它的说明文档写得很棒,有示例和wiki,还有联系方式。


25.koptional

是那些总试图让自己的安全系统更加顺畅的Kotlin极简主义者的理想选择。
作者给出的理由是:
由于具有空值安全特性,Kotlin不需要可选值类型。但是有 RxJava2 这样的 APIs 和库不接受空值导致 Kotlin 仍然需要支持可选值类型。
大多数情况下可以使用sealed class来表示空值,然而像向 Rx 流传递String?这种情况,可选值类型是更好的选择。


26. Parallax

这是一个模拟Apple TV 视差图标的库。
它的README写得非常好,值得一试。


27.droid-vizu

Droid-vizu旨在通过轻松交换渲染器来获得酷炫效果,从而提供定制的可视化效果.
 

28.Drone

这不是Android库,而是由CésarFerreira提供的库的管理者。它是由于对java社区的嫉妒,因为他们的快速可靠的依赖管理器。因此,您只需执行以下操作:谷歌搜索一个库,检查,阅读文档等。
drone add creator/library module
例如:
drone add jakewharton/butterknife
 

29.From-design-to-Android-part2

这是一个涵盖在Android上创建整洁UI的项目。这一次,SaúlMolinero涵盖:
  • 使Alex Lockwood的ShapeShifter工具
  • AndroidVectorDrawables
  • ScaleDrawables
  • 自适应图标等。
 

30.Reagent

Reagent是Jake Wharton总结的未来响应式库的体验。
未发布 5个优秀编码挑战帮你训练大脑,你敢尝试吗?
by Harriet666 keys 分享 1488424036542

每个人都知道编程正在成为几乎每个行业的重要组成部分,它对组织的帮助和对大型系统的维护是独一无二的,因此越来越多的人开始了他们的编程旅程。你可以从你觉得合适和方便的任何交互式平台和书籍中学习编程。但是这还不够,我们应该练习更多新的东西。

编码与你的创造力、创新能力密切相关。但很多时候,我们花费大量时间来处理常见问题而忘记了创造力。我不太确定这是否是编码挑战出现的原因,但它们肯定可以帮助你去思考。

我们可以说编程挑战是伟大的:

  • 学习新的做事方式

  • 练习一种新的编程语言

  • 解决遇到的关键问题

  • 保持我们的大脑活跃和集中力

  • 以及玩得开心!

在寻找最好的编程挑战过程中筛选了五个非常好的资源。相信这对你的编程旅途有所帮助,并探索更大的计算机科学领域。

点击查看5个编程挑战具体内容>>>

未发布 视频处理软件BB FlashBack v5.25.0发布丨附下载
by Harriet666 keys 分享 1497515629872
BB FlashBack是一种屏幕记录器,能快速容易地创建视频。有详尽的软件阐述、屏幕演示、介绍、指南以及练习。目前BB FlashBack在线订购享75折优惠活动正在进行中,欢迎您下载、购买进行运用!
 
【BB FlashBack v5.25最新版下载>>>】

v5.25.0更新内容:

  • 改进网络摄像头捕获代码(现在使用MSMF)
  • 许可证现在只有在FlashBack的多个实例运行时才下载一次
  • 播放器仅适用于具有8GB和更高RAM的电脑
  • 增加了用于音量控制的工具提示
  • 添加了关闭/开启播放器预加载预览录像的选项
  • 修复:Flashback连接上传表单 - 视频名称可能会重叠“复制”和“打开”链接
  • 修复:如果网络摄像头未正确初始化,录制可能会停止
  • 修复:无法选择包含日语字符的声源名称进行录制
  • 修复:MPEG录制模式质量等级设置未保存
  • 修复:FBAPI的帮助文本出现错误,它仅适用于TestAssistant
  • 修复:在Win 32 SaveAs函数中添加了解决异常的方法
  • 修复:当没有音频录音源时,可能会显示不正确的音频格式

试用、下载、了解更多产品信息请点击"咨询在线客服"   


 近期热门 - 点击最多
  1. Node.js 打印vite react+go项目目录树
  2. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  3. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  4. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  5. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  6. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  7. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  8. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  9. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法
  10. Springboot+Gradle+Mysql+Jpa最简单实例教程

  全端社区 - 最新回复
  1. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  2. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  3. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  4. Node.js 打印vite react+go项目目录树
  5. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  6. Windows与Mac通过git ssh和rsync实现文件共享互传
  7. Windows与Mac通过git ssh和scp实现文件共享互传
  8. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  9. 使用PubSub-JS时ReactNative在后台运行一段时间唤醒后,组件无法scribe到publish的事件,typescript实现一个事件订阅发布组件
  10. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA