2016年7月28日星期四

本地化Twitter图片

Twitter存档使Twitter重度用户备份资料成了可能,可是使用过存档的人会发现,所有图片还是留在服务器上的,无法放到本地保存。
虽然Twitter还是让人放心的,可是对于一些联网不正常的环境来说,本地化还是非常重要的。
Twitter为了节省宽带的需要,不会为你这样做的。
所以我来做这件事啊。其实很简单,就是把下载下来的文件里的图片地址全部下载到本地,再修改本地文件的URL。
因为使用了LinQ,所以使用了.NET 4.0,我想一般电脑支持吧。
执行文件TwitterPicLocal.exe要放在存档文件的\data\js\tweets位置。
因为生成类型选择了执行程序所以执行后不会看到窗口,但是如果你要使用的话可以放心使用,我不会私自做对你电脑有害的操作,实在不放心请重新生成后使用。


直接放代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections;

namespace TwitterPicLocal
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                DirectoryInfo TheFolder = new DirectoryInfo(".");
                foreach (FileInfo file in TheFolder.GetFiles())
                {
                    if (file.Extension == ".js")
                    {
                        Write(file.Name);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error:"+e.Message);
            }
            Console.ReadKey();
         
        }
        public static string DownLoadPics(string picUrl,string path) {
            Directory.CreateDirectory(path.Split('.')[0]);
            string filepath = path.Split('.')[0] + @"\/" + Guid.NewGuid() + ".jpg";
            WebClient mywebclient = new WebClient();
            mywebclient.DownloadFile(picUrl.Replace("\\", ""), filepath);
            return @"data\/js\/tweets\/" + filepath;
        }
        public static void Write(string file)
        {
            string fileContents = System.IO.File.ReadAllText(file);
            string Pattern = "https?:.*twimg.*[bmp|jpg|iff|gif|pcx|tga|exif|fpx|svg|psd|cdr|pcd|dxf|ufo|eps|ai|raw|jpeg|png]";
            MatchCollection Matches = Regex.Matches(fileContents, Pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
            Hashtable hash = new Hashtable();

            foreach (Match mt in Matches)
            {
                string foundMatch = mt.ToString();
                if (hash.Contains(foundMatch) == false)
                    hash.Add(foundMatch, string.Empty);
            }

            foreach (DictionaryEntry element in hash)
            {
                fileContents = fileContents.Replace(element.Key.ToString(), DownLoadPics(element.Key.ToString(), file));
                Console.WriteLine("Find Image:"+element.Key.ToString());
            }
            FileStream fs = new FileStream(file, FileMode.Create);
            fs.Write(System.Text.Encoding.Default.GetBytes(fileContents), 0, fileContents.Length);
            Console.WriteLine("OverWrite File:"+file);
            fs.Flush();
            fs.Close();
        }
    }
}
Dropbox

2016年7月27日星期三

infopath连续修改16次的限制

无论是后台代码还是rules的操作,更改表单字段的值的上限是16次。超过之后就会报错:
An error occurred in the form's code. The number of calls to the Changed event for a single update in the data exceeded the maximum limit.

我找了好久,包括infopath设置中心和注册表。都无法改变这个上限。可是我需要的要三倍于这个值。
然后最终的解决的方案是做一个按钮,每次只触发16次,如果需要再点击。


2016年3月30日星期三

infopath通过webservice动态获取数据并为表单控件赋值

1、创建webservice.



2、新建数据源。
3、配置控件的Role.

设置数据源,链接数据源,使用数据源
原文地址:MSDN


2016年3月28日星期一

infopath实现连级下拉框

1、设置次一级dropdownlist的数据源:
http://Sites/sites/Site/_vti_bin/owssvr.dll?Cmd=Display&List={98CBA8DC-CDD9-4B13-833D-16CCD2E8AD24}&XMLDATA=TRUE
2、添加Product的change事件:
public void field1_Changed(object sender, XmlEventArgs e)
        {
            // Write your code here to change the main data source.
            FileQueryConnection q = (FileQueryConnection)this.DataConnections["owssvr"];
            MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:field2", NamespaceManager).SetValue("");
            q.FileLocation = "http://Sites/sites/Site/_vti_bin/owssvr.dll?Cmd=Display&List={98CBA8DC-CDD9-4B13-833D-16CCD2E8AD24}&XMLDATA=TRUE&FilterField1=Title&FilterValue1=" + e.NewValue;
            q.Execute();
        }
3、注意事项:
设置work type的数据源时不要选择在模板打开时自动收取数据
如何获得list的GUID:
设置页面的地址栏就能看到,但是需要转换编码:http://www.ifreesite.com/urldecoderencoder.htm
下载:Dropbox

2016年3月21日星期一

网页方式浏览Docear导图系统

Docear官方的很多功能都已经关闭,包括登录,上传,注册等等。。我相信作者应该在积极维护,但是看似一个可以分享导图的社区是不会短时间形成的。
docear官方的导图文件网页发布方式是java显示,为此用户必须首先更新最新java,然后只能使用IE查看,并且速度很慢。为此,我极其失望,曾经按官方方法搭建过,但是随后马上将其下线了。
此刻要推荐的方案是使用flash显示导图,当然了,flash也是使用docear导出导图时发现的。当时发现这个flash的时候极其兴奋,随后也验证了这种方案的可行性。
系统如图:



源代码:Dropbox
在做这个系统的时候,主要经历的坑是:
1.js更改embed的值的时候不成功,发现需要使用e.preventDefault();2.后台代码的书写,过滤掉非.mm文件,排除各种出错的情况,排除我自己建的.files.image等目录。

2016年3月16日星期三

infopath实现某列只能在第一次填写,此后只读

在一个表单库中有一些字段是需要唯一的,比如每个人只填写自己的表单,确定后不允许修改,哪怕重新打开也已经不能修改。这样的情况在企业环境中经常遇到,而使用的技术其实非常简单就是设置字段的Conditional formatting.
如图:
当然了,不同的控件需要设置不同的属性,disable or read-only,具体请看下图:
官方文档地址:Office Official
顺便学了个快捷键:Ctrl+Shift+b预览模板


2016年3月14日星期一

C#代码更新infopath Repeating Tables信息

Repeating Table在infopath中使用较为普遍,尤其是处理一些复杂的业务逻辑时经常表现一对多的业务需求。
但是当数据量巨大是,一条一条新增item变得不那么人性化,所以今天的选择就是使用C#代码动态的将规则的信息字符串加进repeat table 中。
其实本质上还是处理xml文件。
需要注意的是:如果单添加change事件,change后页面是没有反应的,因为没有postback,懂ASP.net的都明白。开始发了一下愁,后来发现其实infopath已经考虑了,只需要在控件的属性》Browser Forms改为always。
代码:
效果图:


源代码:Dropbox


2016年3月12日星期六

LigerUI实现左右结构layout

Demo背景:需要一个简单的左右结构框架。
使用框架:LigerUI。

源代码:Dropbox

根据服务器目录结构生成文件树

需求:因为要share server的some files,所以need 动态的生成file tree.

方案分析:当然要使用服务器端语言动态生成DOM结构,然后在前端用组件对其美化。语言可以是PHP,ASP.Net,Node.js。美化使用jQuery Treeview组件。

具体代码
服务器端:
 JS代码:
 效果图:

源代码文件:DropBox