Esta publicación trata sobre el uso de las capacidades SQL de JMP, principalmente, pero también toca XML, Linux, MythTV.
Documento del generador de consultas SQL: https://www.jmp.com/support/help/14/query-builder.shtml#
MitoTV https://www.mythtv.org/ es un programa de código abierto (TANSTAAFL) que puede grabar transmisiones de televisión por aire usando una tarjeta sintonizadora en una PC (y muchas otras cosas también). Es una excelente manera de aprender sobre Linux y MySQL/MariaDB y evitar ver la televisión. La implementación utiliza dos computadoras, un backend (o varios) que realiza la grabación y un frontend (o varios) que realiza la visualización. Una base de datos SQL realiza un seguimiento de qué registrar y qué se ha registrado.
https://code.mythtv.org/trac/ticket/12974#no1 describe una razón por la que hay muchos archivos muy antiguos y muy grandes en el disco backend de MythTV que no son visibles en la interfaz de MythTV. Dice que hay un error de MythTV en torno al campo de la base de datos pendiente de eliminación que evita que el archivo se elimine si MythTV falla entre el momento en que se establece el campo y el archivo se elimina.
Por ejemplo, usando Linux ls comando para enumerar algunos archivos, aquí hay un ejemplo de 3 GB (es diciembre de 2019; solo caben alrededor de dos semanas de archivos en el disco 3T; estos archivos deberían desaparecer hace mucho tiempo).
-rw-r--r-- 1 mito tv mito tv 3.1G 21 de marzo de 2018 1051_20180321073000.ts
O, después de hacer una importación de base de datos,
JMP data table imported from database showing old, large filesTabla de datos JMP importada de la base de datos que muestra archivos grandes y antiguos
La importación de la base de datos parece útil; coloca columnas (o campos) uno al lado del otro que tienen valores relacionados y combina información de varias tablas en la base de datos. Aquí están los pasos para hacerlo.
Localice las credenciales de la base de datos.
En un sistema Linux que ejecuta la interfaz de MythTV, habrá un archivo ~/.mythtv/config.xml.
<CONFIGURATION>
<LOCALHOSTNAME>my-unique-identifier-goes-here</LOCALHOSTNAME>
<DATABASE>
<PINGHOST>1</PINGHOST>
<HOST>closet.local</HOST>
<USERNAME>mythtv</USERNAME>
<PASSWORD>this is the pw</PASSWORD>
<DATABASENAME>mythconverg</DATABASENAME>
<PORT>3306</PORT>
</DATABASE>
<WAKEONLAN>
<ENABLED>0</ENABLED>
<SQLRECONNECTWAITTIME>0</SQLRECONNECTWAITTIME>
<SQLCONNECTRETRY>5</SQLCONNECTRETRY>
<COMMAND>echo 'WOLsqlServerCommand not set'</COMMAND>
</WAKEONLAN>
<UPNP>
<UDN>
<MEDIARENDERER>52d20477-fda1-4e42-9edd-5992bd0ca45f</MEDIARENDERER>
</UDN>
</UPNP>
</CONFIGURATION>
Copie el archivo en algún lugar donde su copia de JMP pueda leerlo y, con JMP 15, ábralo así:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
que hará una tabla oculta como esta
JMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameTabla de datos JMP cargada desde un archivo XML con una fila y columnas para el nombre de usuario, la contraseña y el nombre de la base de datos
Closet.local es el nombre del host de backend, mythtv es el nombre de usuario de SQL que tiene acceso a la base de datos de mythconverg y 3306 es el puerto predeterminado, por lo que no será necesario.
Cree un DSN utilizando el Administrador de fuente de datos ODBC de Windows.
Probablemente necesite los controladores de 64 bits y es posible que deba descargarlos. https://dev.mysql.com/downloads/connector/odbc/ o tal vez https://downloads.mariadb.org/connector-odbc/+releases/ . Estoy bastante seguro de que en realidad estoy ejecutando MariaDB en mi servidor backend y usando el conector MySQL en la interfaz. https://www.google.com/search?q=mysql+vs+mariadb
The Windows ODBC Data Source Administrator sets up a DSNEl administrador de origen de datos ODBC de Windows configura un DSN
Presiona configurar y agrega algunos campos; Creo que todos estos pueden anularse a través de una cadena de conexión más adelante. Mi VirtualBox y la red y el servidor no están contentos con closet.local para el nombre del servidor, por lo que se usa la IP punteada. Puede completar el usuario y la contraseña y probar la conexión y ver los nombres de la base de datos que están disponibles. El JSL a continuación va a anularlos.
The ODBC Connector dialog supplies some information that can be overridden laterEl cuadro de diálogo Conector ODBC proporciona información que se puede anular más adelante.
Descubre los nombres de las tablas en las bases de datos de MythTV
Gracias a un ejemplo de @briancorcoran por señalar el camino con el siguiente bit de JSL.
https://community.jmp.com/t5/Discusiones/Cómo-obtengo-la-lista-de-las-bases-de-datos-disponibles-en-un-designado/mp/10589
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dt = Open Database(
"DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1],
"SHOW tables from " || dtConfig:DatabaseName[1] || ";",
"tables in " || dtConfig:DatabaseName[1]
);
Ese JSL está usando la tabla de datos dtConfig JMP abierta desde el archivo de configuración XML, arriba, para obtener la contraseña real y otra información para anular el DSN (que también se llama mythtv, sin relación con el nombre de usuario). El ejemplo de Brian usó MOSTRAR BASES DE DATOS. Este JSL usa SHOW TABLES FROM mythconverg para obtener las más de 80 tablas de la base de datos de mythtv llamada mythconverg.
(SQL puede tener varias bases de datos y una base de datos puede tener varias tablas. Las bases de datos no interactúan entre sí, pero las tablas dentro de una base de datos suelen tener claves en común que permiten unir dos tablas. Entonces, una base de datos para mascotas, una base de datos para recetas y una base de datos para MythTV. Dentro de la base de datos de MythTV, tablas que describen qué programas grabar y tablas que describen qué programas se han grabado y muchas otras tablas...)
A JMP data table from Open Database(...) showing the 88 table names in the databaseUna tabla de datos JMP de Open Database (...) que muestra los 88 nombres de tablas en la base de datos
empezar a descifrar la forma de la base de datos
Si hace esto mal Y escribe en la base de datos, corromperá la base de datos. Podrías ir a leer el código fuente para MythTV y tal vez incluso encuentre un documento que explique cómo funcionan las tablas, o puede hacer la pregunta interesante: ¿Todavía podré ver la televisión grabada mañana? Lo que sigue es el camino emocionante.
Mire a través de los nombres de las tablas de la base de datos en la tabla de datos anterior y vea si hay algunos interesantes. Los hay, pero aún no está claro qué representan.
two of the high lighted table names, record and recorded, look promisingdos de los nombres de las mesas resaltadas, registro y grabado, parecen prometedores
Aquí hay una manera fácil de echar un vistazo a las tablas y sus columnas y un poco de sus datos.
Archivo→Base de datos→Tabla abierta
The OpenTable dialog opens one database table into a JMP data tableEl cuadro de diálogo OpenTable abre una tabla de base de datos en una tabla de datos JMP
Hay 50 columnas en esta tabla, pero la que salta a la vista es la descripción:
The record table seems to describe what to recordLa tabla de registros parece describir qué registrar
Que es una descripción de qué registrar (o tal vez qué no registrar... Escribí esa regla). Esta no es la tabla que necesito.
¿Qué pasa con la tabla nombrada registrada?
The recorded table seems to be a list of programs that were recordedLa tabla grabada parece ser una lista de programas que fueron grabados
Eso parece una tabla de programas grabados. Este será un punto de partida.
Únase a algunas mesas para obtener todo lo necesario en un solo lugar
Archivo→Base de datos→Generador de consultas, seleccione la tabla registrada...
Query Builder starts by choosing a single tableQuery Builder comienza eligiendo una sola tabla
Cuando presione SIGUIENTE obtendrá este increíble @Eric_Hill ventana intermedia:
The amazing Select Tables windows can view other tables and join them to the first tableLas increíbles ventanas de selección de mesas pueden ver otras mesas y unirlas a la primera mesa
Esta ventana es para explorar tablas. No haga clic en Crear consulta todavía, eso lo lleva a una ventana donde seleccionará columnas. Antes de eso, use esta ventana para unirse a otras tablas.
(Puede volver a esta ventana más tarde, pero debería poder encontrar todo lo que necesitará más adelante en su primera visita... tal vez).
Clicking a table shows a snapshotAl hacer clic en una tabla, se muestra una instantánea.
Esto es lo que terminé usando (casi, vea a continuación un cambio más):
Three more tables joined with the firstTres mesas más se unieron a la primera
Usé el archivo grabado (seleccionado arriba) para obtener el tamaño del archivo que recuerda la base de datos. Creo que esta base de datos no está normalizada porque el nombre base aparece en el archivo grabado y grabado... https://en.wikipedia.org/wiki/Database_normalization
(Los botones en la parte inferior son diferentes porque utilicé el botón de triángulo rojo para volver a seleccionar más tablas en Generar consulta para obtener esta imagen... al presionar Aceptar volverá a la ventana Generar consulta).
Hay mucho poder aquí: puede controlar la unión con el botón del círculo azul, puede ver una instantánea de cualquier tabla en la columna y puede obtener una vista previa del resultado de la unión. ¡Y todas las tablas están listadas! Aquí es donde se resuelve el rompecabezas: qué mesas se necesitan y cómo se conectan entre sí. Elija la pestaña Instantánea de tabla, seleccione una tabla en la columna izquierda y use la flecha hacia abajo para ver cada tabla. Muchas de las mesas de MythTV están vacías, lo que significa que puedo ignorarlas.
Seleccione las columnas para mantener
Es hora de hacer clic en el botón Crear consulta. Esta ventana le permite elegir las columnas que desea y probar la consulta:
Build Query window chooses columns to keep in the JMP data tableLa ventana Crear consulta elige columnas para mantener en la tabla de datos JMP
Ese botón de doble X elimina todas las selecciones de columna; probablemente desee hacer clic en la X única para eliminar solo la columna seleccionada. Mueva las filas que describen las columnas hacia arriba y hacia abajo para ordenar las columnas y seleccione una columna para preordenar los datos.
elija Ejecutar consulta, estudie la tabla, vuelva a pensar...
desde el cuadro de diálogo anterior, el triángulo rojo junto a Tablas lo llevará de regreso al cuadro de diálogo Agregar otra tabla (el increíble). Necesitaba otra mesa para entender realmente lo que estaba pasando.
Added another table, recgroupSe agregó otra tabla, recgroup
La tabla recgroups tiene el indicador Grupo eliminado. Aquí hay un poco del resultado (similar a la tabla original en la parte superior). Todos estos nombres base están en el grupo predeterminado, no en el grupo eliminado.
The filesize column suggests there is a lot of space I might recoverLa columna de tamaño de archivo sugiere que hay mucho espacio que podría recuperar
¡Cuánto espacio perdido!
Aquí está el JSL/SQL del script fuente en la tabla. ¡Cambie <<
New SQL Query(
Connection( "ODBC:DSN=mythtv;SERVER=192.168.0.39;UID=mythtv;DATABASE=mythconverg;PORT=3306;PWD=%_PWD_%;"
),
QueryName( "recorded" ),
Select(
Column( "callsign", "t3" ),
Column( "channum", "t3" ),
Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "endtime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "title", "t1" ),
Column( "description", "t1" ),
Column( "autoexpire", "t1" ),
Column( "preserve", "t1" ),
Column( "deletepending", "t1" ),
Column( "recgroup", "t4" ),
Column( "basename", "t2" ),
Column( "filesize", "t2" ),
Column( "width", "t2" ),
Column( "height", "t2" ),
Column( "fps", "t2" ),
Column( "videoprop", "t5" ),
Column( "subtitletypes", "t5" )
),
From(
Table( "recorded", Alias( "t1" ) ),
Table( "recgroups", Alias( "t4" ),
Join( Type( Left Outer ),
EQ( Column( "recgroupid", "t1" ), Column( "recgroupid", "t4" ) )
)
),
Table( "recordedprogram", Alias( "t5" ),
Join(
Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t5" ) ) &
EQ(
Column("starttime","t1",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column("starttime","t5",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) )
)
)
),
Table( "recordedfile", Alias( "t2" ),
Join( Type( Left Outer ),
EQ( Column( "recordedid", "t1" ), Column( "recordedid", "t2" ) )
)
),
Table( "channel", Alias( "t3" ),
Join( Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t3" ) )
)
)
),
Order By( Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ),
Order( "Ascending" ) )
)
) << Run;
Así que necesito hacer una pequeña prueba: para un solo archivo atascado, toque la base de datos para volver a activar la caducidad automática y eliminar los pendientes. Y tal vez detener y reiniciar el backend. Luego mire y vea si el archivo se elimina, en algún momento en las próximas horas o días... esa parte del comportamiento de MythTV, la eliminación justo a tiempo, también es confusa.
H mmm. Mejor ve despacio. El tamaño de archivo total en la base de datos es el doble de grande que el disco.Eliminemos este: 1171_20180321043700.ts
Primero, haz una consulta para encontrarlo, utilizando un filtro. Voy por este camino porque JMP puede hacer la mayor parte del trabajo por mí en una GUI y no me siento del todo cómodo escribiendo el SQL sin ayuda. Modificaré el SQL después de que JMP haga la parte difícil por mí.
Add a filter to select a single basename (file)Agregue un filtro para seleccionar un solo nombre base (archivo)
¡Lindo! El filtro agregó la cláusula WHERE al SQL y se encontró exactamente una fila. Creo que es hora de copiar el SQL del Consultor de construcción diálogo; necesita agregar el mitoconverg. antes de cada nombre de tabla :
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
//https://community.jmp.com/t5/Discussions/How-do-I-get-the-list-of-the-databases-available-on-a-designated/m-p/10589
// dtConfig:UserName,Password,DatabaseName
//
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1); // better only be one row
ADVERTENCIA, SIGUE UN CÓDIGO PELIGROSO, PUEDE BORRAR SU BASE DE DATOS CON ACTUALIZAR Y CONFIGURAR.
y reemplaza SELECCIONAR... DE con ACTUALIZAR y agregar una cláusula SET y eliminar ORDER BY:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
recuperar la tabla nuevamente muestra la actualización:
The UPDATE and SET workedLa ACTUALIZACIÓN y el CONJUNTO funcionaron
No estoy seguro de cómo obtener el estado de la actualización; el rc era un valor faltante y no se creó ninguna tabla, lo cual tiene sentido. Pero funcionó...
Varios minutos después, el archivo aún está presente. Voy a reiniciar el backend. Reiniciado. El archivo aparece en la interfaz ahora.
Part of the frontend GUI shows the ancient file is visible againParte de la interfaz gráfica de usuario muestra que el archivo antiguo vuelve a estar visible
Me sentaré y veré si desaparece en el disco en unos días. Luego trabajaré en el resto de los que están así, y veré por qué la base de datos parece pensar que hay 6T en un disco de 3T...
Unas pocas horas después: ls: no se puede acceder a '1171_20180321043700.ts': no existe tal archivo o directorio
Como se indicó anteriormente (comentario normalizado), el nombre del archivo aparece en más de una tabla. Mi plan para limpiar el 6T a un 3T más realista asume que hay entradas en la tabla grabada que se refieren a archivos que ya no están en el disco. En lugar de tratar de eliminar registros de ambas tablas (¿y quizás más?), Creo que crearé un archivo ficticio si no hay uno y dejaré que el código existente lo trate de la manera habitual. Tal vez un buen primer paso sería simplemente abrir las tablas de la base de datos de archivos grabados y grabados en las tablas de datos JMP e identificar dónde faltan archivos en el disco e incoherencias entre las tablas.
File→Database→OpenTable lo hará. Elimine todas las columnas excepto el nombre base y el id grabado, ordene por id grabado, compare las tablas de datos. Tres diferencias para hacer clic. Fácil.
Curioso: 1171_20180317233200.ts está en el archivo grabado, pero no grabado
y existe como un archivo de 0 bytes -rw-rw-r-- 1 mythtv mythtv 0 4 de abril de 2018 1171_20180317233200.ts
Y hay dos entradas con un nombre completamente en blanco en el archivo grabado que no tienen un ID grabado coincidente en el archivo grabado. Probablemente no quiera limpiarlos, sin saber qué otras tablas podrían referirse a ellos.
El archivo borrado arriba, 1171_20180321043700.ts , no aparece en ninguna de las tablas. ¡Hurra!
Usaré record como verdad ya que no tiene los registros en blanco. Usaré una fórmula de columna con la función fileexists() para ayudar a ver qué está pasando.
Graph; points at top represent real files on disk, points at bottom are files that are not on diskGrafico; los puntos en la parte superior representan archivos reales en el disco, los puntos en la parte inferior son archivos que no están en el disco
Existe la posibilidad de que recupere mucho espacio en disco, pero puede haber muchos archivos de longitud cero o casi cero en ese clúster que quiero eliminar. Es hora de un descanso, no debería comenzar esto a las 9 p.m.
Para responder al "¿cuánto?" pregunta, use tamaño de archivo () en lugar de fileexists (). Muchos de los archivos existen, pero son de cero bytes, por lo que solo hay alrededor de 0.3T (¡10%!) De espacio recuperable.
Fase 1: agregue archivos ficticios para los archivos que no existen para que MythTV pueda limpiarlos más tarde. La razón por la que los registros permanecen en la base de datos cuando MythTV no puede encontrar los archivos es porque MythTV asume que los archivos podrían estar en un disco no disponible y quedarían huérfanos si se eliminara la entrada de la base de datos.
// actualsize is this formula:
// File Size( "f:/closet/" || :basename )
For Each Row(
If( :basename != "" & Is Missing( actualsize ),
If( !File Exists( "f:/closet/" || :basename ),
Show( :basename );
Save Text File( "f:/closet/" || :basename, "hi there" );// use “touch” on Linux
, // else
Throw( "oops" )
)
)
);
Write( "\!ndone" );
Fase 2: obtenga una copia nueva de la base de datos en una tabla de datos. Se ve bien. Es hora de volver a trabajar el SQL para ver si podemos seleccionar solo los registros que se actualizarán:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t1.deletepending=1 ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1);
Eso selecciona aproximadamente la mitad de los registros, todos bastante antiguos, que están pendientes de eliminación. Es hora de ponerse audaz...
Fase 3: hazlo.
ADVERTENCIA, SIGUE UN CÓDIGO PELIGROSO, PUEDE BORRAR SU BASE DE DATOS CON ACTUALIZAR Y CONFIGURAR.
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t1.deletepending=1 ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
Los pendientes de eliminación ya no están pendientes y la caducidad automática vuelve a estar activada. Es hora de esperar y ver.
A la mañana siguiente: creo que está funcionando; Debería haber hecho mejores notas. Estos son los archivos más antiguos que aún se encuentran antes de que se graben los programas de noticias matutinos (6:50 a. m. del lunes):
-rw-r--r-- 1 mythtv mythtv 1.9G 22 de marzo de 2018 1111_20180322080000.ts
-rw-r--r-- 1 mythtv mythtv 3.2G 22 de marzo de 2018 1051_20180322080000.ts
-rw-rw-rw- 1 mythtv mythtv 1.1M 22 de marzo de 2018 1111_20180322043700.ts.png
-rw-r--r-- 1 mythtv mythtv 11G 22 de marzo de 2018 1171_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 5.6G 22 de marzo de 2018 1111_20180322063000.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M 22 de marzo de 2018 1051_20180322033500.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G 22 de marzo de 2018 1051_20180322070000.ts
-rw-r--r-- 1 mythtv mythtv 5.7G 22 de marzo de 2018 1051_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 3.2G 22 de marzo de 2018 1051_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 1.6G 22 de marzo de 2018 1111_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 6.4G 22 de marzo de 2018 1051_20180322043700.ts
-rw-r--r-- 1 mythtv mythtv 5.4G 22 de marzo de 2018 1171_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M 22 de marzo de 2018 1171_20180322030000.ts.png
-rw-rw-rw- 1 mythtv mythtv 3.4M 22 de marzo de 2018 1051_20180322030100.ts.png
-rw-r--r-- 1 mythtv mythtv 2.1G 22 de marzo de 2018 1111_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 511K 22 de marzo de 2018 1111_20180322030000.ts.png
-rw-r--r-- 1 mythtv mythtv 6.6G 22 de marzo de 2018 1051_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.8G 22 de marzo de 2018 1111_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 21 de marzo de 2018 1171_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.7G 21 de marzo de 2018 1051_20180322030100.ts
-rw-r--r-- 1 mythtv mythtv 2.4G 21 de marzo de 2018 1111_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 21 de marzo de 2018 1051_20180321233000.ts
-rw-rw-rw- 1 mythtv mythtv 725K 21 de marzo de 2018 1111_20180321200000.ts.png
-rw-rw-rw- 1 mythtv mythtv 2.6M 21 de marzo de 2018 1051_20180321200000.ts.png
-rw-r--r-- 1 mythtv mythtv 2.9G 21 de marzo de 2018 1051_20180321200000.ts
-rw-r--r-- 1 mythtv mythtv 1.8G 21 de marzo de 2018 1111_20180321200000.ts
-rw-rw-rw- 1 mythtv mythtv 897K 21 de marzo de 2018 1111_20180321163000.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G 21 de marzo de 2018 1051_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G 21 de marzo de 2018 1111_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G 21 de marzo de 2018 1111_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 102M 21 de marzo de 2018 1171_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 26G 21 de marzo de 2018 1051_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 8.1G 21 de marzo de 2018 1111_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 21 de marzo de 2018 1171_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 6.2G 21 de marzo de 2018 1051_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 3.9G 21 de marzo de 2018 1111_20180321100000.ts
-rw-rw-rw- 1 mythtv mythtv 743K 20 de marzo de 2018 1281_20180321010000.ts.png
-rw-rw-rw- 1 mythtv mythtv 867K 20 de marzo de 2018 1281_20180321002000.ts.png
drwxr-xr-x 12 raíz raíz 4.0K 20 de marzo de 2018 ..
drwx------ 2 root root 16K 28 de febrero de 2018 perdido+encontrado
Programs recorded Friday will be recorded again today (Monday)Los programas grabados el viernes se volverán a grabar hoy (lunes)
Esos tres programas usaron alrededor de 40 GB el viernes pasado. A las 9:30 se han eliminado los últimos 13,4G de la tabla registrada. No estoy seguro de dónde vinieron los otros 15G. Tal vez la cola de eliminación ya tenía algunos archivos. Tal vez estos se agregaron en el orden más antiguo primero, después de algunos otros... Trato de no grabar la televisión durante el día, por lo que puede ser esta noche antes de que vea que se eliminan más archivos. (¡Sí, está sucediendo!) Espero que las miniaturas png (gigantes) también se cuiden solas, es demasiado pronto para decirlo.
Lo que aprendí sobre JMP y SQL: hay una forma muy sencilla de cargar una tabla SQL en una tabla de datos JMP si no se necesita unir (Archivo→Base de datos→Abrir tabla). Hay una herramienta realmente buena para leer tablas que debe unirse (Archivo → Base de datos → Generador de consultas). Ambos también generan un script JSL en la tabla que se puede reutilizar. Y, si necesita actualizar la base de datos, necesitará usar la función ExecueSQL(), pero puede obtener Query Builder para hacer el SQL que es casi lo que necesita, luego cámbielo, haga una ACTUALIZACIÓN/ESTABLECIMIENTO.
He hecho parte del trabajo de SQL fuera de JMP en el pasado. Me pareció muy agradable usar JSL para hacer un trabajo no SQL (crear archivos ficticios, hacer gráficos del uso del disco) que me ayudaron a comprender mejor la base de datos.
https://code.mythtv.org/cgit/mythtv/tree/mythtv/programs/mythbackend/autoexpire.cpp punto de partida para el código fuente de MythTV relacionado con la limpieza de archivos antiguos
https://en.wikipedia.org/wiki/Cord-cutting
Parece que todo ha vuelto a la normalidad. Este gráfico final muestra cómo diferentes estaciones han optimizado su ancho de banda disponible. El ancho de banda se puede dividir en uno o más canales; más canales reduce significa menos datos para hacer una imagen de alta calidad. Una de las estaciones locales también eligió ir con 720 60FPS en lugar de 1080 30FPS, lo que significa que tal vez no sea una comparación de manzanas con manzanas. Cada uno de los canales resaltados probablemente tenga uno o más canales de la misma estación con la que comparte ancho de banda. Las estaciones atenuadas en la parte inferior pueden estar transmitiendo varias películas antiguas al mismo tiempo o canales de compras. Fueron eliminados de la leyenda.
Lines with bigger slope have more bandwidth allocated to the pictureLas líneas con mayor pendiente tienen más ancho de banda asignado a la imagen