使用Mathematica和StackOverflow API监视新的Mathematica问题

11

除非Mr.Wizard正在度假,否则很难打败这个现象,他似乎天生具有无所不在和无所不知的特点。我们如何利用Mathematica和StackOverflow API来超越他呢?


找到更大的鱼。要超越Leonid可能需要一个通过图灵测试的人工智能。 :-) - Mr.Wizard
2
@Mr.Wizard 我几乎总能在看到他的标签之前就辨认出Leonid的帖子。我想我的无意识启发式是:如果[帖子长度>1页,发布者==Leonid],还有可能是很多计算机科学相关的东西(令人惊讶的是,他刚告诉你他没有计算机科学背景)。 - Sjoerd C. de Vries
2个回答

15

其实很简单。你所需要的是以下内容。

定义一个监视任务:

storedTitle = "";

mySOWatchTask =
  CreateScheduledTask[
   {
    lastTitle = 
    "title" /. ("questions" /. 
        Import["http://api.stackoverflow.com/1.1/questions?key=\
                QEpjCjsXYE6s_kZEkFr4Lw&page=1&pagesize=1&sort=creation&tagged=\
                mathematica", "JSON"])[[1]];
    If[lastTitle != storedTitle, 
      storedTitle = lastTitle; 
      EmitSound[Sound[SoundNote[]]]; 
      MessageDialog["New question: " <> lastTitle]
    ];
    },
   60
   ];

并且为了开始这个:

StartScheduledTask[mySOWatchTask];

别再这样做了:

 StopScheduledTask[mySOWatchTask];

看看正在运行的内容:

 ScheduledTasks[] // Shallow

移除任务:

 RemoveScheduledTask[mySOWatchTask];
对于所有任务:
RemoveScheduledTask[ScheduledTasks[]];

这个程序每分钟会向SO发起一次请求(最小值,不被视为滥用),并在有新的Mathematica问题时显示一个对话框和播放声音。

enter image description here

它的美妙之处在于:它使用Mathematica 8,我们都知道Mr.Wizard还没有(哈哈);-)

请注意,SO API正在被大量缓存,因此响应可能不会直接到达。我也没有进行大量测试。

编辑
请注意,上面使用的密钥(app-id)仅旨在供这个小型Mathematica应用程序使用。如果您需要另一个应用程序的密钥,您可以在这里快速且轻松地获得。我用了不到一分钟。


1
@bzlm 它属于上述程序。名称“key”是一个误称。实际上,它是用于使用统计的应用程序ID。 - Sjoerd C. de Vries
1
我会发另一个问题:“如何在@Mr ... err Mma 7中实现这个?” - Dr. belisarius
4
如果我能的话,我会为这个投票多次。但是你不仅可以在@Mr的问题上利用这个,现在我们又平等了 :) 但说真的,这证实了我们之前讨论中所说的:追求第一,受到当前SO模式的刺激,是一种人为因素,反映了它的弱点——它没有充分鼓励合作。 - Leonid Shifrin
3
@Leonid,以防你不知道,“西部最快枪手”问题已经被广泛讨论。例如,可以查看http://meta.stackoverflow.com/search?q=fastest+gun+in+the+west。 - Dr. belisarius
@belisarius 感谢提供链接!我记得你之前提到过这个问题,但没有给出明确的链接。我认为这是一个真正的问题,因为没有明显且简单的解决方案。 - Leonid Shifrin
显示剩余5条评论

15

这是对Sjoerd解决方案的一种变体。

主要的区别在于使用了停靠单元格而不是弹出式对话框。该单元格具有指向新帖子的链接,以及一个清除停靠单元格并恢复到先前状态的按钮。

另一个区别是使用问题ID而不是标题来确定新帖子。我知道有时候标题会被编辑,所以这种情况下也会触发新帖子的操作。

storedTitle = "";
storedID = 0;
mySOWatchTask = 
  CreateScheduledTask[{lastTitle, 
     lastID} = {"title", 
      "question_id"} /. ("questions" /. 
        Import["http://api.stackoverflow.com/1.1/questions?key=       \
         QEpjCjsXYE6s_kZEkFr4Lw&page=1&pagesize=1&sort=creation&\
tagged=                mathematica", "JSON"])[[1]];
   If[lastID != storedID,
    storedTitle = lastTitle;
    storedID = lastID;
    SetOptions[$FrontEndSession, 
     DockedCells -> 
      Cell[BoxData[
        ToBoxes[Style[
          With[{dock = Options[$FrontEndSession, DockedCells]}, 
           Grid[{{Button[Style["\[CircleTimes]", 16], 
               SetOptions[$FrontEndSession, dock], 
               Appearance -> None], "New StackOverflow question: ", 
              Hyperlink[lastTitle, 
               "http://stackoverflow.com/questions/" <> 
                ToString[lastID]]}}, 
            Alignment -> {{Left, Left, Left}}, 
            ItemSize -> {{2, 14, Scaled[0.7]}}]], 
          FontFamily -> "Times"]]], "DockedCell", 
       Background -> Orange]]; EmitSound[Sound[SoundNote[]]]];, 60];

这里输入图片描述


+1 很好的改变。我喜欢DockedCell设置的部分,以及您如何将其恢复到原始值。对于这个问题和应用程序,我从[张宇松的“照相亭”博客][1]中获得了灵感。以前,我认为定时评估只是批处理作业的cron任务,但我学到了它在GUI和像这样的应用程序中表现出色。 [1]: http://blog.wolfram.com/2011/06/23/mission-mathematica-making-a-photo-booth-app-in-three-steps/#more-6374 - Sjoerd C. de Vries
2
我认为停靠单元格被低估了,可能是因为创建一个需要付出一些努力。我安装了几个版本的Mathematica,并且通常至少有两个打开,使用自定义的停靠单元格告诉我哪个笔记本连接到哪个版本。因此,对我来说重要的是有一种方法可以返回到我的正常停靠单元格。 - Brett Champion
我刚刚看到这个编辑,它看起来很不错。它让我想起了 Stack Overflow 本身针对新答案等的通知...(另外:在我教授的某门课程中,我使用了一个固定单元格作为作业模板。其中包含有关作业的信息、下一题按钮和通过 FTP 提交的按钮) - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接