JSVGCanvas使用demo

package my;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.JSVGScrollPane;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;

public class SVGApplication {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        JFrame f = new JFrame("Batik");
        SVGApplication app = new SVGApplication(f);
        f.getContentPane().add(app.createComponents());

        //f.addWindowListener((e)->System.exit(0));

        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setSize(800, 1000);
        f.setVisible(true);
    }

    JFrame frame;
    JButton button = new JButton("Load...");
    JLabel label = new JLabel();
    JSVGCanvas svgCanvas = new JSVGCanvas();

    public SVGApplication(JFrame f) {
        frame = f;
    }

    public JComponent createComponents() {
        final JPanel panel = new JPanel(new BorderLayout());

        JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
        p.add(button);
        p.add(label);

        JSVGScrollPane jSVGScrollPane = new JSVGScrollPane(svgCanvas);
        jSVGScrollPane.setScrollbarsAlwaysVisible(true);

        panel.add("North", p);
        panel.add("Center",jSVGScrollPane);
        //panel.add("Center", svgCanvas);

        // Set the button action.
        button.addActionListener((e) ->{
            JFileChooser fc = new JFileChooser(".");
            int choice = fc.showOpenDialog(panel);
            if (choice == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                try {
                    svgCanvas.setURI(f.toURL().toString());
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });


        // Set the JSVGCanvas listeners.
        svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
            public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
                label.setText("Document Loading...");
            }
            public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
                label.setText("Document Loaded.");
            }
        });

        svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
            public void gvtBuildStarted(GVTTreeBuilderEvent e) {
                label.setText("Build Started...");
            }
            public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
                label.setText("Build Done.");
                frame.pack();
            }
        });

        svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
            public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
                label.setText("Rendering Started...");
            }
            public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
                label.setText("");
            }
        });

        return panel;
    }
}

 

国内外saas经验分享

1、哪个生命周期

business model,产品和客户、重复销售模式和增长、规模化。第一个和第二个阶段时间的不确定性。
最后踩油门,不要让别人追上

2、可重复的销售,续费

3、3个月前融资

4、产品、可预测可重复可规模化、有利润(LTV>3X CAC)18个月可以回收获客成本

5、数据化变成硬指标,电子签名达成合约数的数量

6、小公司死亡率20%

7、模型
产品复杂度
市场复杂度
免费+增值服务/自助式购买/轻量级销售/重量型销售/外勤销售/外勤+工程师
产品及市场驱动/销售驱动

市场复杂度和产品复杂度不一定相关

销售机器

8、微信和钉钉,销售模式。

9、客户为中心,设计销售流程

10、客户画像,客户角色,到底谁是你的买家

11、ROI,以客户为中心,客户担心什么,帮助用户决策

12、mini wow! full wow!
salsify的demo。电商解决方案,路径冗长

13、churn
客户流失率,drill down到最细的部分

14、NPS 客户满意度

15、North star 北极星,衡量带给客户的价值

16、工程-次;商业化型-按月

17、定价不能太低,每年都要提高价格,提供更多的功能。

JFrame用法

package com.alibaba.tbbpm.idea.test;

import java.awt.*;

import javax.swing.*;

/**
 * Created by jianghuiwen on 2018/4/10.
 */
public class FrameTest extends JFrame {

    private JLabel labelUsername = new JLabel("Enter username: ");
    private JLabel labelPassword = new JLabel("Enter password: ");
    private JTextField textUsername = new JTextField(20);
    private JPasswordField fieldPassword = new JPasswordField(20);
    private JButton buttonLogin = new JButton("Login");

    public FrameTest() {
        super("JPanel Demo Program");

        // create a new panel with GridBagLayout manager
        JPanel newPanel = new JPanel(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.anchor = GridBagConstraints.WEST;
        constraints.insets = new Insets(10, 10, 10, 10);

        // add components to the panel
        constraints.gridx = 0;
        constraints.gridy = 0;
        newPanel.add(labelUsername, constraints);

        constraints.gridx = 1;
        newPanel.add(textUsername, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        newPanel.add(labelPassword, constraints);

        constraints.gridx = 1;
        newPanel.add(fieldPassword, constraints);

        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 2;
        constraints.anchor = GridBagConstraints.CENTER;
        newPanel.add(buttonLogin, constraints);

        // set border for the panel
        newPanel.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createEtchedBorder(), "Login Panel"));

        // add the panel to this frame
        add(newPanel);

        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        // set look and feel to the system look and feel
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new FrameTest().setVisible(true);
            }
        });
    }
}

 

