Version 2 features?
Moderator: Thorsten
Version 2 features?
I read on the home page that there is a beta of version 2.0 but couldn't find any info on what you have planned for the next major version. Can we get a sneak peak at the feature list?
Hi,
there's no beta available. You can see the new features in every phpMyFAQ package in the folder docs/TODO.txt.
bye
Thorsten
there's no beta available. You can see the new features in every phpMyFAQ package in the folder docs/TODO.txt.
bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
amazon.de Wishlist
Ah, okay thanks, missed that. Sweet features on that list. So it looks like these are coming down the road:
2.0.0 "Prometheus":
- add username to a category
- configurable visibility of questions
- new authentication class ?
- glossary support
- improved WYSIWYG editor and Image Manager ?
- reorder records ?
- batch insertion script ?
- show/edit/delete comments ?
- add "submit translation" link ?
- installer and update scripts merged together in a setup routine ?
- change 'id' to 'record' for better Google compliance
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.1.0 "Pandora":
- add related articles [new sql table: faqrelatedentries] ?
- subscription service for new articles ?
- message to the user, who has posted a question and an answer is availible ?
- better news system with multiple pages and sticky news
- improved category administration ?
- XML Import
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.2.0 "Paaliaq":
- possibility to disable multiple languages
- SOAP interface ?
- "sticky" records ?
- PDF2Mail ?
- users can request a record changing ?
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.3.0 "Portia":
- add auto update feature ?
- modularisation of all features ?
- Unicode support for PDFs ?
- directory-like listing of entries ?
- bugfixing for stability or security reasons
2.0.0 "Prometheus":
- add username to a category
- configurable visibility of questions
- new authentication class ?
- glossary support
- improved WYSIWYG editor and Image Manager ?
- reorder records ?
- batch insertion script ?
- show/edit/delete comments ?
- add "submit translation" link ?
- installer and update scripts merged together in a setup routine ?
- change 'id' to 'record' for better Google compliance
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.1.0 "Pandora":
- add related articles [new sql table: faqrelatedentries] ?
- subscription service for new articles ?
- message to the user, who has posted a question and an answer is availible ?
- better news system with multiple pages and sticky news
- improved category administration ?
- XML Import
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.2.0 "Paaliaq":
- possibility to disable multiple languages
- SOAP interface ?
- "sticky" records ?
- PDF2Mail ?
- users can request a record changing ?
- more accessibility features (WAI and Section 508) ?
- bugfixing for stability or security reasons
2.3.0 "Portia":
- add auto update feature ?
- modularisation of all features ?
- Unicode support for PDFs ?
- directory-like listing of entries ?
- bugfixing for stability or security reasons
Hi,
that's right. About 2/3 of the 2.0 features are already implemented...
bye
Thorsten
that's right. About 2/3 of the 2.0 features are already implemented...
bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
amazon.de Wishlist
don't forget ...
@Thorsten .. you promised me earlier that 2.0 will implement a 'clean disk space' facility from Admin Panel. And an option not to log robots in session file. I get around 400 KB of sessionslogs from google visits per day!
Also the faq-sessions table is around 7 MB. Lots of people running the system from a shared server have only 10 MB diskspace for databases.
Also the faq-sessions table is around 7 MB. Lots of people running the system from a shared server have only 10 MB diskspace for databases.
Hi,
ah, yes, I forgot the "cleaning" features... some of them are already implemented, too.
bye
Thorsten
ah, yes, I forgot the "cleaning" features... some of them are already implemented, too.
bye
Thorsten
phpMyFAQ Maintainer and Lead Developer
amazon.de Wishlist
amazon.de Wishlist
Hi jazcyk,
is it possible for you to track also the usage of the faqcaptcha table for a "while" (=about 1 week)?
As written here, we must find the best trade-off for cleaning up the table against the loss of some (maybe) useful info directly from the field, our precious community
.
You could perform this tracking daily by monitoring the growing of the table using: and its distribution using:
I expect that at the top you'll have many hits from few well-known crawler robots and then the spam robots attempts (and you could collect their IP address for banning them) and finally the end user attempts (failed for wrong captcha code submission or, just simply, attempts to see what that page is printing out...).
We could find an heuristical value for refining the current candidate algorithm, delete entries older than 1 week - the quickest, please, remember that this check for removing unuseful entries is performed each time a captcha code will be required -, adding a trigger related to the number of attempts done by an IP address, deleting also those entries coming from a list of well-known IP addresses representing the crawler robots.
Said this, other ideas (keep them "simple"...) for the faqcaptcha table cleaning are welcome
.
The goal is to give the user the possibility of collecting bad IP addresses: if this collection is not requested then the current algorithm proposal (1 week old) will be activated asap.
Thanks in advance,
Matteo
is it possible for you to track also the usage of the faqcaptcha table for a "while" (=about 1 week)?
As written here, we must find the best trade-off for cleaning up the table against the loss of some (maybe) useful info directly from the field, our precious community

