[ overboard / sfw / alt / cytube] [ b ]

/tech/ - Technology

"Technology reveals the active relation of man to nature"
Name
Email
Subject
Comment
Flag
File
Embed
Password (For file deletion.)

Matrix

Pleroma

Mumble

Discord

IRC

Text Boards



File: 1612129656526.gif ( 2.28 MB , 224x240 , 1608608621350.gif )

 No.6724[View All]

This thread is only for feedback related to technical issues(bug reports, suggestions). Otherwise use >>>/leftypol/30356
Public Repo: https://github.com/towards-a-new-leftypol/leftypol_lainchan
If you have any grievances you can make a PR.

Mobile Support: https://github.com/PietroCarrara/Clover/releases/latest
Thread For Mobile Feedback: >>>/tech/6316

Onion Link: http://wz6bnwwtwckltvkvji6vvgmjrfspr3lstz66rusvtczhsgvwdcixgbyd.onion
Cytube: https://tv.leftypol.org/
Matrix: https://matrix.to/#/#Leftypol:matrix.org
Once you enter, consider joining the lefty technology room.

We are currently working on improvements to the site, subject to the need of the tech team to sleep and go to their day jobs. If you need more immediate feedback please join the matrix room[s] and ask around. Feel free to leave comments, concerns, and suggestions about the tech side of the site here and we will try to get to it as soon as possible

Archived thread:
>>>/leftypol_archive/903
121 posts and 33 image replies omitted. Click reply to view.
>>

 No.9808

File: 1625408005880.jpg ( 1.84 MB , 1497x2500 , 1128b1276672288a8725beaf4d….jpg )

>>9797
>One of the devs here, I've got a bit of spare time to solve some of these on the main site now that more critical changes are resolved.
Thanks for all your hard work.

>Thanks for compiling and sharing these with everyone.

No problem. The last list for the backend is in >>6841. The backend-relevant updates since that list:
+ code double escaping >>6933
+ issue-125-patch.txt >>7071
+ more iCCP profiles >>7107
+ embed in quick reply >>7392
+ sticky overboard catalog sort >>9485
>>

 No.9816

please pay attention to meeeeeeee
>>

 No.9820

Is it just me or are all the new image thumbnails broken over the last day or so?
>>

 No.9823

>>9820
Oh, I see what happened… Whose cocksucking idea was it to start making all thumbnails in Google's gay webp format?
>>

 No.9824

>>9823
What browser are you using that can't handle them, mobile app?
>>

 No.9825

>>9824
An older version of Palemoon. It's not easy for me to upgrade at the moment.
>>

 No.9828

>>9825
Now I'm curious, you must be on a five+ year old version. Is there a breaking change? Increased requirements? Excessive customization?
>>

 No.9829

>>9828
They adopted some new library versions a few months ago that aren't supported on *buntu 16.04. The PPA maintainer seems to have given up supporting that version and it doesn't seem like this will be easy to fix without a full system upgrade (a much more complicated problem for me).
>>

 No.9830

File: 1625436363651.png ( 15.78 KB , 729x90 , ooboontoo.png )

>>9829
>a few
I wouldn't call over 260 months a few, v26 introduced support. 16.04 LTS is EOL, so I suspect an OS upgrade is increasingly inevitable when things start breaking. Have you tried a live USB on the newer LTS versions?
>>

 No.9831

>>9830
lol typo with the months, meant 60
>>

 No.9836

File: 1625443500796.jpg ( 1.67 MB , 1552x2500 , 38dce130c3f5aff33b2a66f4fc….jpg )

To fix >>>/meta/7789 stripped file sizes for the current strip_exif+use_exiftool case:
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/e0ff3ea33ba2c81acdeb6bbc1b72ecd15a734be2/post.php#L1094
if($error = shell_exec_error('exiftool -overwrite_original -ignoreMinorErrors -q -q -all= ' .
    escapeshellarg($file['tmp_name']))) {
    error(_('Could not strip EXIF metadata!'), null, $error);
} else {
    clearstatcache(true, $file['tmp_name']);
    if (($newfilesize = filesize($file['tmp_name'])) !== false)
        $file['size'] = $newfilesize;
}

More generally, operations that modify an uploaded file should reread its size.

https://www.php.net/manual/en/function.filesize.php
https://www.php.net/manual/en/function.clearstatcache.php
>>

 No.9851

>>9830
>v26 introduced support
Oh? I'm on v28.15 and webp rendering is broken.
>>

 No.9854

Maybe add some escaping >>>/leftypol_archive/1499 to #289 for >>>/meta/7808.
>>

 No.9874

File: 1625529717281.png ( 476.67 KB , 1234x705 , ClipboardImage.png )