效果

错过了和马云一起创立淘宝?钉钉还有机会

阿里巴巴钉钉事业部校招/实习内推招聘

钉钉的愿景
我们希望通过钉钉这个平台,让全球所有企业都享受到软硬件一体的智能移动办公解决方案。

钉钉开放平台:
在企业客户的视角,钉钉开放平台这个部门的基础责任,是在通用的基础办公之外,为每个企业客户再造一套丰富的个性化的管理和运营线上系统环境。我们自身的视角,开放平台负责把钉钉的客户与服务提供商连接接起来。个性化的服务实际上要依托合作伙伴提供。当钉钉开放平台成功地把企业客户和合作伙伴连接起来时,我们要为伙伴做些事情。通过对合作伙伴服务系统的安全管控、稳定性赋能,来保护企业客户在服务使用三方(合作伙伴)服务时的核心利益。我们为合作伙伴提供了端的混合开发模式,比如H5、weex, 对标微信的小程序开发体系、开发工具、丰富的视觉组件。我们也为合作伙伴准备了开发文档和交易模式,以便更多的开发者加入进来,丰富生态。

岗位描述:
如果你想了解JAVA开发在阿里巴巴互联网生态系统中无与伦比的应用广度与深度; 如果你对基础技术感兴趣,你可以参与基础软件的设计、开发和维护,如分布式文件系统、缓存系统、Key/Value存储系统、数据库、Linux操作系统和Java优化等; 如果你热衷于高性能分布式技术,你可以参与高性能分布式服务端程序的系统设计,为阿里巴巴的产品提供强有力的后台支持,在海量的网络访问和数据处理中,设计并设施最强大的解决方案; 如果你喜欢研究搜索技术,你可以参与搜索引擎各个功能模块的设计和实现,构建高可靠性、高可用性、高可扩展性的体系结构,满足日趋复杂的业务需求; 如果你对电子商务产品技术感兴趣,你可以参与产品的开发和维护,完成从需求到设计、开发和上线等整个项目周期内的工作; 如果你对数据敏感,你可以参与海量数据处理和开发,通过sql、pl/sql、java进行etl程序开发,满足商业上对数据的开发需求; 如果你热衷于客户端开发,你可以参与为用户提供丰富而有价值的桌面或无线软件产品。

岗位要求:
或许,你来自计算机专业,机械专业,甚至可能是学生物的; 但是,你酷爱着计算机以及互联网技术,热衷于解决挑战性的问题,追求极致的用户体验; 或许,你痴迷于数据结构和算法,热衷于ACM,常常为看到“accept”而兴奋的手足舞蹈; 或许,你熟悉Unix/Linux/Win32环境下编程,并有相关开发经验,熟练使用调试工具,并熟悉Perl,Python,shell等脚本语言; 或许,你熟悉网络编程和多线程编程,对TCP/IP,HTTP等网络协议有很深的理解,并了解XML和HTML语言; 或许,你热衷于数据库技术,能够熟练编写SQL脚本,有MySql或Oracle应用开发经验; 或许,你并不熟悉Java编程语言,更精通C,C++,PHP,.NET等编程语言中的一种或几种,但你有良好和快速的学习能力; 有可能,你参加过大学生数学建模竞赛,“挑战杯”,机器人足球比赛等; 也有可能,你在学校的时候作为骨干参与学生网站的建设和开发; 这些,都是我们想要的。来吧,加入我们!

感兴趣的将简历戳至rio.jhw@alibaba-inc.com

或者加我微信了解详情

设计模式

1、Decorator pattern

装饰模式,主要用于将对目标对象进行重新适配,以修改目标对象的方法。

The Decorator pattern is a more flexible alternative to subclassing. The Decorator class
implements the same interface as the target and uses aggregation to "decorate" calls to the
target. Using the Decorator pattern it is possible to change the behavior of the class during
runtime.