เทคนิคลดโฆษณาแบบวิดีโอที่แทรกใน Youtube

หลายคนคงเบื่อกับโฆษณาที่ชอบขึ้นมาแทรกตอนเวลาเราดูคลิปวิดีโอต่าง ๆ บน Youtube บางครั้งอาจจะขึ้นเวลาฟังเพลงแบบ Playlist ต่าง ๆ ทำให้ต้องเสียเวลามากดข้าม หรือรู้สึกหงุดหงิด หลายคนก็จะใช้ Adblock (หาวิธีเอาเองไม่ขอลงลิงค์นะครับ) ในการปิดโฆษณาต่าง ๆ แต่จากบางที่บอกว่าการใช้ Adblock อาจจะทำให้เจอโฆษณาแบบข้ามไม่ได้แทน (ที่มา)

หลังจากผมพยายามเลี่ยงการใช้ Adblock กับหลายเว็บ เพื่อให้ผู้สร้างสรรค์เนื้อหาสามารถสร้างรายได้ได้ตามปกติ แต่ก็ยังไม่ชอบโฆษณาแบบวิดีโออยู่ดี ก็ได้ลองปรับไปเรื่อย ๆ จนพบวิธีที่ทำให้โฆษณาแบบวิดีโอน้อยลง เหลือแต่โฆษณาแบบแบนเนอร์เล็ก ๆ บนวิดีโอแทน โดยจะแสดงประมาณนี้แทน
ตัวอย่างโฆษณาแบบแบนเนอร์บน Youtube

ขั้นตอนการทำ

  1. เราต้องเข้าสู่ระบบใน Youtube ก่อน ถ้าไม่มีปัญชีก็สร้างซะ
  2. ให้เราเข้าไปที่นี่ https://www.google.com/settings/u/0/ads/authenticated
  3. เราจะเจอหน้าจอจัดการโฆษณาที่เราสนใจ ให้เรากด View 268 More Interests (ตัวเลขอาจจะเปลี่ยนไป ไม่เหมือนกันในแต่ละคน)
    หน้าจอจัดการความสนใจโฆษณา
  4. หลังจากเรากดแล้ว ให้เรากดทำเครื่องหมายถูกออก ให้เหลือเฉพาะอันที่เราสนใจจริง ๆ เท่านั้น เพื่อลดโฆษณา ก็อยากให้ทำแบบนั้น แต่ให้เราจำไว้ครับว่าโฆษณาหมวดไหนมีวิดีโอเยอะ ๆ ก็ให้เอาออกไปด้วย เช่น Snack Foods, Perfumes & Fragrances, Beauty & Fitness เป็นต้น ซึ่งเราจะเอาอันไหนออก ต้องพิจารณาเอง โดยเราควรจะเลือกเฉพะาหมวดที่มีโฆษณาแบบแบนเนอร์อย่างเดียว เช่นพวก Social Network เป็นต้น และเอาหมวดที่มีโฆษณาแบบวิดีโอออกให้เยอะที่สุด และห้ามเอาออกหมด หรือเหลือน้อย เพราะถ้าเอาออกหมด มันจะสุ่มจากสถานที่ปัจจุบันที่เราอยู่แทน ซึ่งโอกาศโดาโฆษณาแบบวิดีโอสูง อันนี้เป็นตัวอย่างที่ผมเลือก (ถ้าเลือกตามนี้ไม่ค่อยเจอแบบวิดีโอ นาน ๆ Udemy จะจัดโปรที)
    ตัวอย่างการหมวดเลือกโฆษณา
  5. หลังจากนั้นก็ไปลองเข้า Youtube แล้วดูว่ายังมีอยู่ไหม ลองปรับไปเรื่อย ๆ ครับ จะเลี่ยงได้เยอะพอสมควร และหมั่นเข้ามาเช็คบ่อย ๆ บางที Youtube ก็แอบเพิ่มให้เราเองครับ

Cache ทุกคำแปลของ Visual Novel Reader

เป็นวิธีแก้ไข Visual Novel Reader ให้สามารถ Cache คำแปลต่างๆ ที่แปลจาก Google Translator หรือ Bing Translator ได้ โดยตัว Visual Novel Reader นี้เป็น Open Source แต่ไม่มี Source Version Control อย่างพวก SVN หรือ Git (จริงๆ เข้าใจว่ามันใช้ Hg นะ มันคืออะไรไม่รู้เห็นตอน Update และเข้าใจว่าไม่เปิด public) ทำให้ไม่สามารถ pull request ได้ (ถึงทำได้ ก็ไม่ทำ code กาก 55+)

