QT读取JSON

void MainWindow::readJson(QString fileName)
{
    QString szContent = NMyUtils::readFile(NMyUtils::getFileFullPath(fileName));

    QJsonDocument jDoc = QJsonDocument::fromJson(szContent.toUtf8());
    QJsonObject jObj = jDoc.object();
    QJsonArray jReminderItems = jObj.value(QString("Reminder")).toArray();

    foreach (const QJsonValue & item, jReminderItems)
    {
        QJsonValue eName = (item.toObject())["EventName"];
        QJsonValue tBegin = (item.toObject())["TimeBegin"];
        QJsonValue tDue = (item.toObject())["TimeDue"];
        QJsonValue comments = (item.toObject())["Comments"];
        const NMyEvent *myevent = NMyEvent::newEvent(eName.toString(),tBegin.toString(),tDue.toString(),comments.toString());

        eventArray->append(*myevent);
    }
}

QT实现自动启动(Windows)

QString NMyUtils::getExeFullPathWithArgs()
{
    QString exePath = QCoreApplication::applicationFilePath().replace("/","\\").replace("Reminder.exe","QTLoader.exe");
    QString argPath = "\""+exePath+"\" TrayIcon";
    qDebug()<<argPath;
    return argPath;
}

bool NMyUtils::isAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    QString val = reg.value("NReminder").toString();
    if(val.length()>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void NMyUtils::setAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    reg.setValue("NReminder",NMyUtils::getExeFullPathWithArgs());
}

void NMyUtils::removeAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    reg.remove("NReminder");
}

QT实现TrayIcon

void MainWindow::initTrayIcon()
{
    trayIcon=new QSystemTrayIcon(this);
    appIcon =new QIcon(NMyUtils::getFileFullPath("Reminder.png"));
    trayIcon->setIcon(*appIcon);
    this->setWindowIcon(*appIcon);

    autoStartAction = new QAction(tr("AutoStart"),this);
    autoStartAction->setCheckable(true);
    if(NMyUtils::isAutoStart())
    {
        autoStartAction->setChecked(true);
    }
    connect(autoStartAction, SIGNAL(triggered()), this, SLOT(autoStart()));
    showHideAction = new QAction(tr("Show"),this);
    showHideAction->setCheckable(true);
    showHideAction->setChecked(true);
    connect(showHideAction, SIGNAL(triggered()), this, SLOT(showHide()));
    quitAction = new QAction(tr("Quit"),this);
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

    trayIconMenu = new QMenu(this);
    trayIconMenu->addAction(autoStartAction);
    trayIconMenu->addAction(showHideAction);
    trayIconMenu->addSeparator();
    trayIconMenu->addAction(quitAction);
    trayIcon->setContextMenu(trayIconMenu);

    trayIcon->setToolTip(tr("Reminder"));
    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
    trayIcon->show();
}

Android任务栏通知

        private static int nId = 0;

        private void RaiseSysTrayAlert(List<NEventBean> eventList)
        {
            NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            Context context = getApplicationContext();

            for(NEventBean bean : eventList)
            {
                Builder mBuilder = new Builder(context);
                mBuilder.setTicker("XXXX");
                mBuilder.setSmallIcon(R.drawable.ic_launcher);
                mBuilder.setContentTitle("XXXX");
                mBuilder.setContentText(bean.msg);
                mBuilder.setAutoCancel(true);

                Intent notifyIntent = new Intent(context, MainActivity.class);
                notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                PendingIntent pIntent = PendingIntent.getActivity(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                mBuilder.setContentIntent(pIntent);

                nId++;
                nm.notify(nId, mBuilder.build());
            }
        }

Android后台服务及自动运行

1、修改AndroidManifest.xml文件

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application ...>
        <service
            android:name="com.neohope.android.service.NService"
            android:enabled="true"
            android:exported="true" >
        </service>

        <receiver android:name="com.neohope.android.receiver.NBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
</application>

2、新增服务类

package com.neohope.android.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;

public class NService extends Service {

    public NService() {
        
    }

    @Override
    public void onCreate() {
        mainThread = new WorkThread ();
        mainThread.start();
    }

    @Override
    public void onDestroy() {
        mainThread.bEnd = true;
    }

    class WorkThread extends Thread
    {
        private int nInterval = 1000*60;
        private boolean bEnd = false;

        public JsonReaderThread()
        {
        }

        @Override
        public void run()
        {
            while(!bEnd)
            {
                DoSomething();

                try {
                    Thread.sleep(nInterval);
                } catch (InterruptedException e) {
                    Log.w("", "");
                }
            }
        }

        private void DoSomething()
        {
        }

}

3、新增广播处理类

package com.neohope.android.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.neohope.android.service.NService;

public class NBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startServiceIntent = new Intent(context, NService.class);
        context.startService(startServiceIntent);
    }
}

4、在Activity中添加启动代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doStartService();
    }

    public void doStartService() {
        Context context = getApplicationContext();
        Intent startServiceIntent = new Intent(context, NService.class);
        context.startService(startServiceIntent);
    }