You could perform this tracking daily by monitoring the growing of the table using:
Code: Select all
SELECT COUNT(id) FROM faqcaptcha
Code: Select all
SELECT DISTINCT ip, useragent, COUNT(ip) AS times FROM faqcaptcha GROUP BY ip ORDER BY times DESC
We could find an heuristical value for refining the current candidate algorithm, delete entries older than 1 week - the quickest, please, remember that this check for removing unuseful entries is performed each time a captcha code will be required -, adding a trigger related to the number of attempts done by an IP address, deleting also those entries coming from a list of well-known IP addresses representing the crawler robots.
Said this, other ideas (keep them "simple"...) for the faqcaptcha table cleaning are welcome

The goal is to give the user the possibility of collecting bad IP addresses: if this collection is not requested then the current algorithm proposal (1 week old) will be activated asap.
Thanks in advance,
Matteo
phpMyFAQ QA / Developer
Amazon.co.uk Wishlist
Amazon.co.uk Wishlist
@Matteo ..
I can easily do that!
Want me to post here, or just collect it and mail to Thorsten?
Want me to post here, or just collect it and mail to Thorsten?
Re: @Matteo ..
Hi jazcyk,
Ciao,
Matteo
Thanks!jazcyk wrote:I can easily do that!
When ready, mail the data to Thorsten: we'll share it privately.jazcyk wrote:Want me to post here, or just collect it and mail to Thorsten?
Ciao,
Matteo
phpMyFAQ QA / Developer
Amazon.co.uk Wishlist
Amazon.co.uk Wishlist
!1 week old" proposal seems to be the right one
Hi jazcyk,
I've just seen the results of your weekly monitored data and I think that the "1 week old" proposal is actually the best trade-off between the cleaning issue and the possibility of collecting data (usually spam has a burst behaviour in a short time).
You'll find this cleaning behaviour on faqcaptcha table from the next release, 1.6.2.
Ciao,
Matteo
Thanks for your efforts: really appreciated!jazcyk wrote:and put an UGLY post-it note on my screen to remember!
I've just seen the results of your weekly monitored data and I think that the "1 week old" proposal is actually the best trade-off between the cleaning issue and the possibility of collecting data (usually spam has a burst behaviour in a short time).
You'll find this cleaning behaviour on faqcaptcha table from the next release, 1.6.2.
Ciao,
Matteo
phpMyFAQ QA / Developer
Amazon.co.uk Wishlist
Amazon.co.uk Wishlist
cleaning
the captcha table is a minor problem! I think I can just simply delete those from the database myself?
What I request most of all is a feature 'shrinking' the sessions table and deleting corresponding session log files. Thos are the ones takeing the volume! To use a 'wildcard' with the OS command I think it would be easiest to work with a per-month delete?
What I request most of all is a feature 'shrinking' the sessions table and deleting corresponding session log files. Thos are the ones takeing the volume! To use a 'wildcard' with the OS command I think it would be easiest to work with a per-month delete?
Hi jazcyk,
I know that the cleaning of the faqcaptcha table is a minor issue regarding to the other requests, but if you look at the code, this cleaning stage was already there, ready to be uncommented after some tests on the field.
Time permitted, that is to say among the other tasks and their priority, we'll work also on the other cleaning requests
.
FYI it's quite true that: will delete the files in a simple way but we need to delete the whole of the deleted session id references into the faqsession table too.
Bye,
Matteo
I know that the cleaning of the faqcaptcha table is a minor issue regarding to the other requests, but if you look at the code, this cleaning stage was already there, ready to be uncommented after some tests on the field.
Time permitted, that is to say among the other tasks and their priority, we'll work also on the other cleaning requests

