electron app开发遇到的问题总结

最近用electron开发一个远程桌面的跨平台app,其中windows远程使用自带的rdp,其他系统使用freeRDP。该APP中用到大量的原生模块,也就是跟OS相关的模块,比如drivelist,是一个读取硬盘信息的包,usb-detection是一个探测是否有USB插入的包,集成这些包最大的问题是,跟自己使用Electron的Node引擎有关,一般来说需要重新编译,才可以使用。这个错误的典型特征是,控制台报错,不断地Try模板编译后的路径,然后告诉你找不到那个模块。

»阅读全文

Tags: electron

PHP升级及Laravel部署

CentOS的版本太低,6.5。自带的php版本也太低,laravel的最低要求是6.7,需要升级php。在centos中直接使用: yum update php,会提示已经是最新的了,是因为rpm的原因,当前仓储已不再更新php,php5.3已经是最高版本,可以通过更改rpm的方式获得更新:

»阅读全文

Tags: laravel,php

浅谈分布式事务

事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉。就要么生,要么死。没有半死不死的中间不可预期状态。
分布式事务,常见的两个处理办法就是两段式提交(2PC)和补偿。
两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了。

补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状态到某个结束状态(一般是失败状态),然后就世界太平了。典型的就是冲正操作。

»阅读全文

Sybase IQ direct IO 问题导致无法启动解决办法

症状:

I. 06/23 10:28:33. SAP IQ

I. 06/23 10:28:33. Version 16.0

I. 06/23 10:28:33. (64bit mode)

I. 06/23 10:28:33. Copyright 1992-2014 by SAP AG or an SAP affiliate company. All rights reserved

I. 06/23 10:28:33. Copyright (c) 2014 SAP AG or an SAP affiliate company.

I. 06/23 10:28:33. All rights reserved.

I. 06/23 10:28:33. Use of this software is governed by the Sybase License Agreement.

I. 06/23 10:28:33. Refer to http://www.sybase.com/softwarelicenses.

I. 06/23 10:28:33. 

»阅读全文

Tags: sybase IQ

ABP的语言及使用signalr

折磨人的跨域问题:

XMLHttpRequest cannot load https://api.taskexe.com/signalr/negotiate?clientProtocol=1.5&token=0J2rv2jZ…bpcommonhub"},{"name":"messagehub"}]&_=1488597450711. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'https://taskexe.com' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

意思大约是说,如果Cors使用通配符*则不允许使用 Access-Control-Allow-Credentials: true,两者是矛盾的。在signalr的跨域请求时,application_start中使用了,跨域:

»阅读全文

Tags: cors,abp,signalr

CI文件上传不成功可能的原因

CI文件上传总是出现很其他问题,但大部分都是php配置问题,CI本身的问题不大,所以CI总是背锅。php.ini的配置:

1. 启用上传

file_uploads = On

2. 设置上传文件大小限制

upload_max_filesize = 50M

»阅读全文

angular: controller As 与 $scope

简单地说,如果设置了{controllerAs:main}, 则 $scope['main'] =  new MainController(); 意即别名会则为控制器$scope的一个属性存在。具体可参照:

http://codetunnel.io/angularjs-controller-as-or-scope/

——————

在视图中具名的form是一个默认的FormController,由angular生成并设定。在form的父控制器中可以访问到这个form控制器的一些属性,如: $scope.myFormName.myFieldName.$valid 等。具体参见angular手册:

https://docs.angularjs.org/api/ng/directive/form

延迟绑定,即在修改一个字段时(onchange事件)不想立刻将修改的字段反映到其他视图中时,可以在 字段加入绑定选项: <input ng-model="myModel" ng-model-options="{updateOn: 'submit'}" />,因为默认是在失去焦点后就修改视图,可以改成在提交表单后才修改视图。在提交表单时,需要注意提交model的更新:

 scope.myForm.$commitViewValue();
// scope.myForm.myField.$commitViewValue();

参考链接如下:

https://code.angularjs.org/1.4.10/docs/api/ng/directive/ngModelOptions

Bootstrap:弹性搜索框

<form action="" method="get" class="form-horizontal">
        <div class="input-group search-input-group">
           <input type="hidden" name="scope" value="1">
             <input name="key" autocomplete="off" type="text" class="form-control" placeholder="输入要搜索的内容关键字" >
              <span class="input-group-addon">
                        <button type="submit">
                            <span class="glyphicon glyphicon-search"></span>
                        </button>  
                    </span>
        </div>
      </form>

 

对应的CSS:

.search-input-group .input-group-addon{
    background: white !important; 
}
.search-input-group .form-control{
    border-right:0; 
    box-shadow:0 0 0; 
    border-color:#ccc;
}
.search-input-group{
    width: 40%;
}
.search-input-group button{
    border:0;
    background:transparent;
}
.search-input-group input:focus + button{
    z-index:3;
}
.search-input-group input{
    -webkit-transition: width  0.2s ease-in-out;
    -moz-transition:width  0.2s ease-in-out;
    -o-transition: width  0.2s ease-in-out;
    transition: width  0.2s ease-in-out;
}
.search-input-group input:focus{
    width: 500px;
}

若想把搜索图标放到输入框的前面,bootstrap其实是不支持的,需要自己定制一下。可以试试以下链接:

http://bootsnipp.com/snippets/featured/support-glyph-and-fa-icon-inside-input

最近遇到的一些坑集合

Angular

异步获取到的数据,在视图上使用自定义filter时,控制台总是报错 input undefined ,这是因为filter会在anagular的第一次消息循环时尝试运行,异步数据尚未加载进来,尝试绑定时数据固然不存在。所以要做判断。

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider{ 
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
   //....

}
}

CORS

基于web api的应用常常使用基于token的验证方式进行api的访问管理。一般步骤是:

(1)用户输入用户名和密码,提交到web api host.

(2)web api host验证后,返回token给Client, Client使用Cookie存储下来。

(3)后续Client继续是用token访问web api, web api做验证。

这个方法比较简单可行, 资源服务器和验证服务器部署在一个进程里。但是最大的问题是,token过期后如何刷新的问题。简单的方法是把token的过期时间设置的比较长,如一个 月,但不够安全,不符合token的设置本意,所以需要用refresh token的验证机制。简单地说就是,web api host验证后返回两个token,一个是基本的access token,另一个是refresh token。access token过期后,可以用refresh token换取一个新的access token。这里遇到一个cors的问题。即使在web api 的config里加了如下语句:

public static void EnableCors(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
        }

也不行,原因是oauth server的获取access token,不直接经过web api。所以要对oauth server的响应头添加allow-origin。具体如下:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            context.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
           //....
       }
}

但是,依然有问题。因为浏览器会发出预检请求(preflight ),api host不能正确应答,以前的cors配置风格不支持预检请求,故需要:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
   }
}

问题即可解决。参考地址:

http://stackoverflow.com/questions/24989769/cors-is-not-working-in-web-api-with-owin-authentication

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

Entity Framework 的一次迁移记录

Migration已经变成通用的做法,laravel框架也有这个东西。今天我对已经存在的网站增加了一些model,但是以前也没怎么用Migration。使用时遇到一些问题,记录一下。

1. 对于已经存在的数据库,如有_MigrationHistory表,先将它删掉。

2. 在VS里执行第一个迁移命令: Enable-Migrations -Force  将生成Migration文件夹和一个Migration类。

3. 执行Add-Migration InitialCreate –IgnoreChanges  产生一个空基架,其中-IgnorceChanges是关键。

»阅读全文