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吨
以上。
HTML设置禁用缓存
<!-- HTTP 1.1 --> <meta http-equiv="pragma" content="no-cache"> <!-- HTTP 1.0 --> <meta http-equiv="cache-control" content="no-cache"> <!-- Prevent caching at the proxy server --> <meta http-equiv="expires" content="0">
跨语言翻译
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等多种语言调用。