Android读取网页内容

1、修改AndroidManifest.xml文件

<uses-permission android:name="android.permission.INTERNET" />

2、网页读取类

package com.neohope.android.web;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class HttpUtils {

    public static String readStringFromUrl(String szUrl,String szCharcode) throws IOException {
        URL url = new URL(szUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5 * 1000);
        conn.setRequestMethod("GET");

        String szJson = "";
        int resPonseCode = conn.getResponseCode();
        if (conn.getResponseCode() == 200)
        {
            InputStream is = conn.getInputStream();
            byte[] data = readStream(is);
            szJson = new String(data,szCharcode);
        }

        return szJson;
    }

    private static byte[] readStream(InputStream inputStream) throws IOException {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            bout.write(buffer, 0, len);
        }
        bout.close();
        inputStream.close();

        return bout.toByteArray();
    }
}

O2O必须能调动线下资源

最近看来,国内O2O的商业模式主要在拼命覆盖“吃、穿、住、用、行”,而且出现很明显的行业排名。

问题是,为什么会有公司成功,而多数的公司失败了呢?

个人感觉,以下几点比较重要:

1、O2O必须可以让用户和服务提供者的需求match起来,将线下资源调动到线上,让大家得到真正的收益(解决问题省钱省时间)
很简单的例子,就是打车软件。以打车为例,打车软件出现以前,打车的人无车可用,出租车找不到乘客。滴滴和快的,解决的问题是将打车需求及出租车资源带到线上,将双方match了起来。

2、时机很重要,该出手时就出手,赢家通吃
这个很容易理解。一旦有人搞出一种新模式,很多人就会一起上,然后就是大乱斗,最后尘埃落定,赢家通吃。

3、资金链超级重要,该出手时再出手,资金链断裂等于突然死亡
比如团购,雨后春笋般出现了几百家,资金链断裂,乱烧钱公司突然集体死亡。最后美团用剩下的资金占领了很大的市场,成功的活了下来。

4、从优惠及免费开始
不管是打车、团购还是外卖,在初期用过的话,你懂的。

5、从竞争走向合作
快的和滴滴的垄断优势,你懂的。
(再比如,互联网中的优酷和土豆)

6、积极寻找盈利点
站稳脚跟后,大家首先要考虑的问题就是盈利,毕竟是开公司,不是做慈善咯。
(再比如,互联网中的天猫)

7、改变规则
比如1号专车对出租车的冲击
(再比如,互联网中微信对短信的冲击,支付宝和微信支付对网银的冲击)

8、现在赢家通吃现象比较严重,长尾效应暂时没有显现

9、个人预测

外卖的战争开始了,诸位要加油哦。

超市资源还没有人调动到线上,超市的话很多时候是资源过剩,一些时候资源紧张。这是个不错的突破口。虽然B2C做的火热,但O2O还是有很大市场的呢。

解决了吃穿住用行,然后就是医疗健康,一定会有很多新的模式出现的。现在主流厂商的模式,根本没有成型,战争刚刚开始拉开序幕。

解决了吃穿住用行,人们就会开始追求自我价值,享受及艺术的时代,应该不远了。

维修、保洁类的上门服务,也可以考虑哦。

今天先写这么多吧。

运煤问题

提问:
一个山西煤老板,在矿区开采了3000吨煤需要运送到市场上去卖,从矿区到市场有1000公里。现在有一列烧煤的火车,该火车最多只能装1000吨煤,但其每一公里需要耗一吨煤作为燃料。请问,怎么运送才能运最多的煤到集市?(火车可以调头,火车最终不需要返回煤矿)

约束:
1、火车一定需要调头
2、调头的原则是,消耗的燃料越少越好
3、当煤不足一车时,仍然要当作一车运输

解答:
1、当煤多于2000吨时,火车一定要运三次,同样的路要跑五次
1000吨煤,走五次,可以走1/5路程
2、当煤多余1000吨时,火车一定要运两次,同样的路要跑三次
1000吨煤,走三次,可以走1/3路程
3、最终剩余1000吨时,直接跑到终点
最后剩余路程为1-1/5-1/3=7/15
跑完后剩余的煤为1000-7/15*1000=1000*8/15=533零1/3吨

以上。

跨语言翻译

1、Java翻译为JS

1.1、GWT
通过Eclipse+GWT插件,进行界面设计,界面响应方法与AWT类似。开否人员可以用JavaGUI设计的方式进行复杂界面开否,然后翻译为H5+JS的页面。

1.2、RAP/RWT
通过Eclipse SWT方式来进行界面开发,通过RAP/RWT将页面翻译为H5+JS的页面。可以通过相对可控的代价,将原来CS架构的SWT项目,转换为Web架构。问题也是一样的,就是全部的修改,要从CS架构改起。

2、wrapper
2.1、swig
可以将c/c++项目进行包装,支持Java, JS, GO, C#, Perl, PHP, Python, Ruby, Lua, R, Android等多种语言调用。