2011-06-28 9 views
11

A menos que el Sr.Wizard esté de vacaciones, es bastante difícil vencer este fenómeno que parece estar dotado de omnipresencia y omnisciencia. ¿Cómo podemos superarlo usando Mathematica y la API de StackOverflow?Buscando nuevas preguntas de Mathematica usando Mathematica y la API de StackOverflow

+0

Encuentra un pez más grande. Superar a Leonid puede requerir una IA que pase la prueba de Turing. :-) –

+2

@ Mr.Wizard Casi siempre puedo identificar las publicaciones de Leonid mucho antes de que vea su etiqueta. Creo que mi heurística inconsciente es If [PostLength> 1 página, Poster == Leonid], eso y probablemente muchas cosas de CS-ish (sorprendentemente, acaba de decirte que no tiene experiencia en CS). –

Respuesta

15

Aquí hay una variación de la solución de Sjoerd.

La principal diferencia es utilizar una celda acoplada en lugar de un cuadro de diálogo emergente. La celda tiene un enlace a la nueva publicación, así como también un botón que borrará la celda acoplada al estado anterior.

La otra diferencia es usar el ID de la pregunta en lugar del título para determinar nuevas publicaciones. Sé que los títulos se editan a veces, por lo que se activan como una nueva publicación en ese caso.

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]; 

enter image description here

+0

+1 Buen cambio. Me gusta el bit con la configuración 'DockedCell' y cómo restaurarlo a los valores originales. Para esta pregunta y aplicación, obtuve mi inspiración del [blog 'Photo booth' de Yu-Sung Chang] [1]. Previamente, pensé en la evaluación cronometrada como nada más que tareas cron para trabajos por lotes, pero aprendí que hace un trabajo fantástico en GUI y aplicaciones como esta. [1]: http://blog.wolfram.com/2011/06/23/mission-mathematica-making-a-photo-booth-app-in-three-steps/#more-6374 –

+2

Creo que las células acopladas son subutilizado, probablemente porque hay un poco de esfuerzo involucrado para crear uno. Tengo varias copias de Mathematica instaladas, y usualmente al menos dos abiertas, y uso una celda acoplada personalizada que me dice qué computadora portátil está conectada a qué versión. Por esta razón, era importante para mí tener una forma de volver a mi celda anclada normal. –

+0

Acabo de ver esta edición. Se ve bien. Me recuerda a las notificaciones que SO mismo da para nuevas respuestas, etc ... (Aparte: para un curso que enseñé, utilicé una celda acoplada en la plantilla de asignación. Contenía información sobre la tarea, un botón de pregunta siguiente y un envío a través del botón FTP) – Simon

15

Bastante fácil en realidad. Todo lo que necesitas es lo siguiente.

Definir una tarea reloj:

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 
    ]; 

Y para empezar la siguiente:

StartScheduledTask[mySOWatchTask]; 

Basta con:

StopScheduledTask[mySOWatchTask]; 

Mira lo que está ejecutando:

ScheduledTasks[] // Shallow 

Retire la tarea:

RemoveScheduledTask[mySOWatchTask]; 

o todas las tareas:

RemoveScheduledTask[ScheduledTasks[]]; 

Este encuestas por lo que cada minuto (the minimum that is not seen as abusive), y muestra un cuadro de diálogo y reproduce un sonido cada vez que llega una nueva pregunta Mathematica .

enter image description here

La belleza de esto es: se usa Mathematica 8, y todos sabemos Mr.Wizard no tiene que (aún) ;-)

Tenga en cuenta que la API de SO se almacena en caché en gran medida, por lo que la respuesta puede no venir directamente. Tampoco he probado esto extensivamente.

EDITAR
Tenga en cuenta que la clave (ap-id) se ha usado anteriormente está destinado a ser utilizado sólo por esta pequeña aplicación Mathematica. Si necesita uno para una aplicación diferente, puede obtener uno usted mismo en un procedimiento rápido e indoloro here. Me llevó menos de un minuto.

+0

¿De quién es la clave?:) – bzlm

+1

@bzlm Pertenece al programa anterior. El nombre 'clave' es un nombre inapropiado. En realidad, es un ID de aplicación para las estadísticas de uso –

+2

@Sjoerd ¡Felicitaciones en su 5K! ... –