เป้าหมายที่อยากทำคือบางครั้งกลับมาเล่นเกมส์ซ้ำมันแปลไม่ได้ หรืออยากไป route อื่น แต่ข้อความมันซ้ำ ก็ไม่รู้จะต้องไปแปลอีกทำไม บางครั้งเน็ตกากก็รอไปเถอะ โดยปกติตัว Visual Novel Reader จะ Cache ไว้ประมาณ 10-20 คำล่าสุดอยู่แล้ว แต่ถ้าปิดโปรแกรมหาย เลยต้องปรับมันสักหน่อย

ข้อควรระวัง

  1. ไม่รับประกันผล เพราะถ้ามีความรู้ Programming ระดับนึงจะเห็นว่า ผมไปทำให้มัน Clear cache ไม่ได้ เพราะผมไม่ให้มันทำ
  2. ถ้า Ram น้อย อาจจะตายได้ ผมไม่รู้เหมือนกันว่ามันกินเท่าไหร่ แต่ผมกำหนดให้เก็บเรื่อยๆ ไม่มี clear ไม่มีตัด
  3. ผมเขียนให้ตังเองใช้ ดังนั้นขอไม่อธิบายเยอะนะครับ

ขั้นตอนการทำ

แก้ไฟล์ดังต่อไปนี้

  • Library\Frameworks\Sakura\py\apps\browser\managers\_trman.py
  • Library\Frameworks\Sakura\py\apps\reader\managers\_trman.py

(ถ้าเดาจากชื่อ แก้แค่อันล่างก็พอ ก็ได้)

หา class TranslationCache แล้วแทนที่ด้วย code ดังต่อไปนี้

import sqlite3
import rc
class TranslationCache:
  def __init__(self, maxSize=10000, shrinkSize=9000):
    """
    @param  maxSize  max data size
    @param  shrinkSize  data to delete when oversize
    """
    self.maxSize = maxSize
    self.shrinkSize = shrinkSize
    # {unicode text:[unicode sub, long timestamp]}
    self.conn = sqlite3.connect(rc.DIR_APP_CACHE+'/cache.db')
    self.prepare()


  def clear(self):
    pass # i don't want to clear 


  def get(self, key): # unicode -> unicode
    c = self.conn.cursor()
    c.execute('select translate from translations where original = ? limit 1', (key ,))
    r = c.fetchone()
    if r != None:
      c.execute('update translations SET timestamp = ? where original = ?', (self._now(), key ,))
      self.conn.commit()
      c.close()
      return r[0]
    else:
      c.close()


  def update(self, key, value): # unicode, unicode ->
    c = self.conn.cursor()
    c.execute('select translate from translations where original = ? limit 1', (key ,))
    r = c.fetchone()
    if r == None:
      c.execute('insert into translations (original, translate, timestamp) values (?,?,?)', (key ,value, self._now(), ))
      self.conn.commit()

    c.close()
    return value


  def prepare(self):
    c = self.conn.cursor()
    try:
      c.execute('select * from translations limit 1')
    except:
      c.execute('CREATE TABLE translations (original TEXT PRIMARY KEY, translate TEXT, timestamp INTEGER)')
      self.conn.commit()

    c.close()


  @staticmethod
  def _now(): return long(time()) # -> long  msecs


  def _shrink(self):
    pass
ด้านล่างตรงนี้เป็นของเก่า ไม่ใช้แล้ว

เพิ่ม Code นี้ไปแถวๆส่วนที่เค้า import กัน

import rc

หา class TranslationCache แล้วแทนที่ด้วย code ดังต่อไปนี้

class TranslationCache:
  def __init__(self, maxSize=10000, shrinkSize=9000):
    """
    @param  maxSize  max data size
    @param  shrinkSize  data to delete when oversize
    """
    self.maxSize = maxSize
    self.shrinkSize = shrinkSize
    self.data = {} # {unicode text:[unicode sub, long timestamp]}
    self.load()

  def clear(self):
    if self.data:
      self.data ={} # i don't want to clear 
      self.load()

  def get(self, key): # unicode -> unicode
    t = self.data.get(key)
    if t:
      t[1] = self._now()
      self.save()
      return t[0]

  def update(self, key, value): # unicode, unicode ->
    self.data[key] = [value, self._now()]
    #if len(self.data) > self.maxSize:
    #  self._shrink()
    self.save()
    #return value

  def save(self):
    f = open(rc.DIR_APP_CACHE+'/cache.dict','w+')
    f.truncate()
    f.write(str(self.data))
    f.close()

  def load(self):
  	try:
  	  f = open(rc.DIR_APP_CACHE+'/cache.dict','r+')
  	  self.data = eval(f.read())
  	  f.close()
	except:
  	  self.data = {}

  @staticmethod
  def _now(): return long(time()) # -> long  msecs

  def _shrink(self):
    l = sorted(self.data.iteritems(), key=lambda it:it[1][1])
    self.data = {k:v for k,v in l[self.shrinkSize:]}

ปิด Visual Novel Reader เปิดใหม่ ก็ได้แล้ว ต่อไปมันก็จะ cache ตลอดแล้ว