>>9851
Huh, that's weird then, my mistake. There have been no WebP fixes since 28.15 in updates, and support was introduced in 26.
I downloaded the 29.2.1 binary for 16.04 *ubuntu and it works, but I realize that is different.
Do either of these work?
https://developers.google.com/speed/webp/gallery1
https://developers.google.com/speed/webp/gallery2
(If you don't want to touch Google, you can search for some in https://commons.wikimedia.org/w/index.php?search=webp instead)
>>

 No.9891

>>9874
If you don't want to or can't fix the webp thumbnails, go to Options (top right) and add this script to User JS to replace the thumbnails with the source image.

ext = ["png","jpg", "jpeg"];
$('.file').each(function(file){
   children = this.childNodes;
   if (this.tagName == 'DIV'){
   link=this.childNodes[1].href;
   if (ext.includes(link.split('.').pop())){
      this.getElementsByClassName('post-image')[0].src = link;
   }}
});


(If someone wants to critique this skiddie hack, please do.)
>>

 No.9952

saving as original filename suddenly doesn't work
tried two browsers on both desktop and mobile
>>

 No.9960

Any chance kuroba can work with Orbot?
>>

 No.9965

>>9952
Thanks for reporting.
We did a change last week that deferred JS loading, which broke a few features (hopefully fixed this weekend).
At the same time, I replaced the download with filename funciton with one that didn't need Javascript, but the way I did it was flawed and lead to a security issue so we quickly removed it.
So we're currently running the deferred one that appears to be broken until enough devs are online to push the new changes.
>>

 No.10011

New update. [code­] tags double-encoding should be fixed.

<test> && "test"
>>

 No.10013

Javascript is fucked, backlinks don't work, the autoupdate and the [Watch Thread] appear twice.
>>

 No.10014

>>10013
The dev team is aware and a fix should be deployed soon.
>>

 No.10015

File: 1626019078747.png ( 19.33 KB , 488x367 , Screenshot_2021-07-11_17-5….png )

>>10014
Also whatever the fuck is going on here
>>

 No.10016

>>10015
Yeah, that was trippy. On the dev env I got a quad one once.
Issue should now be resolved.
>>

 No.10018

>>9891
Here's a better version:
[code]
$('div.file a').each(function(index){
let ext = ["png","jpg", "jpeg"];
let file = $(this);
let fullSize = file.prop("href");
if (ext.includes(fullSize.split('.').pop())){
file.find('img').prop("src", fullSize);
}
});
[\code]
the indentation is fucked.
>>

 No.10079

File: 1626124420264.png ( 17.04 KB , 317x398 , Screenshot_2021-07-12_23-1….png )

>>10016
Still happens if you open the thread to reply, like using this link: https://leftypol.org/tech/res/6724.html#q10016
>>

 No.10082

>>9986
wtf it does work, nvm
>>

 No.10101

File: 1626170899444.txt ( 6.83 KB , userjs.txt )

Trimmed Options -> User JS >>9796 for the recent backend changes.
① catalog links in div.boardlist >>9483
② thread stats and Unique IPs >>6744
③ individual post hiding >>6753
④ batch loop/once WebM setting >>6819
⑤ top/bottom navlinks in the top bar >>6835
⑥ generic file thumbs in catalog >>6843
⑦ catalog link above OP >>6916
>>

 No.10109

const callonce_factory = target => {
  let   called = false
  const once   = (...args) => {
    if (!called) {
      called = true
      return target (...args)
    }
  }
  return once
}

const init_file_selector_once = callonce_factory (init_file_selector)

This way init_file_selector_once can be harmlessly and cheaply called any number of times, such as at $(document).ready and before show_quick_reply → clone, without losing any defer-like benefits for the most common case where there's no q fragment.
>>

 No.10226

>>6724
is there a way to automatically decline all legitimate interests cookies from all websites using firefox
>>

 No.10247

When the reply count drops and a recent version of the thread is available, the ids can be diffed:
>> Array.from (document.querySelectorAll ("div.post.reply")).map (e => e.getAttribute ('id').replace (/^reply_/, '')).join (' ')
"6727 ..."

$ diffids () { diff <(echo "$1" | tr ' ' '\n') <(echo "$2" | tr ' ' '\n'); }
$ diffids "6727 ..." "6727 ..."
140d139
< 9986
151a151
> 10226

In this case the logs https://leftypol.org/log.php?board=tech suggest 9986 was probably in "Deleted all posts by IP address".
>>

 No.10389

File: 1626955991857.jpg ( 1.7 MB , 1493x2500 , 04c5e4db7974bb4ced191f0085….jpg )

Duplicate scripts:
>> console.log (Object.entries (Array.from (document.getElementsByTagName ("script")).filter (e => e.hasAttribute ("src")).map (e => e.getAttribute ("src")).reduce ((acc, name, idx) => {
  if (name in acc) {
    acc [name].push (idx)
  } else {
    acc [name] = [idx]
  }
  return acc
}, {})).filter (([name, indices]) => indices.length > 1).sort ((a, b) => a [1] [0] - b [1] [0]).map (([name, indices]) => name + ' ' + indices.toString ()).join ('\n'))

/js/jquery.min.js 1,3
/js/inline-expanding.js 2,5

The source of the problem is this duplication:
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/inc/config.php#L1039
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/inc/instance-config.php#L375

While two jquery.min only slow page loads, the two inline-expanding cause double registration of listeners and duplicate options gui spans.
>>

 No.10393

https://github.com/towards-a-new-leftypol/leftypol_lainchan/issues/326
> Multiple features in the Options dialog appear to be broken #326
> The first three options appear to have no effect and do not store a value when activated.
> Show relative time

After the page has loaded with scripts enabled the inspector can be used to verify that '#show-relative-time>input' has no listener. The listener is added in:
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/js/local-time.js#L91
> $('#show-relative-time>input').on('change', function() {

Setting a breakpoint on that line shows that $('#show-relative-time>input') is empty, so the listener is added to nothing. One way to fix this is to retrieve the input from the options tab instead of the document:
< Options.get_tab ('general').content.find ('#show-relative-time>input').on('change', function() {

I don't know whether this is the only fix needed for js/local-time.js, that needs to be retested after the listener is in place. A similar consideration applies to every script that has been moved from onready to $(document).ready and attempts to retrieve options gui elements after an Options.extend_tab or equivalent call.

https://github.com/towards-a-new-leftypol/leftypol_lainchan/commit/88f6088a429fb73d12805377b43c6b567d03a5db
> fix Relative Time and Image Throttler
> Author: marktaiwan <[email protected]>
> Date: Fri Jan 23 00:03:37 2015 +0800
> marktaiwan authored and czaks committed May 5, 2016
>>

 No.10407

The reason $('#show-relative-time>input') is empty >>10393 is that js/options.js adds its gui to the document at $(document).ready
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/js/options.js#L105
but it's placed after some scripts that add options in $config['additional_javascript']
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/inc/instance-config.php#L393

The only reason js/local-time.js and its friends even find a general tab is that js/options/general.js adds it at the time of head:
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/js/options/general.js#L15
>>

 No.10414

https://github.com/towards-a-new-leftypol/leftypol_lainchan/issues/326
> Number of simultaneous image downloads (0 to disable):

Besides being run >>10389 twice, js/inline-expanding.js has the same no listener issue >>10393 because $('#inline-expand-max input') is empty.
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/5faa622303f7a3d9568a7c89728c3095a664b5c7/js/inline-expanding.js#L196

One fix is:
< Options.get_tab ('general').content.find ('#inline-expand-max input')
>>

 No.10420

File: 1627085901011.jpg ( 589.83 KB , 720x1080 , 9a51c2ff7b9880dbcfd1af649e….jpg )

When testing with scripts enabled, cloudflare's injected malware can be avoided by blocking leftypol URLs that contain "/cdn-cgi/".
>>

 No.10421

Thanks for all your help with this, I'm going to start making pull requests over the next few days.

>>10109
Would you consider this an ideal solution for us to implement, or a simple and effective bandaid for our short-sighted $(document).ready changes? Is it sane for us to be in this situation where it is called multiple times?
>>

 No.10429

>>10421
That is certainly only a quickfix, but a very cheap one because after the first call it will immediately return on a boolean test. A more pleasing long-term solution would be for the rememberStuff chain not to trigger 'cite' that early and instead cause a delayed 'cite' to fire at the time of $(document).ready, but this way great care must be taken with the order in which things run.

Also, I see that PR #330 has been approved and its commit merged but the duplicate scripts are still being served as I'm writing this.
>>

 No.10430

>>10429
>>10429
We're testing bb. One sec.
>>

 No.10432

File: 1627126740264.png ( 9.16 KB , 454x122 , ClipboardImage.png )

>>10429
>Also, I see that PR #330 has been approved and its commit merged but the duplicate scripts are still being served as I'm writing this.
Yep, merge happens before final testing, before they go live.
I can confirm it removes the duplication in the Option form.

>That is certainly only a quickfix [snip]

I'm happy with adding that, it's safe and effective. I might aim for the better solution once we've finished fixing the fallout from our speed-improvement changes and downstreaming the years of vichan changes that lainchan ignored.
>>

 No.10441

File: 1627172785657.jpg ( 566.96 KB , 1605x2500 , 0f92b8330c700a6981361b0b7d….jpg )

https://github.com/towards-a-new-leftypol/leftypol_lainchan/issues/318
> Syncronize spoiler button state on quick reply and main post form #318

While looking into this the synchronization section of js/quick-reply.js turns out to be quite peculiar.
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L296
Every time the quick reply form is manually closed and reopened, new listeners are installed on the forms and the window, but the old listeners are never cleared in the .close-btn click handler.
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L348

The effect can be observed on elements of the top form, such as the textarea, for which the inspector shows an ever increasing number of listeners. These keep the closed quick reply forms reachable and therefore uncollectable, leaking memory. They also transfer the top form text to each closed quick reply form, and after a sufficient number typing becomes sluggish. The .close-btn click handler should deregister all listeners that only served the closed quick reply form.

Keeping in mind that the current way of doing things leaks memory with abandon, the spoiler checkboxes can be synced by extending the synchronization section:
const cbsync = (form1, form2, name) => {
  const sel = 'input[type="checkbox"][name="' + name + '"]'
  const cb1 = form1.find (sel)
  const cb2 = form2.find (sel)
  cb1.on ('change', () => {
    cb2.prop ('checked', cb1.prop ('checked'))
  })
  cb2.on ('change', () => {
    cb1.prop ('checked', cb2.prop ('checked'))
  })
}

cbsync ($origPostForm, $postForm, 'spoiler')
>>

 No.10444

>>10441
>Every time the quick reply form is manually closed and reopened, new listeners are installed on the forms and the window, but the old listeners are never cleared in the .close-btn click handler.
It looks adding these two .off() lines fixes it correctly:
		$postForm.find('th .close-btn').click(function() {
			// Remove origPostForm listeners
			$origPostForm.find('textarea[name="body"]').off('change input propertychange focus');
			$origPostForm.find('input[type="text"],select').off('change input propertychange');
>>

 No.10455

>>10444
That removes every listener for those events from those elements, not just those added by js/quick-reply.js. Currently there are no others, but in the future that might remove some other script's listeners. To avoid this the events can be namespaced with something like .quickreply in both on and off calls.
https://api.jquery.com/on/#event-names

> > new listeners are installed on the forms and the window >>10441

This scroll handler on the window
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L363
needs to be deregistered as well on .close-btn click because it keeps the old $postForm reachable and therefore uncollectable.

This stylesheet handler on the window
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L375
needs the same treatment. Alternatively it could be added exactly once >>10109, since it doesn't depend on the $postForm, but in that case it must be moved out of show_quick_reply.

This 'quick-reply' handler on the window
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L414
is added anew on every floating_link call, which occurs on every .close-btn click. It needs to be added at most once. >>10109
>>

 No.10478

Here's a cleanup_jquery_listeners utility function:
const cleanup_jquery_listeners = cleanupspec => {
  // cleanupspec is a list of triples of
  // [jquery sets, selector or null, event string]
  // example: [
  //   [[$origPostForm, $postForm], 'input[type="text"],select', '.quickreply'],
  //   [[$(window)], null, 'scroll.quickreply']
  // ]
  for (const [sets, sel, events] of cleanupspec) {
    for (let oneset of sets) {
      if (sel != null) {
        oneset = oneset.find (sel)
      }
      oneset.off (events)
    }
  }
}

Then in .close-btn click:
const spec = [
  [[$origPostForm, $postForm], 'textarea[name="body"]', '.quickreply'],
  [[$origPostForm, $postForm], 'input[type="text"],select', '.quickreply'],
  [[$(window)], null, 'scroll.quickreply'],
  [[$postForm], 'th .close-btn', 'click.quickreply'],
]

cleanup_jquery_listeners (spec)

The $postForm is cleaned up for completeness. When spoilers are synced >>10441 they can be added to the spec list in the obvious way. All on calls need .quickreply on their events. The click, focus and scroll calls become .on('click.quickreply', …) and equivalent. The exceptions are the last two listeners of >>10455 which can be dealt with using callonce_factory >>10109.
>>

 No.10486

>>10109
Should the callonce factory be placed in main.js?
>>

 No.10487

For the last two listeners of >>10455, inside the outermost function of js/quick-reply.js:
const stylesheet_handler_once = callonce_factory (() => {
  $(window).on('stylesheet', function() {
    do_css();
    if ($('link#stylesheet').attr('href')) {
      $('link#stylesheet')[0].onload = do_css;
    }
  });
})

const qr_handler_once = callonce_factory (() => {
  $(window).on('quick-reply', function() {
    $('.quick-reply-btn').remove();
  });
})

Then replace
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L375
with
< stylesheet_handler_once ()
and replace
https://github.com/towards-a-new-leftypol/leftypol_lainchan/blob/dcf92dfef5f5ab900dc879d7dc4c3f04fab0aed8/js/quick-reply.js#L414
with
< qr_handler_once ()

>>10486
Either templates/main.js or a new js/functools.js, entirely at the techs' option.
>>

 No.10493

File: 1627341198437.jpg ( 5.79 MB , 3002x4988 , ebe6d32cbc673dba0151ea29f3….jpg )

Temporary fix for spoiler sync #318 in Options -> User JS until the backend is fixed >>10441.
(() => {
  const cbsync = (form1, form2, name) => {
    const sel = 'input[type="checkbox"][name="' + name + '"]'
    const cb1 = form1.find (sel)
    const cb2 = form2.find (sel)
    cb1.on ('change', () => {
      cb2.prop ('checked', cb1.prop ('checked'))
    })
    cb2.on ('change', () => {
      cb1.prop ('checked', cb2.prop ('checked'))
    })
  }
  const spoilersync = () => {
    const ftop   = $('form[name="post"]:first')
    const fquick = $('#quick-reply')
    if ((ftop.length != 1) || (fquick.length != 1)) { return; }
    if (fquick.attr ('data-userjs-spoilersync') == 'spoilersync') { return; }
    cbsync (ftop, fquick, 'spoiler')
    fquick.attr ('data-userjs-spoilersync', 'spoilersync')
  }
  spoilersync ()
  $(window).on('quick-reply', spoilersync)
})()
>>

 No.10494

Temporary fix for >>10079 in Options -> User JS until the backend is fixed >>10104 >>10109.
$('#quick-reply input[name="file"]').remove ()
>>

 No.10495

File: 1627344936998.txt ( 7.71 KB , userjs.txt )

Updated Options -> User JS >>10101 with the current fixes.
① catalog links in div.boardlist >>9483
② thread stats and Unique IPs >>6744
③ individual post hiding >>6753
④ batch loop/once WebM setting >>6819
⑤ top/bottom navlinks in the top bar >>6835
⑥ generic file thumbs in catalog >>6843
⑦ catalog link above OP >>6916
⑧ quick reply spoiler sync >>10493
⑨ quick reply before init_file_selector >>10494

Unique IPs: 12

Debug

Array
(
[sql] => Array
(
[0] => Array
(
[query] => SET NAMES utf8mb4
[rows] => 0
[explain] =>
[time] => ~0.06ms
)

[1] => Array
(
[query] => SELECT `id`, `type`, `boards`, `password` FROM `mods` WHERE `username` = :username
[rows] => 1
[explain] =>
[time] => ~0.16ms
)

[2] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[3] => Array
(
[query] => DELETE FROM `boards` WHERE `uri` = :uri
[rows] => 1
[explain] =>
[time] => ~0.09ms
)

[4] => Array
(
[query] => INSERT INTO `modlogs` VALUES (:id, :ip, :board, :time, :text)
[rows] => 1
[explain] =>
[time] => ~0.2ms
)

[5] => Array
(
[query] => DROP TABLE IF EXISTS `posts_anime`
[rows] => 0
[explain] =>
[time] => ~28.13ms
)

[6] => Array
(
[query] => DELETE FROM `reports` WHERE `board` = :id
[rows] => 0
[explain] =>
[time] => ~0.06ms
)

[7] => Array
(
[query] => DELETE FROM `boards` WHERE `uri` = :uri
[rows] => 0
[explain] =>
[time] => ~0.04ms
)

[8] => Array
(
[query] => SELECT `board`, `post` FROM `cites` WHERE `target_board` = :board ORDER BY `board`
[rows] => 2447
[explain] =>
[time] => ~46.2ms
)

[9] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[10] => Array
(
[query] => SELECT * FROM `posts_b` WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[11] => Array
(
[query] => SELECT `thread`, `id` FROM `posts_b` WHERE `id` = 87957
[rows] => 1
[explain] =>
[time] => ~0.05ms
)

[12] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 0
[explain] =>
[time] => ~0.04ms
)

[13] => Array
(
[query] => UPDATE `posts_b` SET `body` = :body WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[14] => Array
(
[query] => SELECT `id` FROM `posts_b` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC
[rows] => 360
[explain] =>
[time] => ~1.13ms
)

[15] => Array
(
[query] => SELECT *,'b' as board FROM `posts_b` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`
[rows] => 504
[explain] =>
[time] => ~2.4ms
)

[16] => Array
(
[query] => DELETE FROM `antispam` WHERE `expires` < UNIX_TIMESTAMP()
[rows] => 0
[explain] =>
[time] => ~0.07ms
)

[17] => Array
(
[query] => UPDATE `antispam` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL
[rows] => 1
[explain] =>
[time] => ~0.1ms
)

[18] => Array
(
[query] => INSERT INTO `antispam` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[19] => Array
(
[query] => SELECT * FROM `boards` ORDER BY `uri`
[rows] => 26
[explain] =>
[time] => ~0.12ms
)

[20] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[21] => Array
(
[query] => SELECT * FROM `posts_hobby` WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[22] => Array
(
[query] => SELECT `thread`, `id` FROM `posts_hobby` WHERE `id` = 14627
[rows] => 1
[explain] =>
[time] => ~0.05ms
)

[23] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 0
[explain] =>
[time] => ~0.05ms
)

[24] => Array
(
[query] => UPDATE `posts_hobby` SET `body` = :body WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[25] => Array
(
[query] => SELECT `id` FROM `posts_hobby` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC
[rows] => 360
[explain] =>
[time] => ~1.24ms
)

[26] => Array
(
[query] => SELECT *,'hobby' as board FROM `posts_hobby` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`
[rows] => 22
[explain] =>
[time] => ~0.25ms
)

[27] => Array
(
[query] => UPDATE `antispam` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL
[rows] => 1
[explain] =>
[time] => ~0.19ms
)

[28] => Array
(
[query] => INSERT INTO `antispam` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[29] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[30] => Array
(
[query] => SELECT * FROM `posts_leftypol` WHERE `id` = :id
[rows] => 0
[explain] =>
[time] => ~0.07ms
)

[31] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[32] => Array
(
[query] => SELECT * FROM `posts_leftypol_archive` WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[33] => Array
(
[query] => SELECT `thread`, `id` FROM `posts_leftypol_archive` WHERE `id` = 1256
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[34] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 0
[explain] =>
[time] => ~0.05ms
)

[35] => Array
(
[query] => UPDATE `posts_leftypol_archive` SET `body` = :body WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[36] => Array
(
[query] => SELECT `id` FROM `posts_leftypol_archive` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC
[rows] => 27
[explain] =>
[time] => ~0.17ms
)

[37] => Array
(
[query] => SELECT *,'leftypol_archive' as board FROM `posts_leftypol_archive` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`
[rows] => 937
[explain] =>
[time] => ~4.11ms
)

[38] => Array
(
[query] => UPDATE `antispam` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL
[rows] => 1
[explain] =>
[time] => ~0.22ms
)

[39] => Array
(
[query] => INSERT INTO `antispam` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[40] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.1ms
)

[41] => Array
(
[query] => SELECT * FROM `posts_meta` WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.12ms
)

[42] => Array
(
[query] => SELECT `thread`, `id` FROM `posts_meta` WHERE `id` = 8068
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[43] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 0
[explain] =>
[time] => ~0.06ms
)

[44] => Array
(
[query] => UPDATE `posts_meta` SET `body` = :body WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.12ms
)

[45] => Array
(
[query] => SELECT `id` FROM `posts_meta` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC
[rows] => 187
[explain] =>
[time] => ~0.72ms
)

[46] => Array
(
[query] => SELECT *,'meta' as board FROM `posts_meta` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`
[rows] => 6
[explain] =>
[time] => ~0.17ms
)

[47] => Array
(
[query] => UPDATE `antispam` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL
[rows] => 1
[explain] =>
[time] => ~0.23ms
)

[48] => Array
(
[query] => INSERT INTO `antispam` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[49] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 1
[explain] =>
[time] => ~0.06ms
)

[50] => Array
(
[query] => SELECT * FROM `posts_tech` WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

[51] => Array
(
[query] => SELECT `thread`, `id` FROM `posts_tech` WHERE `id` = 7390
[rows] => 1
[explain] =>
[time] => ~0.05ms
)

[52] => Array
(
[query] => SELECT * FROM `boards` WHERE `uri` = :uri LIMIT 1
[rows] => 0
[explain] =>
[time] => ~0.04ms
)

[53] => Array
(
[query] => UPDATE `posts_tech` SET `body` = :body WHERE `id` = :id
[rows] => 1
[explain] =>
[time] => ~0.08ms
)

[54] => Array
(
[query] => SELECT `id` FROM `posts_tech` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC
[rows] => 360
[explain] =>
[time] => ~1.14ms
)

[55] => Array
(
[query] => SELECT *,'tech' as board FROM `posts_tech` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`
[rows] => 172
[explain] =>
[time] => ~0.96ms
)

[56] => Array
(
[query] => UPDATE `antispam` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL
[rows] => 1
[explain] =>
[time] => ~0.12ms
)

[57] => Array
(
[query] => INSERT INTO `antispam` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)
[rows] => 1
[explain] =>
[time] => ~0.07ms
)

)

[exec] => Array
(
)

[purge] => Array
(
)

[cached] => Array
(
[0] => board_anime (miss)
[1] => board_anime (set)
[2] => board_anime (deleted)
[3] => all_boards (deleted)
[4] => board_b (miss)
[5] => board_b (set)
[6] => board_anime (miss)
[7] => thread_index_b_55248 (deleted)
[8] => thread_b_55248 (deleted)
[9] => all_boards (miss)
[10] => all_boards (set)
[11] => all_boards (hit)
[12] => board_hobby (miss)
[13] => board_hobby (set)
[14] => board_anime (miss)
[15] => thread_index_hobby_14598 (deleted)
[16] => thread_hobby_14598 (deleted)
[17] => all_boards (hit)
[18] => board_leftypol (miss)
[19] => board_leftypol (set)
[20] => board_leftypol_archive (miss)
[21] => board_leftypol_archive (set)
[22] => board_anime (miss)
[23] => thread_index_leftypol_archive_903 (deleted)
[24] => thread_leftypol_archive_903 (deleted)
[25] => all_boards (hit)
[26] => all_boards (hit)
[27] => board_meta (miss)
[28] => board_meta (set)
[29] => board_anime (miss)
[30] => thread_index_meta_8067 (deleted)
[31] => thread_meta_8067 (deleted)
[32] => all_boards (hit)
[33] => board_tech (miss)
[34] => board_tech (set)
[35] => board_anime (miss)
[36] => thread_index_tech_6724 (deleted)
[37] => thread_tech_6724 (deleted)
[38] => all_boards (hit)
[39] => all_boards (hit)
)

[write] => Array
(
[0] => b/res/55248.json: 243478 bytes
[1] => b/res/55248+50.html: 85043 bytes
[2] => b/res/55248.html: 577440 bytes
[3] => hobby/res/14598.json: 9908 bytes
[4] => hobby/res/14598.html: 55282 bytes
[5] => leftypol_archive/res/903.json: 585211 bytes
[6] => leftypol_archive/res/903+50.html: 120526 bytes
[7] => leftypol_archive/res/903.html: 1211157 bytes
[8] => meta/res/8067.json: 3824 bytes
[9] => meta/res/8067.html: 46801 bytes
[10] => tech/res/6724.json: 142312 bytes
)

[time] => Array
(
[db_queries] => ~90.56ms
[exec] => ~0ms
[db_connect] => ~0.26ms
[parse_mod_req] => ~0.96ms
[total] => ~280.63ms
[init] => ~0.64ms
)

[mod_page] => Array
(
[req] => /edit/anime
[match] => !^/edit/(?P<board>[0-9a-zA-Z$_\x{0080}-\x{FFFF}]{1,58})(?:&[^&=]+=[^&]*)*$!u
[handler] => edit_board
)

[included] => Array
(
[0] => /srv/http/lainchan.leftypol.org/mod.php
[1] => /srv/http/lainchan.leftypol.org/inc/functions.php
[2] => /srv/http/lainchan.leftypol.org/inc/error.php
[3] => /srv/http/lainchan.leftypol.org/inc/cache.php
[4] => /srv/http/lainchan.leftypol.org/inc/display.php
[5] => /srv/http/lainchan.leftypol.org/inc/template.php
[6] => /srv/http/lainchan.leftypol.org/vendor/autoload.php
[7] => /srv/http/lainchan.leftypol.org/vendor/composer/autoload_real.php
[8] => /srv/http/lainchan.leftypol.org/vendor/composer/platform_check.php
[9] => /srv/http/lainchan.leftypol.org/vendor/composer/ClassLoader.php
[10] => /srv/http/lainchan.leftypol.org/vendor/composer/autoload_static.php
[11] => /srv/http/lainchan.leftypol.org/vendor/ralouphie/getallheaders/src/getallheaders.php
[12] => /srv/http/lainchan.leftypol.org/vendor/symfony/polyfill-ctype/bootstrap.php
[13] => /srv/http/lainchan.leftypol.org/vendor/symfony/polyfill-ctype/bootstrap80.php
[14] => /srv/http/lainchan.leftypol.org/vendor/symfony/polyfill-mbstring/bootstrap.php
[15] => /srv/http/lainchan.leftypol.org/vendor/symfony/polyfill-mbstring/bootstrap80.php
[16] => /srv/http/lainchan.leftypol.org/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php
[17] => /srv/http/lainchan.leftypol.org/vendor/symfony/deprecation-contracts/function.php
[18] => /srv/http/lainchan.leftypol.org/vendor/guzzlehttp/guzzle/src/functions_include.php
[19] => /srv/http/lainchan.leftypol.org/vendor/guzzlehttp/guzzle/src/functions.php
[20] => /srv/http/lainchan.leftypol.org/vendor/php81_bc/strftime/src/php-8.1-strftime.php
[21] => /srv/http/lainchan.leftypol.org/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php
[22] => /srv/http/lainchan.leftypol.org/vendor/ramsey/uuid/src/functions.php
[23] => /srv/http/lainchan.leftypol.org/inc/lib/twig/Extensions/Tinyboard.php
[24] => /srv/http/lainchan.leftypol.org/inc/anti-bot.php
[25] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/AbstractExtension.php
[26] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/ExtensionInterface.php
[27] => /srv/http/lainchan.leftypol.org/inc/database.php
[28] => /srv/http/lainchan.leftypol.org/inc/events.php
[29] => /srv/http/lainchan.leftypol.org/inc/api.php
[30] => /srv/http/lainchan.leftypol.org/inc/mod/auth.php
[31] => /srv/http/lainchan.leftypol.org/inc/lock.php
[32] => /srv/http/lainchan.leftypol.org/inc/queue.php
[33] => /srv/http/lainchan.leftypol.org/inc/polyfill.php
[34] => /srv/http/lainchan.leftypol.org/inc/spamnoticer.php
[35] => /srv/http/lainchan.leftypol.org/inc/config.php
[36] => /srv/http/lainchan.leftypol.org/inc/instance-config.php
[37] => /srv/http/lainchan.leftypol.org/inc/lib/webm/posthandler.php
[38] => /srv/http/lainchan.leftypol.org/inc/bans.php
[39] => /srv/http/lainchan.leftypol.org/inc/mod/pages.php
[40] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Loader/FilesystemLoader.php
[41] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Loader/LoaderInterface.php
[42] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Environment.php
[43] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Cache/FilesystemCache.php
[44] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Cache/CacheInterface.php
[45] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/ExtensionSet.php
[46] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/StagingExtension.php
[47] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/CoreExtension.php
[48] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/EscaperExtension.php
[49] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Extension/OptimizerExtension.php
[50] => /srv/http/lainchan.leftypol.org/vendor/phpmyadmin/twig-i18n-extension/src/I18nExtension.php
[51] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/TemplateWrapper.php
[52] => /srv/http/lainchan.leftypol.org/templates/cache/a3/a349dd5adf42fb98d821e86e79f19b6e.php
[53] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Template.php
[54] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Source.php
[55] => /srv/http/lainchan.leftypol.org/templates/cache/30/30cf3c3254e7d70cc2ea759f249baa87.php
[56] => /srv/http/lainchan.leftypol.org/templates/cache/03/037a63e62426e083d9893de2e7b75f7c.php
[57] => /srv/http/lainchan.leftypol.org/templates/cache/14/1464b161718c1f1f4600d5ea3bf964d8.php
[58] => /srv/http/lainchan.leftypol.org/templates/cache/77/77798d3e243a06b0275529ae53cfc293.php
[59] => /srv/http/lainchan.leftypol.org/templates/cache/af/afda499651cb27bbb1c0f80c7ececc7f.php
[60] => /srv/http/lainchan.leftypol.org/templates/cache/63/63e2f55f4778b24f3d906edfcfb40b0c.php
[61] => /srv/http/lainchan.leftypol.org/templates/cache/44/447678fd0ba13a7fa5d29efb3d3c6c01.php
[62] => /srv/http/lainchan.leftypol.org/templates/cache/e1/e1acea0fe68fda66d360d7ea209d25dc.php
[63] => /srv/http/lainchan.leftypol.org/templates/cache/17/173c05d9ef115a3ab34cfd1cc2d9790c.php
[64] => /srv/http/lainchan.leftypol.org/templates/cache/62/6205a66eb74e5963291455ad228d41e2.php
[65] => /srv/http/lainchan.leftypol.org/templates/cache/03/03c0c9646529382b5f5ab1072ff1587a.php
[66] => /srv/http/lainchan.leftypol.org/vendor/twig/twig/src/Markup.php
[67] => /srv/http/lainchan.leftypol.org/templates/cache/bc/bce5d2559ea6421643349448a394adde.php
[68] => /srv/http/lainchan.leftypol.org/templates/cache/b8/b85ef7a634005d864d10a8517751268b.php
[69] => /srv/http/lainchan.leftypol.org/templates/cache/4c/4c0ad983c5aa9a27e5a7fa178601e11e.php
[70] => /srv/http/lainchan.leftypol.org/templates/cache/bc/bc9954619059f3c44feca27258771196.php
[71] => /srv/http/lainchan.leftypol.org/templates/cache/77/77d482fbc4b1fc57634870681c6c7746.php
[72] => /srv/http/lainchan.leftypol.org/templates/cache/c3/c318486b9f8caf40ae06c606e0b581f4.php
[73] => /srv/http/lainchan.leftypol.org/templates/cache/84/8487698a77b07a111ef4f4aa7f65239d.php
[74] => /srv/http/lainchan.leftypol.org/leftypol/config.php
)

[memory] => 8 MiB
)
[Return][Go to top] [Catalog] | [Home][Post a Reply]
Delete Post [ ]
[ overboard / sfw / alt / cytube] [ b ]