FYI it's quite true that:
Code: Select all
rm [PATH_TO_PMFINSTALL]/data/tracking*052006
Bye,
Matteo
phpMyFAQ QA / Developer
Amazon.co.uk Wishlist
Amazon.co.uk Wishlist
yup ...
let things take the time they need
However I do not know if you are aware of this discussion:
viewtopic.php?t=2088

However I do not know if you are aware of this discussion:
viewtopic.php?t=2088
A 1st implementation of a monthly based stats deletion
Hi jazcyk,
Locate, backup and open the file [PATH_TO_PMFINSTALL]/admin/stat.main.php and replace the original code with the one below:
Besides locate, backup and open the file [PATH_TO_PMFINSTALL]/inc/functions.php and replace the FileToDate() function with the one below:
Please use this hack ONLY in a TEST environment: feel free of give me feedback about the way the feature is accessed by the administrator.
Ciao,
Matteo
Find below a first hack that will be committed into CVS in the PMF 1.6.x branch if this feature will be compatible with the features freezing plan for this branch.jazcyk wrote:let things take the time they need![]()
Locate, backup and open the file [PATH_TO_PMFINSTALL]/admin/stat.main.php and replace the original code with the one below:
Code: Select all
<?php
/**
* $Id$
*
* The main statistics page
*
* @author Thorsten Rinne <thorsten@phpmyfaq.de>
* @author Matteo Scaramuccia <matteo@scaramuccia.com>
* @since 2003-02-24
* @copyright (c) 2001-2006 phpMyFAQ Team
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*/
if (!defined('IS_VALID_PHPMYFAQ_ADMIN')) {
header('Location: http://'.$_SERVER['SERVER_NAME'].dirname($_SERVER['SCRIPT_NAME']));
exit();
}
if ($permission["viewlog"]) {
if (isset($_POST['statdelete']) && isset($_POST['month']) && is_numeric($_POST['month'])) {
// Search for related tracking data files and
// delete them including the sid records in the faqsessions table
$dir = opendir(PMF_ROOT_DIR."/data");
$first = 9999999999999999999999999;
$last = 0;
while($trackingFile = readdir($dir)) {
// The filename format is: trackingDDMMYYYY
// e.g.: tracking02042006
if (($trackingFile != '.') && ($trackingFile != '..') && (10 == strpos($trackingFile, $_POST['month']))) {
if (FileToDate($trackingFile) > $last) {
$last = FileToDate($trackingFile);
}
if ((FileToDate($trackingFile) < $first) && (FileToDate($trackingFile) > 0)) {
$first = FileToDate($trackingFile);
}
unlink(PMF_ROOT_DIR.'/data/'.$trackingFile);
}
}
closedir($dir);
$result = $db->query('DELETE FROM '.SQLPREFIX.'faqsessions WHERE time >= '.$first.' AND time <= '.$last);
}
?>
<h2><?php print $PMF_LANG["ad_stat_sess"]; ?></h2>
<form action="<?php print $_SERVER["PHP_SELF"].$linkext ?>" method="post" style="display: inline;">
<input type="hidden" name="aktion" value="sessionbrowse" />
<fieldset>
<legend><?php print $PMF_LANG["ad_stat_sess"]; ?></legend>
<label class="left"><?php print $PMF_LANG["ad_stat_days"]; ?>:</label>
<?php
$danz = 0;
$fir = 9999999999999999999999999;
$las = 0;
$dir = opendir(PMF_ROOT_DIR."/data");
while($dat = readdir($dir)) {
if ($dat != "." && $dat != "..") {
$danz++;
}
if (FileToDate($dat) > $las) {
$las = FileToDate($dat);
}
if (FileToDate($dat) < $fir && FileToDate($dat) > 0) {
$fir = FileToDate($dat);
}
}
closedir($dir);
print $danz;
?>
<br />
<label class="left"><?php print $PMF_LANG["ad_stat_vis"]; ?>:</label>
<?php print $vanz = $db->num_rows($db->query("SELECT sid FROM ".SQLPREFIX."faqsessions")); ?><br />
<label class="left"><?php print $PMF_LANG["ad_stat_vpd"]; ?>:</label>
<?php print (($danz != 0) ? round(($vanz / $danz),2) : 0); ?><br />
<label class="left"><?php print $PMF_LANG["ad_stat_fien"]; ?>:</label>
<?php
if (is_file(PMF_ROOT_DIR."/data/tracking".date("dmY", $fir))) {
$fp = @fopen(PMF_ROOT_DIR."/data/tracking".date("dmY", $fir), "r");
list($dummy, $dummy, $dummy, $dummy, $dummy, $dummy, $dummy, $qstamp) = fgetcsv($fp, 1024, ";");
fclose($fp);
print date("d.m.Y H:i:s", $qstamp);
} else {
print $PMF_LANG["ad_sess_noentry"];
}
?>
<br />
<label class="left"><?php print $PMF_LANG["ad_stat_laen"]; ?>:</label>
<?php
if (is_file(PMF_ROOT_DIR."/data/tracking".date("dmY", $las))) {
$fp = fopen(PMF_ROOT_DIR."/data/tracking".date("dmY", $las), "r");
while (list($dummy, $dummy, $dummy, $dummy, $dummy, $dummy, $dummy, $tstamp) = fgetcsv($fp, 1024, ";")) {
$stamp = $tstamp;
}
fclose($fp);
if (empty($stamp)) {
$stamp = time();
}
print date("d.m.Y H:i:s", $stamp).'<br />';
} else {
print $PMF_LANG["ad_sess_noentry"].'<br />';
}
$dir = opendir(PMF_ROOT_DIR."/data");
$trackingDates = array();
while (false !== ($dat = readdir($dir))) {
if ($dat != "." && $dat != ".." && strlen($dat) == 16 && !is_dir($dat)) {
$trackingDates[] = FileToDate($dat);
}
}
closedir($dir);
sort($trackingDates);
?>
<label class="left"><?php print $PMF_LANG["ad_stat_browse"]; ?>:</label>
<select name="day" size="1">
<?php
foreach ($trackingDates as $trackingDate) {
printf('<option value="%d"', $trackingDate);
if (date("Y-m-d", $trackingDate) == strftime('%Y-%m-%d', time())) {
print ' selected="selected"';
}
print '>';
print date('Y-m-d', $trackingDate);
print "</option>\n";
}
?>
</select><br />
<div align="center">
<input class="submit" type="submit" name="statbrowse" value="<?php print $PMF_LANG["ad_stat_ok"]; ?>" />
</div>
<p align="center"><a href="<?php print $_SERVER["PHP_SELF"].$linkext; ?>&aktion=sessionsuche&statstart=<?php print $qstamp ?>&statend=<?php print $stamp ?>"><?php print $PMF_LANG["ad_sess_search"]; ?></a></p>
</fieldset>
</form>
<form action="<?php print $_SERVER["PHP_SELF"].$linkext ?>" method="post" style="display: inline;">
<input type="hidden" name="aktion" value="viewsessions" />
<fieldset>
<!--<legend><?php print $PMF_LANG["ad_stat_sess"]; ?></legend>-->
<legend>Sessions management</legend>
<!--<label class="left"><?php print $PMF_LANG["ad_stat_choose"]; ?>:</label>-->
<label class="left">Choose the month:</label>
<select name="month" size="1">
<?php
$oldValue = mktime(0, 0, 0, 1, 1, 1970);
foreach ($trackingDates as $trackingDate) {
if (date("Y-m", $oldValue) != date("Y-m", $trackingDate)) {
// The filename format is: trackingDDMMYYYY
// e.g.: tracking02042006
printf('<option value="%s"', date('mY', $trackingDate));
if (date("Y-m", $trackingDate) == strftime('%Y-%m', time())) {
print ' selected="selected"';
}
print '>';
print date('Y-m', $trackingDate);
print "</option>\n";
$oldValue = $trackingDate;
}
}
?>
</select><br />
<div align="center">
<!--<input class="submit" type="submit" name="statdelete" value="<?php print $PMF_LANG["ad_stat_delete"]; ?>" />-->
<input class="submit" type="submit" name="statdelete" value="Delete immediately" />
</div>
</fieldset>
</form>
<?php
} else {
print $PMF_LANG["err_NotAuth"];
}
?>
Code: Select all
function FileToDate($file)
{
if (strlen($file) >= 16) {
$tag = substr($file, 8, 2);
$mon = substr($file, 10, 2);
$yea = substr($file, 12, 4);
$tim = mktime(0, 0, 0, $mon, $tag, $yea);
return $tim;
} else {
return -1;
}
}
Ciao,
Matteo
phpMyFAQ QA / Developer
Amazon.co.uk Wishlist
Amazon.co.uk Wishlist