text:
// this software is distributed under the MIT License (http://www.opensource.org/licenses/MIT):
//
// Copyright 2018-2020, CWI, TU Munich, FSU Jena
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// You can contact the authors via the FSST source repository : https://github.com/cwida/fsst
#include "libfsst.hpp"

inline uint64_t fsst_unaligned_load(u8 const* V) {
  uint64_t Ret;
  memcpy(&Ret, V, sizeof(uint64_t)); // compiler will generate efficient code (unaligned load, where possible)
  return Ret;
}

Symbol concat(Symbol a, Symbol b) {
   Symbol s;
   u32 length = a.length()+b.length();
   if (length > Symbol::maxLength) length = Symbol::maxLength;
   s.set_code_len(FSST_CODE_MASK, length);
   s.val.num = (b.val.num << (8*a.length())) | a.val.num;
   return s;
}

namespace std {
template <>
class hash<QSymbol> {
   public:
   size_t operator()(const QSymbol& q) const {
      uint64_t k = q.symbol.val.num;
      const uint64_t m = 0xc6a4a7935bd1e995;
      const int r = 47;
      uint64_t h = 0x8445d61a4e774912 ^ (8*m);
      k *= m;
      k ^= k >> r;
      k *= m;
      h ^= k;
      h *= m;
      h ^= h >> r;
      h *= m;
      h ^= h >> r;
      return h;
   }
};
}

bool isEscapeCode(u16 pos) { return pos < FSST_CODE_BASE; }

std::ostream& operator<<(std::ostream& out, const Symbol& s) {
   for (u32 i=0; i<s.length(); i++)
      out << s.val.str[i];
   return out;
}
static u64 iter = 0;

SymbolTable *buildSymbolTable(Counters& counters, vector<u8*> line, size_t len[], bool zeroTerminated=false) {
   SymbolTable *st = new SymbolTable(), *bestTable = new SymbolTable();
   int bestGain = (int) -FSST_SAMPLEMAXSZ; // worst case (everything exception)
   size_t sampleFrac = 128;

   // start by determining the terminator. We use the (lowest) most infrequent byte as terminator
   st->zeroTerminated = zeroTerminated;
   if (zeroTerminated) {
      st->terminator = 0; // except in case of zeroTerminated mode, then byte 0 is terminator regardless frequency
   } else {
      u16 byteHisto[256];
      memset(byteHisto, 0, sizeof(byteHisto));
      for(size_t i=0; i<line.size(); i++) {
         u8* cur = line[i];
         u8* end = cur + len[i];
         while(cur < end) byteHisto[*cur++]++;
      }
      u32 minSize = FSST_SAMPLEMAXSZ, i = st->terminator = 256;
      while(i-- > 0) {
         if (byteHisto[i] > minSize) continue;
         st->terminator = i;
         minSize = byteHisto[i];
      }
   }
   assert(st->terminator != 256);

   // a random number between 0 and 128
   auto rnd128 = [&](size_t i) { return 1 + (FSST_HASH((i+1UL)*sampleFrac)&127); };

   // compress sample, and compute (pair-)frequencies
   auto compressCount = [&](SymbolTable *st, Counters &counters) { // returns gain
      int gain = 0;

      for(size_t i=0; i<line.size(); i++) {
         u8* cur = line[i];
         u8* end = cur + len[i];

         if (sampleFrac < 128) {
            // in earlier rounds (sampleFrac < 128) we skip data in the sample (reduces overall work ~2x)
            if (rnd128(i) > sampleFrac) continue;
         }
         if (cur < end) {
            u8* start = cur;
            u16 code2 = 255, code1 = st->findLongestSymbol(cur, end);
            cur += st->symbols[code1].length();
            gain += (int) (st->symbols[code1].length()-(1+isEscapeCode(code1)));
            while (true) {
               // count single symbol (i.e. an option is not extending it)
               counters.count1Inc(code1);

               // as an alternative, consider just using the next byte..
               if (st->symbols[code1].length() != 1) // .. but do not count single byte symbols doubly
                  counters.count1Inc(*start);

               if (cur==end) {
                  break;
               }

               // now match a new symbol
	       start = cur;
               if (cur<end-7) {
                  u64 word = fsst_unaligned_load(cur);
                  size_t code = word & 0xFFFFFF;
                  size_t idx = FSST_HASH(code)&(st->hashTabSize-1);
                  Symbol s = st->hashTab[idx];
                  code2 = st->shortCodes[word & 0xFFFF] & FSST_CODE_MASK;
                  word &= (0xFFFFFFFFFFFFFFFF >> (u8) s.icl);
                  if ((s.icl < FSST_ICL_FREE) & (s.val.num == word)) {
                     code2 = s.code();
		     cur += s.length();
                  } else if (code2 >= FSST_CODE_BASE) {
                     cur += 2;
                  } else {
                     code2 = st->byteCodes[word & 0xFF] & FSST_CODE_MASK;
                     cur += 1;
                  }
               } else {
                  code2 = st->findLongestSymbol(cur, end);
                  cur += st->symbols[code2].length();
               }

               // compute compressed output size
               gain += ((int) (cur-start))-(1+isEscapeCode(code2));

               // now count the subsequent two symbols we encode as an extension codesibility
               if (sampleFrac < 128) { // no need to count pairs in final round
	          // consider the symbol that is the concatenation of the two last symbols
                  counters.count2Inc(code1, code2);

                  // as an alternative, consider just extending with the next byte..
                  if ((cur-start) > 1)  // ..but do not count single byte extensions doubly
                     counters.count2Inc(code1, *start);
               }
               code1 = code2;
            }
         }
      }
      return gain;
   };

   auto makeTable = [&](SymbolTable *st, Counters &counters) {
      // hashmap of c (needed because we can generate duplicate candidates)
      unordered_set<QSymbol> cands;

      // artificially make terminater the most frequent symbol so it gets included
      u16 terminator = st->nSymbols?FSST_CODE_BASE:st->terminator;
      counters.count1Set(terminator,65535);

      auto addOrInc = [&](unordered_set<QSymbol> &cands, Symbol s, u64 count) {
         if (count < (5*sampleFrac)/128) return; // improves both compression speed (less candidates), but also quality!!
         QSymbol q;
         q.symbol = s;
         q.gain = count * s.length();
         auto it = cands.find(q);
         if (it != cands.end()) {
            q.gain += (*it).gain;
            cands.erase(*it);
         }
         cands.insert(q);
      };

      // add candidate symbols based on counted frequency
      for (u32 pos1=0; pos1<FSST_CODE_BASE+(size_t) st->nSymbols; pos1++) {
         u32 cnt1 = counters.count1GetNext(pos1); // may advance pos1!!
         if (!cnt1) continue;

         // heuristic: promoting single-byte symbols (*8) helps reduce exception rates and increases [de]compression speed
         Symbol s1 = st->symbols[pos1];
         addOrInc(cands, s1, ((s1.length()==1)?8LL:1LL)*cnt1);

         if (sampleFrac >= 128 || // last round we do not create new (combined) symbols
             s1.length() == Symbol::maxLength || // symbol cannot be extended
             s1.val.str[0] == st->terminator) { // multi-byte symbols cannot contain the terminator byte
            continue;
         }
         for (u32 pos2=0; pos2<FSST_CODE_BASE+(size_t)st->nSymbols; pos2++) {
            u32 cnt2 = counters.count2GetNext(pos1, pos2); // may advance pos2!!
            if (!cnt2) continue;

            // create a new symbol
            Symbol s2 = st->symbols[pos2];
            Symbol s3 = concat(s1, s2);
            if (s2.val.str[0] != st->terminator) // multi-byte symbols cannot contain the terminator byte
               addOrInc(cands, s3, cnt2);
         }
      }

      // insert candidates into priority queue (by gain)
      auto cmpGn = [](const QSymbol& q1, const QSymbol& q2) { return (q1.gain < q2.gain) || (q1.gain == q2.gain && q1.symbol.val.num > q2.symbol.val.num); };
      priority_queue<QSymbol,vector<QSymbol>,decltype(cmpGn)> pq(cmpGn);
      for (auto& q : cands)
         pq.push(q);

      // Create new symbol map using best candidates
      st->clear();
      while (st->nSymbols < 255 && !pq.empty()) {
         QSymbol q = pq.top();
         pq.pop();
         st->add(q.symbol);
      }
   };

   u8 bestCounters[512*sizeof(u16)];
#ifdef NONOPT_FSST
   for(size_t frac : {127, 127, 127, 127, 127, 127, 127, 127, 127, 128}) {
      sampleFrac = frac;
#else
   for(sampleFrac=8; true; sampleFrac += 30) {
#endif
      memset(&counters, 0, sizeof(Counters));
      long gain = compressCount(st, counters);
      if (gain >= bestGain) { // a new best solution!
         counters.backup1(bestCounters);
         *bestTable = *st; bestGain = gain;
      }
      if (sampleFrac >= 128) break; // we do 5 rounds (sampleFrac=8,38,68,98,128)
      makeTable(st, counters);
   }
   delete st;
   counters.restore1(bestCounters);
   makeTable(bestTable, counters);
   bestTable->finalize(zeroTerminated); // renumber codes for more efficient compression
   return bestTable;
}

static inline size_t compressSIMD(SymbolTable &symbolTable, u8* symbolBase, size_t nlines, size_t len[], u8* line[], size_t size, u8* dst, size_t lenOut[], u8* strOut[], int unroll) {
   size_t curLine = 0, inOff = 0, outOff = 0, batchPos = 0, empty = 0, budget = size;
   u8 *lim = dst + size, *codeBase = symbolBase + (1<<18); // 512KB temp space for compressing 512 strings
   SIMDjob input[512];  // combined offsets of input strings (cur,end), and string #id (pos) and output (dst) pointer
   SIMDjob output[512]; // output are (pos:9,dst:19) end pointers (compute compressed length from this)
   size_t jobLine[512]; // for which line in the input sequence was this job (needed because we may split a line into multiple jobs)

   while (curLine < nlines && outOff <= (1<<19)) {
      size_t prevLine = curLine, chunk, curOff = 0;

      // bail out if the output buffer cannot hold the compressed next string fully
      if (((len[curLine]-curOff)*2 + 7) > budget) break; // see below for the +7
      else budget -= (len[curLine]-curOff)*2;

      strOut[curLine] = (u8*) 0;
      lenOut[curLine] = 0;

      do {
         do {
            chunk = len[curLine] - curOff;
            if (chunk > 511) {
               chunk = 511; // large strings need to be chopped up into segments of 511 bytes
            }
            // create a job in this batch
            SIMDjob job;
            job.cur = inOff;
            job.end = job.cur + chunk;
            job.pos = batchPos;
            job.out = outOff;

            // worst case estimate for compressed size (+7 is for the scatter that writes extra 7 zeros)
            outOff += 7 + 2*(size_t)(job.end - job.cur); // note, total size needed is 512*(511*2+7) bytes.
            if (outOff > (1<<19)) break; // simdbuf may get full, stop before this chunk

            // register job in this batch
            input[batchPos] = job;
            jobLine[batchPos] = curLine;

            if (chunk == 0) {
               empty++; // detect empty chunks -- SIMD code cannot handle empty strings, so they need to be filtered out
            } else {
               // copy string chunk into temp buffer
               memcpy(symbolBase + inOff, line[curLine] + curOff, chunk);
               inOff += chunk;
               curOff += chunk;
               symbolBase[inOff++] = (u8) symbolTable.terminator; // write an extra char at the end that will not be encoded
            }
            if (++batchPos == 512) break;
         } while(curOff < len[curLine]);

         if ((batchPos == 512) || (outOff > (1<<19)) || (++curLine >= nlines)) { // cannot accumulate more?
            if (batchPos-empty >= 32) { // if we have enough work, fire off fsst_compressAVX512 (32 is due to max 4x8 unrolling)
               // radix-sort jobs on length (longest string first)
               // -- this provides best load balancing and allows to skip empty jobs at the end
               u16 sortpos[513];
               memset(sortpos, 0, sizeof(sortpos));

               // calculate length histo
               for(size_t i=0; i<batchPos; i++) {
                  size_t len = input[i].end - input[i].cur;
                  sortpos[512UL - len]++;
               }
               // calculate running sum
               for(size_t i=1; i<=512; i++)
                  sortpos[i] += sortpos[i-1];

               // move jobs to their final destination
               SIMDjob inputOrdered[512];
               for(size_t i=0; i<batchPos; i++) {
                  size_t len = input[i].end - input[i].cur;
                  size_t pos = sortpos[511UL - len]++;
                  inputOrdered[pos] = input[i];
                }
               // finally.. SIMD compress max 256KB of simdbuf into (max) 512KB of simdbuf (but presumably much less..)
               for(size_t done = fsst_compressAVX512(symbolTable, codeBase, symbolBase, inputOrdered, output, batchPos-empty, unroll);
                   done < batchPos; done++) output[done] = inputOrdered[done];
            } else {
               memcpy(output, input, batchPos*sizeof(SIMDjob));
            }

            // finish encoding (unfinished strings in process, plus the few last strings not yet processed)
            for(size_t i=0; i<batchPos; i++) {
               SIMDjob job = output[i];
               if (job.cur < job.end) { // finish encoding this string with scalar code
                  u8* cur = symbolBase + job.cur;
                  u8* end = symbolBase + job.end;
                  u8* out = codeBase + job.out;
                  while (cur < end) {
                     u64 word = fsst_unaligned_load(cur);
                     size_t code = symbolTable.shortCodes[word & 0xFFFF];
                     size_t pos = word & 0xFFFFFF;
                     size_t idx = FSST_HASH(pos)&(symbolTable.hashTabSize-1);
                     Symbol s = symbolTable.hashTab[idx];
                     out[1] = (u8) word; // speculatively write out escaped byte
                     word &= (0xFFFFFFFFFFFFFFFF >> (u8) s.icl);
                     if ((s.icl < FSST_ICL_FREE) && s.val.num == word) {
                        *out++ = (u8) s.code(); cur += s.length();
                     } else {
                        // could be a 2-byte or 1-byte code, or miss
                        // handle everything with predication
                        *out = (u8) code;
                        out += 1+((code&FSST_CODE_BASE)>>8);
                        cur += (code>>FSST_LEN_BITS);
                    }
                  }
                  job.out = out - codeBase;
               }
               // postprocess job info
               job.cur = 0;
               job.end = job.out - input[job.pos].out; // misuse .end field as compressed size
               job.out = input[job.pos].out; // reset offset to start of encoded string
               input[job.pos] = job;
            }

            // copy out the result data
            for(size_t i=0; i<batchPos; i++) {
               size_t lineNr = jobLine[i]; // the sort must be order-preserving, as we concatenate results string in order
               size_t sz = input[i].end; // had stored compressed lengths here
               if (!strOut[lineNr]) strOut[lineNr] = dst; // first segment will be the strOut pointer
               lenOut[lineNr] += sz; // add segment (lenOut starts at 0 for this reason)
               memcpy(dst, codeBase+input[i].out, sz);
               dst += sz;
            }

            // go for the next batch of 512 chunks
            inOff = outOff = batchPos = empty = 0;
            budget = (size_t) (lim - dst);
         }
      } while (curLine == prevLine && outOff <= (1<<19));
   }
   return curLine;
}

// optimized adaptive *scalar* compression method
static inline size_t compressBulk(SymbolTable &symbolTable, size_t nlines, size_t lenIn[], u8* strIn[], size_t size, u8* out, size_t lenOut[], u8* strOut[], bool noSuffixOpt, bool avoidBranch) {
   u8 buf[512], *cur = NULL, *end =  NULL, *lim = out + size;
   size_t curLine, suffixLim = symbolTable.suffixLim;
   u8 byteLim = symbolTable.nSymbols + symbolTable.zeroTerminated - symbolTable.lenHisto[0];

   // three variants are possible. dead code falls away since the bool arguments are constants
   auto compressVariant = [&](bool noSuffixOpt, bool avoidBranch) {
      while (cur < end) {
         u64 word = fsst_unaligned_load(cur);
         size_t code = symbolTable.shortCodes[word & 0xFFFF];
         if (noSuffixOpt && ((u8) code) < suffixLim) {
            // 2 byte code without having to worry about longer matches
            *out++ = (u8) code; cur += 2;
         } else {
            size_t pos = word & 0xFFFFFF;
            size_t idx = FSST_HASH(pos)&(symbolTable.hashTabSize-1);
            Symbol s = symbolTable.hashTab[idx];
            out[1] = (u8) word; // speculatively write out escaped byte
            word &= (0xFFFFFFFFFFFFFFFF >> (u8) s.icl);
            if ((s.icl < FSST_ICL_FREE) && s.val.num == word) {
               *out++ = (u8) s.code(); cur += s.length();
            } else if (avoidBranch) {
               // could be a 2-byte or 1-byte code, or miss
               // handle everything with predication
               *out = (u8) code;
               out += 1+((code&FSST_CODE_BASE)>>8);
               cur += (code>>FSST_LEN_BITS);
            } else if ((u8) code < byteLim) {
               // 2 byte code after checking there is no longer pattern
               *out++ = (u8) code; cur += 2;
            } else {
               // 1 byte code or miss.
               *out = (u8) code;
               out += 1+((code&FSST_CODE_BASE)>>8); // predicated - tested with a branch, that was always worse
               cur++;
            }
         }
      }
   };

   for(curLine=0; curLine<nlines; curLine++) {
      size_t chunk, curOff = 0;
      strOut[curLine] = out;
      do {
         bool skipCopy = symbolTable.zeroTerminated;
         cur = strIn[curLine] + curOff;
         chunk = lenIn[curLine] - curOff;
         if (chunk > 511) {
            chunk = 511; // we need to compress in chunks of 511 in order to be byte-compatible with simd-compressed FSST
            skipCopy = false; // need to put terminator, so no in place mem usage possible
         }
         if ((2*chunk+7) > (size_t) (lim-out)) {
            return curLine; // out of memory
         }
         if (!skipCopy) { // only in case of short zero-terminated strings, we can avoid copying
            memcpy(buf, cur, chunk);
            cur = buf;
            buf[chunk] = (u8) symbolTable.terminator;
         }
         end = cur + chunk;
         // based on symboltable stats, choose a variant that is nice to the branch predictor
         if (noSuffixOpt) {
            compressVariant(true,false);
         } else if (avoidBranch) {
            compressVariant(false,true);
         } else {
          compressVariant(false, false);
         }
      } while((curOff += chunk) < lenIn[curLine]);
      lenOut[curLine] = (size_t) (out - strOut[curLine]);
   }
   return curLine;
}

#define FSST_SAMPLELINE ((size_t) 512)

// quickly select a uniformly random set of lines such that we have between [FSST_SAMPLETARGET,FSST_SAMPLEMAXSZ) string bytes
vector<u8*> makeSample(u8* sampleBuf, u8* strIn[], size_t **lenRef, size_t nlines) {
   size_t totSize = 0, *lenIn = *lenRef;
   vector<u8*> sample;

   for(size_t i=0; i<nlines; i++)
      totSize += lenIn[i];

   if (totSize < FSST_SAMPLETARGET) {
      for(size_t i=0; i<nlines; i++)
         sample.push_back(strIn[i]);
   } else {
      size_t sampleRnd = FSST_HASH(4637947);
      u8* sampleLim = sampleBuf + FSST_SAMPLETARGET;
      size_t *sampleLen = *lenRef = new size_t[nlines + FSST_SAMPLEMAXSZ/FSST_SAMPLELINE];

      while(sampleBuf < sampleLim) {
         // choose a non-empty line
         sampleRnd = FSST_HASH(sampleRnd);
         size_t linenr = sampleRnd % nlines;
         while (lenIn[linenr] == 0)
            if (++linenr == nlines) linenr = 0;

         // choose a chunk
         size_t chunks = 1 + ((lenIn[linenr]-1) / FSST_SAMPLELINE);
         sampleRnd = FSST_HASH(sampleRnd);
         size_t chunk = FSST_SAMPLELINE*(sampleRnd % chunks);

         // add the chunk to the sample
         size_t len = min(lenIn[linenr]-chunk,FSST_SAMPLELINE);
         memcpy(sampleBuf, strIn[linenr]+chunk, len);
         sample.push_back(sampleBuf);
         sampleBuf += *sampleLen++ = len;
      }
   }
   return sample;
}

extern "C" fsst_encoder_t* fsst_create(size_t n, size_t lenIn[], u8 *strIn[], int zeroTerminated) {
   u8* sampleBuf = new u8[FSST_SAMPLEMAXSZ];
   size_t *sampleLen = lenIn;
   vector<u8*> sample = makeSample(sampleBuf, strIn, &sampleLen, n?n:1); // careful handling of input to get a right-size and representative sample
   Encoder *encoder = new Encoder();
   encoder->symbolTable = shared_ptr<SymbolTable>(buildSymbolTable(encoder->counters, sample, sampleLen, zeroTerminated));
   if (sampleLen != lenIn) delete[] sampleLen;
   delete[] sampleBuf;
   return (fsst_encoder_t*) encoder;
}

/* create another encoder instance, necessary to do multi-threaded encoding using the same symbol table */
extern "C" fsst_encoder_t* fsst_duplicate(fsst_encoder_t *encoder) {
   Encoder *e = new Encoder();
   e->symbolTable = ((Encoder*)encoder)->symbolTable; // it is a shared_ptr
   return (fsst_encoder_t*) e;
}

// export a symbol table in compact format.
extern "C" u32 fsst_export(fsst_encoder_t *encoder, u8 *buf) {
   Encoder *e = (Encoder*) encoder;
   // In ->version there is a versionnr, but we hide also suffixLim/terminator/nSymbols there.
   // This is sufficient in principle to *reconstruct* a fsst_encoder_t from a fsst_decoder_t
   // (such functionality could be useful to append compressed data to an existing block).
   //
   // However, the hash function in the encoder hash table is endian-sensitive, and given its
   // 'lossy perfect' hashing scheme is *unable* to contain other-endian-produced symbol tables.
   // Doing a endian-conversion during hashing will be slow and self-defeating.
   //
   // Overall, we could support reconstructing an encoder for incremental compression, but
   // should enforce equal-endianness. Bit of a bummer. Not going there now.
   //
   // The version field is now there just for future-proofness, but not used yet

   // version allows keeping track of fsst versions, track endianness, and encoder reconstruction
   u64 version = (FSST_VERSION << 32) |  // version is 24 bits, most significant byte is 0
                 (((u64) e->symbolTable->suffixLim) << 24) |
                 (((u64) e->symbolTable->terminator) << 16) |
                 (((u64) e->symbolTable->nSymbols) << 8) |
                 FSST_ENDIAN_MARKER; // least significant byte is nonzero

   /* do not assume unaligned reads here */
   memcpy(buf, &version, 8);
   buf[8] = e->symbolTable->zeroTerminated;
   for(u32 i=0; i<8; i++)
      buf[9+i] = (u8) e->symbolTable->lenHisto[i];
   u32 pos = 17;

   // emit only the used bytes of the symbols
   for(u32 i = e->symbolTable->zeroTerminated; i < e->symbolTable->nSymbols; i++)
      for(u32 j = 0; j < e->symbolTable->symbols[i].length(); j++)
         buf[pos++] = e->symbolTable->symbols[i].val.str[j]; // serialize used symbol bytes

   return pos; // length of what was serialized
}

#define FSST_CORRUPT 32774747032022883 /* 7-byte number in little endian containing "corrupt" */

extern "C" u32 fsst_import(fsst_decoder_t *decoder, u8 *buf) {
   u64 version = 0;
   u32 code, pos = 17;
   u8 lenHisto[8];

   // version field (first 8 bytes) is now there just for future-proofness, unused still (skipped)
   memcpy(&version, buf, 8);
   if ((version>>32) != FSST_VERSION) return 0;
   decoder->zeroTerminated = buf[8]&1;
   memcpy(lenHisto, buf+9, 8);

   // in case of zero-terminated, first symbol is "" (zero always, may be overwritten)
   decoder->len[0] = 1;
   decoder->symbol[0] = 0;

   // we use lenHisto[0] as 1-byte symbol run length (at the end)
   code = decoder->zeroTerminated;
   if (decoder->zeroTerminated) lenHisto[0]--; // if zeroTerminated, then symbol "" aka 1-byte code=0, is not stored at the end

   // now get all symbols from the buffer
   for(u32 l=1; l<=8; l++) { /* l = 1,2,3,4,5,6,7,8 */
      for(u32 i=0; i < lenHisto[(l&7) /* 1,2,3,4,5,6,7,0 */]; i++, code++)  {
         decoder->len[code] = (l&7)+1; /* len = 2,3,4,5,6,7,8,1  */
         decoder->symbol[code] = 0;
         for(u32 j=0; j<decoder->len[code]; j++)
            ((u8*) &decoder->symbol[code])[j] = buf[pos++]; // note this enforces 'little endian' symbols
      }
   }
   if (decoder->zeroTerminated) lenHisto[0]++;

   // fill unused symbols with text "corrupt". Gives a chance to detect corrupted code sequences (if there are unused symbols).
   while(code<255) {
       decoder->symbol[code] = FSST_CORRUPT;
       decoder->len[code++] = 8;
   }
   return pos;
}

// runtime check for simd
inline size_t _compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd) {
#ifndef NONOPT_FSST
   if (simd && fsst_hasAVX512())
      return compressSIMD(*e->symbolTable, e->simdbuf, nlines, lenIn, strIn, size, output, lenOut, strOut, simd);
#endif
   (void) simd;
   return compressBulk(*e->symbolTable, nlines, lenIn, strIn, size, output, lenOut, strOut, noSuffixOpt, avoidBranch);
}
size_t compressImpl(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], bool noSuffixOpt, bool avoidBranch, int simd) {
   return _compressImpl(e, nlines, lenIn, strIn, size, output, lenOut, strOut, noSuffixOpt, avoidBranch, simd);
}

// adaptive choosing of scalar compression method based on symbol length histogram
inline size_t _compressAuto(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], int simd) {
   bool avoidBranch = false, noSuffixOpt = false;
   if (100*e->symbolTable->lenHisto[1] > 65*e->symbolTable->nSymbols && 100*e->symbolTable->suffixLim > 95*e->symbolTable->lenHisto[1]) {
      noSuffixOpt = true;
   } else if ((e->symbolTable->lenHisto[0] > 24 && e->symbolTable->lenHisto[0] < 92) &&
              (e->symbolTable->lenHisto[0] < 43 || e->symbolTable->lenHisto[6] + e->symbolTable->lenHisto[7] < 29) &&
              (e->symbolTable->lenHisto[0] < 72 || e->symbolTable->lenHisto[2] < 72)) {
      avoidBranch = true;
   }
   return _compressImpl(e, nlines, lenIn, strIn, size, output, lenOut, strOut, noSuffixOpt, avoidBranch, simd);
}
size_t compressAuto(Encoder *e, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[], int simd) {
   return _compressAuto(e, nlines, lenIn, strIn, size, output, lenOut, strOut, simd);
}

// the main compression function (everything automatic)
extern "C" size_t fsst_compress(fsst_encoder_t *encoder, size_t nlines, size_t lenIn[], u8 *strIn[], size_t size, u8 *output, size_t *lenOut, u8 *strOut[]) {
   // to be faster than scalar, simd needs 64 lines or more of length >=12; or fewer lines, but big ones (totLen > 32KB)
   size_t totLen = accumulate(lenIn, lenIn+nlines, 0);
   int simd = totLen > nlines*12 && (nlines > 64 || totLen > (size_t) 1<<15);
   return _compressAuto((Encoder*) encoder, nlines, lenIn, strIn, size, output, lenOut, strOut, 3*simd);
}

/* deallocate encoder */
extern "C" void fsst_destroy(fsst_encoder_t* encoder) {
   Encoder *e = (Encoder*) encoder;
   delete e;
}

/* very lazy implementation relying on export and import */
extern "C" fsst_decoder_t fsst_decoder(fsst_encoder_t *encoder) {
   u8 buf[sizeof(fsst_decoder_t)];
   u32 cnt1 = fsst_export(encoder, buf);
   fsst_decoder_t decoder;
   u32 cnt2 = fsst_import(&decoder, buf);
   assert(cnt1 == cnt2); (void) cnt1; (void) cnt2;
   return decoder;
}

redpajama_set_name: RedPajamaGithub


Safaricom now owns a 32.5% stake in the TEAMs (The East Africa Marine System) fibre cable. The telecomm operator increased its shareholding in the undersea cable after Essar offered to sell their 10% stake in TEAMs. As a result of this deal, Safaricom is now guaranteed additional capacity in Teams based on its shareholding. Current shareholders on the TEAMs cable are the Kenya government at 20%, Telkom Kenya at 20%, Kenya Data Networks – 10% and Jamii Telecom – 6.25%.
Essar has been facing a liquidity crisis and this deal promises a much needed cash injection. The company acquired bandwidth on the undersea TEAMs cable back in 2008. The bandwidth however not been put to operation by Yu after the telecomm company failed to close most of its financing deals.
"The additional shareholding in Teams entitles Safaricom to have increased capacity on the 1.28 TB/s international cable. It is an integral part of our data strategy to have sufficient international capacity to feed the demands of our growing customer base and to support our terrestrial fibre strategy and LTE plans." – Safaricom.
Safaricom is currently laying an inland fibre cable networks that is expected to span 2,300Km at a cost of Kshs 8 billion. The mobile provider currently accounts for 80.2% of Kenya's mobile phone voice market and the number of its data users stands at 9.33 million data users as of June this year. CCK (Communications Commission of Kenya) has however labelled the mobile operator as non-compliant on quality of service over a significant number of dropped calls and fluctuating data speeds.
As the demand for data services increases, the telecomm provider has even offered free setup services for businesses who will connect to Safaricom's fibre cable. Plans are also underway to offer TV content to its customers as the company is now moving from reliance on other internet providers' backbones.


text:
Sony Just Needs to Let the PS Vita Die Already
Aaron Cooley Themm November 6, 2014 32 Comments	26 views	0 likes News
The PlayStation Vita was supposed to change the way we played portable games, and for a while it did. As a day one adopter I can say, without a doubt, that I had never played anything as close to console quality as what I did on the PlayStation Vita. It wasn't the packed in Little Deviants that changed my mind in the way that I played, yet games like Wipeout 2048 and even more so when I got my hands on Uncharted: Golden Abyss. I thought to myself, 'hey self, you're awfully good lookin…' oops no that was another situation. Sorry, back to the Vita, I thought to myself 'why will I need a home console in the future if this is what is available at launch'? I mean I knew eventually that there would be the Xbox One and PlayStation 4 consoles and those would be ones that set themselves far beyond what the Vita could handle.
However, during the latter of the life cycle of each of the predecessors, if the Vita could achieve everything I wanted in terms of graphical output and some of the games were ported to the system from the PlayStation 3… so why wouldn't all games wind up that way? I thought it was a match made in heaven. Seriously, this is a beast of a machine in a handheld container. Then, with just a short amount of time, it was revealed that the system that went with me everywhere was becoming even less than that of the console it was aiming to replace… the PSP. Now after almost 3 torturous years, Sony just needs to let the Vita die because our dreams of what it could have been did that a long time ago.
I kept my Vita for a long time, and rightfully so. There were some great games that were coming like Killzone Mercenaries, Tearaway, Assassin's Creed Liberation, and others that really struck my AAA cord. While some had hit, and others were on the horizon the future for the Vita looked to be bright and like a console that was worthy of the PlayStation name. It sported a beautiful display that was also touch, TWO…. count them TWO joysticks, a back touchpad, all the face buttons that we have come to know and shoulder buttons as well. This was a PlayStation Controller with a screen (minus the triggers too). The Nintendo 3DS was selling better, but it had an established base and it was only a matter of time before the hardcore gamers came running in hoards to purchase the Vita and revel in its awe-struck beauty and abilities. It was just what the doctor order for gamers that wanted to play on the go and didn't want to buy a 5″ screen to hook their console to.
The next thing I hear are crickets. There weren't the sales figures that many thought would be there and third party support fell faster than a sumo wrestler dropped from a 18 story building. Even then, the bigger problem was that Sony themselves stopped supporting it. At that point, so did I. It wasn't the only Vita that I owned, going back to the console a couple of times to play some games that had recently hit and me having a wishful thought that maybe, just maybe the support was coming; the wagons were circling. But, in all reality they weren't. While there have been some minimal games to hit the console, and more than anything downloadable titles instead of big name games that the Vita was designed for, there hasn't been anything to really bat an eye at. Even after Sony brought out Borderlands 2, a port of the console title that had people buzzing about the Vita for a second, literally a second, the system still struggled to find adopters.
They resorted to making the system cheaper with a thinner design and lesser screen and still the stampedes weren't racing in. Nothing was bringing gamers to the system and I wasn't running back any longer either. The Nintendo 3DS has continued its reign and it looks as though the market, especially for now, only has room for one portable system and the 3DS has claimed its place. Even though it, too, had a hard first year of sales it hasn't stopped Nintendo from making it a heavily adopted system today. The consoles sells so well they, too, have done a redesign and it looks and plays better than ever. Why couldn't the Vita do the same? One thing was the lack of publicity, another the price, and thirdly the support just kept people at bay. It isn't like the system was a ridiculous amount more than the original price of the 3DS, but it was enough that people weren't paying it. The publicity surrounding the system was awful and most outside of Japan, when asked, no one had an idea of what the Vita even was.
Even with all of that, it still just didn't get the one thing it needed and that was the welcomed pockets of the hardcore gamers. Reason being is that most wanted to play their systems at home, traditionally with a controller. There was nothing else to it. Gamers didn't want the same experience that they could get on the big screen because they didn't want to shell out the money to get one when they already had something similar. It might have offered the chance to play games like never before, but the 3DS does that too at a cheaper cost and offers something different. While the console has some great titles, too, that would be considered AAA titles, it doesn't try to be like the Wii U, instead it embraces the differences. Sony didn't give gamers a reason to buy a Vita, they gave them pint-sized reasons to buy a PlayStation 3.
What it did have going for it was that it supported remote play for the PlayStation 4 and some people went out and bought one because of it. With it not working the greatest unless you are within your house, it really doesn't give you a reason to own it. If someone is watching TV and you want to play a game on your PS4, you have two options and both cost less than a Vita. First, you can take your PS4 in the other room and hook it to a TV, or you can buy a small TV and a PlayStation TV and play everything you could want streaming though it to your television. Oh, and to top that off…. the PlayStation TV plays Vita games too, go figure. Sony is showing that it has little interest in supporting the Vita as a companion to the PS4 as well by integrating remote play into their new Xperia Z phone line as well, and it's coming to other phone platforms in the near future.
Sony really has written it on the wall for all to take notice; the PlayStation Vita is dead. They might not want to admit defeat, but they need to let the Vita go out peacefully with the Christmas season approaching. There will be people buying PlayStation 4's, Xbox One's, and even Wii U's over the Vita and most would choose a new phone or tablet over a Vita too. They just don't offer anything that makes the system stand out from the rest. It is a dying system hanging on by a string and Sony just needs to cut the cord, endure the losses, and move on. It has found success with the closing of the life of the PlayStation 3 and now, even more so, with the PlayStation 4; so Sony ride that horse into the sunset and pay your respects to the system that could have been, but never was, as you go.
Tags: Gaming, PlayStation, playstation 4, PlayStation Vita, Portable, Sony, System, Vita
Previous ArticleCall of Duty: Advanced Warfare Review (PS4)Next ArticleGTA V Xbox One/PS4 First Person View Trailer
A Plague Tale: Innocence 'Monsters' Trailer Revealed
PlayStation Plus June 2019 Lineup Announced
Destiny 2: Shadowkeep Launch Trailer Takes You to the Moon
UK Weekly Video Game Sales Charts: World War Z Rises to the Top
Tom Clancy's Ghost Recon: Breakpoint Revealed, Launches October 4 on PS4, Xbox One, and PC
Sony Conference Thoughts and Grade
PS4GAMERS	 November 6, 2014, 8:04 pm
is sony losing any money with the vita ? i don't think so.
there are tons of great games for it, and innovative features like remote play, with a ps4, even in 2020, nintendo won't be able to do such great feature.
if the vita was a microsoft console, oh, shit, it would be the best portable console ever, the best features, the best screen, the best best everything.
2 years before the vita was out, there was already tons of doom and gloom articles, with the "20 reasons why the psvita will flop", or "30 reasons why you shouldn't buy the psvita"
i own a psvita first gen, and i'm really happy with it. ps+ alone gives me tons of games to play, i only buy the big titles on vita, and wait until some titles land on the ps store. then, i play all my games on ps3.
saying the psvita is dead , sony should let it go out peacefully, etc, is a massive nonsense . if you prefer playing your minecraft games on your ipad, or some other 1$ games, then do it. but if you don't have the time to play on your vita, at least, stop spreading fud.
Aaron Cooley-Themm	 November 7, 2014, 1:21 am
PS4GAMERS,
I very much respect what you had to say about the Vita and am glad you have found a niche for it in your gaming life. For most, this is not the case though. Sony obviously is finding other ways to appeal to gamers with things like PlayStation TV that can even alleviate the need for the Vita at all.
As the Sony UK boss said "[W]hat we are excited by is the number of games we can take to the platform that have been created for other platforms" — Fergal Gara
This is all the Vita has become, something where downloadable titles are thrown at it and not doing anything to help you want to buy one. I was integued myself with Remote Play features on the PS4 when I got my console on launch day and thought about readopting it myself for that. With the announcement though that Sony Xperia phones will carry the capability and soon more devices with a simple app…. why bother? It's a bit much to buy a console to do the same thing that multiple others can do as well. As Gara also pointed out — we're not likely to see Uncharted or Killzone on Vita again. Which is a crying shame because now it's an iPad or Tablet with joysticks and with less functionality
BoyBigEyes	 November 6, 2014, 9:07 pm
Unfortunately… i have to agree with you, but Sony will not let the Vita die, unless the PSP2 (or PSP3) are release.
Johhny Ridden	 November 6, 2014, 9:12 pm
There are tons of games still coming for the PS Vita, and even though most of them are indies, there are also many games from better know companies, such as:
Atelier Ayesha: Alchemist of Dusk +
Criminal Girls: Invite Only
Disney Infinity 2.0 Marvel Super Heroes
Hatsune miku project diva f 2nd
Hyperdimension Neptunia Re:birth 2
Hyperdevotion Noire: Goddess Black Heart
Invizimals: The Resistance
Oddworld: Munch's Odyssey HD
Oddworld: New N Tasty
Oreshika: Tainted Bloodlines
Minecraft Vita
Persona 4 dancing all night
Shantae: Half Genie Hero
Skullgirls Encore
Tales from the Borderlands
Tales of Hearts R
The Firefly Diary
The Legend of Heroes: Trails in the Sky Second Chapter
Tokyo Twilight Ghosthunters
Toukiden Kimawi
http://www.neogaf.com/forum/showthread.php?t=858508
Thanks so much for your reply, and you're right there are some great games on the system. However, the system lacks titles that hold you at all, have substance, or provide a console like experience which is what the Vita was pitched as. It's still more expensive than the 3DS, has a library that is 3x smaller than the competition, and struggles to get any support from either internal or external sources. It's become a forgotten console, or handheld how ever you plan to define it.
Alyx Spacer	 December 31, 2014, 6:50 pm
Let me go ahead and say
1.the 3ds XL and the new 3ds are the same price as the vita
2.the vita has 467 games compared to the 3ds's 603
3.quality over quantity.
4.lacks titles that hold you at all? thats an opinion. and what of gravity rush 2? that will be one hell of a console experience.
5. forgotten consoles dont still sell on store shelfs and receive new games.
Silverfish	 November 6, 2014, 9:43 pm
I would disagree with the article. I just bought a Vita Slim this year and have nearly filled up my (overpriced) 64GB Memory Card with amazing games, indie titles, and free PSPlus games. I have really fallen in love with this console and it seems that Indie devs have too, considering that there's something interesting and cool in the Playstation Store every Tuesday afternoon. The lack of AAA is a problem, but titles like Persona 4 Golden, Minecraft, The Walking Dead, and The Binding of Issac: Rebirth keep me coming back for more and have alone made getting a Vita worth it.
The Vita is alive in 2014 and will live through 2015. Declaring it to be "dead" or claiming that Sony needs to move on and let the Vita die is a fad in gaming journalism that needs to go away.
Indies have found some place, but they have on the iPad and Tablets that run Android as well. Persona 4 is a game that could be found on the PS2. Great game, and one that is worth a play, but you don't have to have a Vita to play it on. There are cheaper ways to find it. Minecraft, check, The Walking Dead, Check, Wolf Among Us, Check, Stealth Inc, Check, and there are plenty more that can be had on an iPad or Tablet as well. The experience isn't new, unfortunately it is a case of not having anything else to play. That's why the console struggles and why it just doesn't hold up anymore.
Silverfish	 November 7, 2014, 3:33 am
Thanks for getting back to me Aaron.
I agree with you that a lot of the games can be found on the iPad or on PC, which I have both. I guess my opinion on the matter is unique because I mostly game on mobile platforms when I can. I can't imagine sitting down in front of the TV every time I want to play Persona 4. I like to play in bed, on the toilet, at work; and have my games with me at all times. I have gotten some games on my iPad, but it has been a better experience overall playing on my Vita (saves battery life too). The iPad can do all of those games you mentioned, but it does not do them all well. I have games on both and prefer the Vita entirely for the controls and excellent sleep/wake mode. Unfortunately, it's not easy to get the point across that the same game is not equal across platforms and most people will just go for the iPad anyway. PSPlus was an unexpected blessing for me with all its free games and deals that rival Steam every week.
I would definitely agree that touting indie gaming as a primary use has hurt the Vita in the long term (fewer cool kids adopt, fewer AAA games ported, wash, rise, repeat). It's what drew me to the platform in the first case and it has been a fantastic experience so far, but it's not enough to carry it long term. If Nintendo was able to pull their first profit in years, I think Sony will be able to find a way to pull through.
I suppose the only point of contention I have with you is that the Vita's time has come and gone. Things might not look so hot right now, but the Vita is a joy to use every day and I would recommend it to just about anyone, just for the backlog of fun titles. Giving up would be a sad day for me because I see so much potential in it.
Sony really needs to get its act together and market this thing instead of ignoring it entirely at E3 and pushing Vita TVs and overpriced memory cards. They can do it right, they just have to do it right.
P.S. I appreciate the reply! I know gamers are easy to piss off (myself included) and responding to all the comments is tough. Keep it up!
novurdim	 November 6, 2014, 11:18 pm
You can really feel that website is desperate when they release such a cheap clickbait article with a serious face.
ThisGenGaming	 November 7, 2014, 12:19 am
It's up to our writers what they would like to write for the site. I can get the writer of this article to defend his points.
Twinwerks	 September 23, 2015, 4:36 pm
Stop pandering to people whohate the ps vita You obviously are giving the ps vita a bad reputation..
Screw your site and I hope this site burns in hell!!!
Why don't you vita haters get a life instead of bashing the vita.
Obviously this is click bait to spread false opinion pieces to shame the Vita and that is what this site is doing!!
Quit bashing the ps Vita and just get a 3DS. You obviouslyhave nothing to do but spread doom and gloom, why don't you just give the 3DS a bad reputation instead, stupid Nintendo fanboys…
Aaron Cooley-Themm	 November 7, 2014, 12:59 am
As the writer, I don't feel that click bait is the right wording for this article. You can respectfully disagree just as I with you, but click bait would be something that a site uses a title like "Rest in Peace PS Vita" or "Sony Lets the Vita Die". That would be click bait as you think it is breaking news rather than an opinion. I'm sorry that you feel the way you do but in all fairness the Vita is struggling and struggling bad.
novurdim	 November 7, 2014, 11:25 am
It is struggling and you are actually a part of the problem. If "game journalists" didn't wright "vita is doomed"-pieces every several weeks for the past two years now, public perception wouldn't be as warped. But the main part, of course, is Sony's erratic marketing and extremely weak 3rd party support. These three things haunt vita from the very beginning and don't really let it "live".
But the most admirable thing is that it still hangs on despite all those scourges. There's life outside expensive western-oriented AAA-games.
Vita is an ideal place to play indies on. Almost every notable indie-game has already been ported or will soon be. The argument "but they can be found everywhere" doesn't actually work at all, because portability is the key thing in enjoying indies for most and 3ds has only a few. I won't even start about tablets as I still want to keep my fingers intact. But you can, of course, buy Nvidia Shield. For the price of four vitas.
Also Vita's situation is nearly not as bad in Japan. In homeland the only thing that outsolds vita is 3ds, but it has a really special standing there. Your "jrpgs-argument" is weird, because japs games offer a lot more variety, you should really check up on them and not just mindlessly exaggerate for the sake of your point.
Vita is now niche, but that's not a bad thing in itself. Vita had way more decent games than 3DS in the last half a year, I welcome you to try and argue that. Sony does not invest that much in Vita here so they don't really lose anything either. And in Japan Freedom Wars and Oreshika sold more than decently. With the same logic you could write an opinion about how nisa should close down, 'cause their games don't sell millions, or how vn-industry is condemned and JAST are strange fools.
So in the end your article looks like more of a strange insult to people still supporting and enjoying vita and doesn't reveal anything new or interesting about this peculiar situation. Just another cheap way of increasing traffic through a vita-mocking wave. And the saddest thing is that it almost always works so we'll see dozens and dozens of these articles everywhere in the near future, they will never stop.
I do apologize for any gramm mistakes as my native language is russian, but that shouldn't keep from getting the point.
Paulogy	 November 6, 2014, 11:25 pm
And what does cutting the cord mean, exactly? Stop marketing it? Stop paying third parties to produce exclusives for it? Redirect their first party studios to all make games for PS4? They've done all this already, and have been for months. So what more is there to do?
I think the comments you already see here, and the ones surely to come, already show that there is still a market for new titles on the Vita, big or small, regardless of where they come from. While it would be nice for Sony to invest in Vita more at this point, they don't need to. And there's plenty to do without that.
Paulogy,
I appreciate you opinion, but the purpose of the article is to show that there isn't really much to do on the system unless used for remote play features on the PlayStation 4. They did a terrible job with showing what the Vita really was from the start and marketing was non-existent. For this you are correct.
Really, unless you like JRPG's and those alone what is there to do on the Vita? Minecraft? Like on every other system including your cell phone that you already take everywhere with you. Mobile Phones and devices dominate the market right now along with the 3DS. There just isn't much else to say for the Vita.
Nonscpo	 November 7, 2014, 12:36 am
"PlayStation Vita is dead"…Just cause the system doesnt have the AAA-western games that you want to play doesnt change the fact that Vita owners have had an excellent year with all the niche japanese games we never thought would ever get localized. This year we got: Hatsune Miku PDf, Hyperdimension Neptunia Re;Birth, Conception II, Demon Gaze, Dangan Ronpa 1, Dangan Ronpa 2, Freedom Wars, Toukiden, AkibaStrip UU, and Senran Kagura Shinovi Versus. All fun great games and not only that, there are even more games to look forward to next year as well.
You said it best "Japanese Niche games". That is really all that there is to look forward to, which in the US is a smaller market than the AAA Western releases you also mentioned. Thank you for your comment, appreciate you checking out the site!
Nonscpo	 November 8, 2014, 6:41 am
Thanks for the reply back, I agree that the current game stream is certainly niche. But I often find that its the niche games that always turn out to be the true hidden gems of any console or in this case handheld.
Sludkip	 November 8, 2014, 1:51 pm
True story! That's pretty much why I want a Vita. Some awesome "Japanese niche games"~ 😀
KuchikiSentou	 November 7, 2014, 1:33 am
Love my VITA. Love that Sony supports it still. Western AAA on the platform is done for. However:
– Japanese games mostly come to the VITA so ya, not dying anytime soon bud. Moero Chronicle, Bullet Girls, Criminal Girls, Destroyer Trillion, too many to list.
– Personally don't care about indieStation VITA, but a lot of people use their VITA as a portable indieStation.
VITAtv is of little to no consequence. Great only in concept.
PS Vita Roundup	 November 7, 2014, 11:04 am
Having covered the Vita since it was the NGP, I largely have to agree, sales haven't risen since the arrival of PS4 and Remote Play, so that's the last opportunity gone… Even Japanese games are now being delayed or cut back.
I was hoping for a "DualShock 4 Portable" offering Remote Play on a full HD 6″ screen, with all the buttons based on Vita hardware (perhaps with an upgrade and SD card support) but I guess Sony can't afford a further shot at handheld gaming.
Freaking Jesus Dude	 November 7, 2014, 1:43 pm
Vita got quite a fan base , especially the east and anyone who like japanese games .Sony might be through with the damn thing in the west , but the east is still growing more games for the system . So it's not like Sony can just go "We fed up with it , so we will stop supporting it in any forms " . If anything , Sony have to let the Vita die a really really slowly death .
And to each their owns but i like gaming on my Vita . If a game that are both available on the Ps3,Xbox360 and the Vita , i'd choose the Vita version if it's not a super bad port that is . I played Rayman , Blazblue , most of the indies games on the Vita and love them . And if you said i should go play indie games on a phone or ipad with touch button i'll punch you right in your face .
Guest	 November 7, 2014, 1:51 pm
Agreed, Vita has been dead for a long time. There's only a few million that got suckered into the brainwashing Sony hype and bought one, when even the PSP ended poorly. Vita should be burried.
Bah quit being a hater and move on to the 3DS fag nintendo junkie!!!
Stop making people not want to enjoy games that you do not like and just get the fuck out of here if you are going to be an asshole about it since you never owned one stupid shitty garbage gamer!!! 🙂
Stupid fucking nintendo
Stupid Nintendo fucking covert troll. Screw you, why don't you hate on the 3DS instead?
Oh wait, you are just a guest and the fact you are lurking says a lot about you. 😉
vrfm87	 November 7, 2014, 6:17 pm
PSVita isn't dead. It's a matter of perspective. As a niche gaming system, it's a success. According VGChartz, the system sold around 9 million units. But, as a game system for the masses, its a failure.
Sony made and still making many mistakes regarding Vita. The lack of marketing is one of the huge problems, as well as the support from their own creators.
Nowadays, thanks to smartphones and tablets, there are more ways to play on the go. Vita should have been released in 2009, 2008 or even before, and would have made a great success.
If Sony and its affiliates continue releasing games like Soul Sacrifice and Freedom Wars once a year, i will be satisfied. Because, talking seriously, nowadays, who ends ALL games which purchase?
David	 April 20, 2016, 6:05 pm
Hi, you wrote this post 2 years ago, and even today, i just purchased Shovel Knight for Vita, Axiom Verge just released on Vita, Keiji Inafune is bringing Mighty No. 9 to vita this summer, Koji Igarashi will bring Bloodstained to Vita. Not exclusives, ok! we don't mind, they are good games to play on vita.
what killed the vita was that stupid sony's proprietary memory. its crazy expensive! Digital contect was getting popular on portable systems because they where.. well portable? And PS store has good discounts, but you run out out space quickly. Damn i don't know what i hate the most: gamecube mini dvds, psp UMD discs or ps vita weird memories. I can say the big winner is 3DS, despite its low resolution, is so fkn funny, Nintendo has always been the king of handhelds.

redpajama_set_name: RedPajamaCommonCrawl


The objectives of Center for Studies of Host Response to Cancer Therapy are to create a self-sustaining, multidisciplinary research center at UAMS that examines the mechanisms of and prevention strategies for cancer-therapy-induced toxicity and side effects. This is the first center in its kind that is dedicated to proactively address how to minimize the impact of lasting cancer therapy-related toxicities. The focus of the center is on the mechanisms of side effects of cancer therapy and strategies to prevent such side effects is justified by the dramatic increase in the number of cancer survivors, currently exceeding 13 million in the US. Many cancer survivors are cured of their malignancy but suffer from treatment-related toxicities. While the importance of achieving cancer cure is duly recognized, comparatively little effort has been directed toward establishing the mechanisms of subsequent side effects of cancer therapy and at developing effective interventions to prevent them. The COBRE Center will promote the initiation and development or expansion of unique, innovative state-of-the-art biomedical and behavioral research centers at UAMS. Our key objectives are (1) to strengthen biomedical research infrastructure at UAMS through the establishment of a thematic multi-disciplinary center and (2) to enhance the ability of junior investigators to compete independently for complementary NIH individual research grant or other peer-reviewed support.


text:
Home / Summer 2016 Issue / Arts / A Fresh Perspective on History
Arts June 28, 2016
"Indians Eating Calhoun's Cake," by Thom Ross, acrylic on paper, 32" x 40", Kneeland Gallery
A Fresh Perspective on History
Contemporary Native American Art Delights and Surprises by cheryl haas
On June 25, 2005, Lt. Col. George Armstrong Custer and his men of the 7th Cavalry stood planted on the rolling hills of the Little Bighorn battlefield as they faced the onslaught of Cheyenne and Sioux warriors. A week later, in Sun Valley, the same troops again looked toward the braves advancing under the command of Sitting Bull and Crazy Horse. The figures were life-size, intricately painted wood cutouts, positioned as part of an installation by Santa Fe artist Thom Ross. Ross is one of several artists represented by Ketchum galleries whose work falls exuberantly outside the traditional scope of what most people think of as "Native American art."
"It's the responsibility of the artist to stay outside of the social law," said the iconoclastic Ross. "I look at my subjects in the context of history. White artists created an Indian that never existed—the Indian who always looks so noble as he gazes off into the distance. We fawn over that crap. The truth is Sitting Bull killed more Indians than Custer. The truth is that the Indians were also pranksters and comedians."
"Thom tries to expose the truth of the Indian experience," said Cary Moulter, whose Kneeland Gallery exhibits Ross' works. "He'll paint from an eyewitness account of Indians playing ping pong or croquet, and take these moments to explore the root of what the West really means. He likes to subvert the clichéd idea of what people expect in Native American art."
Tom Bassett, who with Sandy Gregorak owns Wood River Fine Arts, says that when people think of Western art, they usually visualize scenes of cowboys, Indians and unspoiled vistas by Frederic Remington and Charlie Russell. "People want imagery that reminds them of an unspoiled world and a simpler time," Bassett said. "The artists we represent are inspired by Native American culture, and their work is
their interpretation of
that culture."
Dave McGary (1958-2013) is one of those artists, and he's considered a master of realism in depicting Native Americans. Two of his bronzes are in the permanent collection of the White House. "Dave spent a lot of time with different tribes and took the time to educate himself on what he was creating so his work has an authenticity and a feeling that's correct," commented Bassett. "His sculpture, 'Emergence of the Chief', at Concordia University in Montreal, Canada, is a good example. The Iroquois confederation of five nations was a matriarchal society in which the clan mothers owned land and homes, and elected the male chiefs. So Dave ended up changing his original design to include a clan mother instructing a new chief on how to govern."
Gary Lipton, owner of Lipton Fine Arts, collects Native American antiquities such as blankets, clothing and baskets. "I only deal in items that are pre-reservation," Lipton said, "circa 1850-1875, when the Indians still lived in the wild and used traditional materials."
Lipton will happily describe the difference between a dress adorned with pony beads and one made with seed beads. "Pony beads were larger and introduced from traders who traveled with pony pack trains in the early 1800s," he said. "The Indians would kill an antelope and strip the sinew or gut, and use it to sew the beads on a hide garment. To me that's the romance, the real character of collecting. A dress with pony beads can fetch $100,000 in resale where one with seed beads may bring only $10,000 to 18,000."
Seed beads were introduced after manufacturing techniques in Europe improved to allow tiny beads of uniform size with a range of colors to be imported in bulk. After the tribes were relocated onto reservations, Lipton says they often bought bolts of fabric in blues, greys and reds to make blankets and garments, and sewed with cotton thread.
"Custer's Last Stand," by Thom Ross, installation, 200 figures: 60 troopers, 140 warriors, Kneeland Gallery
Theodore Villa is of Apache and Zapotec (Mexican) heritage whose work hangs in the Broschofsky Galleries. "He was raised in Santa Barbara by his maternal grandmother who instructed him in the old myths and ways," said co-owner Minette Broschofsky. "Her stories provided inspiration for his work. His paintings depict clothing, headdresses and utilitarian objects that were part of Native American life and ceremonies, and that carried special meaning to the wearer or user."
Villa uses vibrant watercolor washes that Broschofsky describes as like no other. "He uses multi-layers of color to achieve an intense brilliance for background," she said. "Leather and fringe appear to have real texture. Beadwork is especially prominent. Each bead is individually painted, and then with a small drill, he pierces it down to the white of the paper, giving it a three-dimensional quality." Broschofsky added that Villa "likes to have fun" and playfully puts his subjects in a contemporary realm by forming objects such as taxis or martinis into the beadwork of his paintings.
Two of the gallery's younger artists turn the popular notion of Indian imagery on its head. Russell Young is a British artist who began his career in music videos but turned his attention to pop culture in photographs and prints. Broschofsky says he works in large format and often finishes his screen prints off with "diamond dust"—literally crushed glass—that gives a piece such as Curly Bear, a portrait of a Siksika chief, what she calls "an ironic pop glitz."
Broschofsky's son, Rudi, who grew up exposed to his parents' Ketchum gallery, is now an urban artist in Portland. He often incorporates Native American imagery, says his mother, but his style is generations away from the pastoral scenes evoked by popular art. A product of the snow and skateboard culture, Rudi uses street art methods and employs spray paint and stencils—often on boards themselves—to convey a contemporary slant on a time of American history that people often view through a pastoral lens.
A Playdate With Anna Skibska
'Light Bearer and Shadow Player'
Easy Writer
Actor Scott Glenn and the poet rising from within
Capturing the Light
Plein Air artists brave the cold to catch perfect moments
Unbridled Artist
Jean Richardson's intentional vagueries on canvas liberate the viewer's soul
A Telling Tale
Former Valley writer and editor explores the Bowe Bergdahl story
Red-Headed Ambition
The roots of this country soul singer started with a rock 'n' roll mom
Writers' Conference Draws Literary Starts to the Valley By Staff
A Thriving Art Scene BY Heather Linhart Coulthard
Beaver Creek Fire BY Mike Mckenna
The Photography of Andrew Kent BY Chatham Baker Photography Andrew Kent & Chatham Baker
Summer Ice is Nice Text: Faith Coben Photography: Craig Wolfrom
Special Deliveries Text: Eleanor Jewett Photography: Hillary Maybery
The Importance of Being Earnest Text: Christine Munson Photography: Courtesy of Lori Joyce


down and go for it!
The venue can be a hall, a home or even a garden!
So much more than a disco!!
If a joint party + £10 for each additional person celebrating!
PLEASE BE ADVISED IT IS NECESSARY FOR FUNfORCE TO UNLOAD & PARK AS CLOSE AS POSSIBLE TO THE SET-UP AREA!
All the advertising posters, tickets or invitations you need to send out!
A card & present for the host or hostess!
All prizes for the mayhem!


text:
Q: Showing a function does not have two distinct roots I have the function $f(x)=x^3-(3/2)x^2+k$ where $k$ is any real number and I am to show that the function does not have two distinct roots in the interval $[0,1]$.
I am in need of help applying the mean value theorem and rolle's theorem to prove this.
Thanks in advance.

A: Suppose towards a contradiction that $f$ has two distinct roots $a$ and $b$ in the unit interval (say $b>a$). Then by the mean value theorem $$0=f(b)-f(a)=f'(c)(b-a)=(3c^2-3c)(b-a)$$
for some $c\in(0,1)$. But does the derivative vanish in $(0,1)$?

redpajama_set_name: RedPajamaStackExchange


PersianoEvents.com: Table cloth rentals in orange county. 120" round table linen rentals in orange county.
Linens are required when renting any of our tables. You can choose from our fine selection of Linens or you can find your linens elsewhere. We would prefer you to use our products and we will do whatever we can to accommodate your needs. These Linens are solid colors and made of polyester.
If you would like to choose a color, make sure you have determined what type of chairs you will be using in order to match your table Linens.


A few weeks ago our Roomba 780 started giving us "error 5 right".
So we flipped it over, pulled both wheels and cleaned them. But I noticed something odd with the right wheel. When the battery is removed both wheels rotate OK, but when I put the battery back in the right wheel becomes harder to turn.
I ordered a new right wheel but it did not fix the problem, so I sent it back. iRobot wants $400 for a replacement 780 body only. Is there something else I can do to resolve this right wheel issue?
hotdog88gt wrote: ...our Roomba 780 started giving us "error 5 right". ...I noticed something odd with the right wheel. When the battery is removed both wheels rotate OK, but when I put the battery back in the right wheel becomes harder to turn. ...a new right wheel ... did not fix the problem, ... Is there something else I can do to resolve this right wheel issue?
Yes, there is another option that involves locating a faulty mobo component, heating up your soldering iron and replacing it.
Great trouble report, and fix-attempt given in your OP!
Your Wheel-Module-in-robot finding (more effort to turn wheel) implies its motor is being lightly powered by the System. There is insufficient voltage being applied to cause rotation of the motor's shaft, is why I say "lightly powered". However, that does suggest there has been a failure of (at least one) power transistor in what is called the motor's H-bridge (of four power xstrs). Search this site for bridge and read about it. All that is said about the 500 series, specific to H-bridge, should also apply to your 780.
You say the "motor's H-bridge". This is external to the wheel module?
Yes, external. All motors' H-bridges are located on Roomba's main-board = mobo = main_PCA; and for wheel-motors and the main_brush motor they are easily seen on 5XX mobos. However, the 7XX series has muddied that main-board name (due to additional large PCAs that are close-coupled/connected to what is actually its main-board), and it appears that bridge transistors may have been changed to other packing forms.
vic7767 posted a picture showing inside a 7XX chassis. I'll try to find a link to it. Meanwhile, follow my recommended search for "bridge" to learn about the 5XX Roomba work that has been done. I do not know of any repair studies for the 7XXs to reference--you are the pathfinder!
This is an annoying .GIF format with three images in it. You want to study the image showing much of Roomba's chassis. I expect the largest board to be the "Main_PCA". Most likely, the motor-controllers will be mounted to its bottom face.
I should point out that I know nothing about the 7XX-series, except what I have read in these forum posts; AND, only a short time passes before the memory of having read them vanishes.
Last edited by Gordon on February 1st, 2014, 4:46 pm, edited 1 time in total.
Here are some better images of a 760 PCA including the underside. I had never disassembled a 7XX down to where the underside could be viewed. To my surprise I did not observe any of the larger TO-220 style H-bridge components.
Thnx vic, I will attempt to outline suspected SMD PWR xstrs that provide H-bridge service. What I say in this post is all tentative, since I am writing about what I think I see in your two views (upper face and bottom face) of the 7XX main_PCA. I do not plan to say anything about the smaller User-Interface PCA (UI_PCA). No longer can we spot motor H-bridges by looking for the H-shaped layout of power transistors, and four adjacent power diodes that dissipate generated energy when power to a motor is abruptly switched off.
The 7XX's main_PCA appears to be using two each 8-pin SMDs for each large-motor bridge. Examples are: Q83 & Q84 (main_PCA, upper face, front/left, looking like Lft Wheel Motor). Since only two packages per motor are seen on the board, each package contains two xstrs, BJTs rather than FETs, one PNP and one NPN with common collectors. All pins on on side of the SMD package are soldered to healthy copper heat sinks expanses. Also, very likely, we will learn that each transistor has its collector and emitter shunted with a suppressor diode that is ordinarily seen separate.
Those diode suppress voltage generated by a motor shaft rotating to a stop.
The Side Brush Motor continues to use four TO-92 cased BJTs, and four discrete power diodes to form that motor's steering bridge. ORG indicates the Side Brush Module's spring contacts and discrete xstrs and diodes, all seen mounted on the bottom face of the main_PCA. Nominally the same layout as seen for the R3 main_PCA.
As I said above, I have not held this hardware in my hands to inspect it, therefore I could easily have made some errors in what I am reporting.
See if you can read ID numbers on Q83 & Q84 (main_PCA, upper face, front/left, looking like Lft Wheel Motor).
Last edited by Gordon on February 1st, 2014, 11:00 pm, edited 1 time in total.
Edited to remove the PNP/NPN example half-bridge that was shown in this space prior to obtaining the actual STMicroelectronics part number of the board mounted components.
Last edited by Gordon on February 2nd, 2014, 1:15 am, edited 1 time in total.
I will look for the markings on the Qs when I get a chance to open up the 760 again. I took some image shots and put the Roomba back together and then discovered that the pictures do not reveal the detail quality I anticipated.
vic7767 wrote: I will look for the markings on the Qs when I get a chance to open up the 760 again. I took some image shots and put the Roomba back together and then discovered that the pictures do not reveal the detail quality I anticipated.
Great! Those images are high enough rez to read some board markers, but not to resolve very many of the IC's package/case markings.
My present feeling regarding failure of any of these SOIC-8 (H-bridge halves) that iRobot's EE-packaging engineer has applied to 7XX's main_PCA is: Failure due to board-design and/or component specifications seems highly remote; and, if any were to fail, I would have to ask if the duff device had been formed at a 3rd-party silicon-foundry (i.e., a low reliability 'knock-off').
My current level of confidence in 7XX's H-bridge semiconductors (including their good-looking PCB heat-sinks) translates into a higher EE-qualification level for troubleshooting OP hotdog88gt's (possibly) powered wheel motor!
Here is another image of an area of the PCA where the Left drive motor and Brush deck motor H-bridge components are mounted. A little lighting and lens angle trickery was needed in order to capture the stamped part numbers.
Last edited by vic7767 on February 1st, 2014, 9:50 pm, edited 1 time in total.
vic7767 wrote: ... A little lighting and lens angle trickery was needed in order to capture the stamped part numbers.
That oblique LOS & lighting is frequently needed to resolve IC markings.
RdsOn values of 0.018 ohms and 0.045 ohms, both at MAX currents that would not normally be reached in Roomba, insures much lower RdsOn values when operated way below five or eight amperes!
Pairs of this half-bridge device are grouped in three places around the board to provide H-bridge service to both wheel motors, and to the CHM's main-brush-motor.
vic's image also provides locations for pairs of protective (bridge FETs' protection) power diodes that are required to snub generated voltage when a motor's speed quickly slows. When a bridge is built with bipolar xstrs, each xstr is shunted with a protection diode, totaling four diodes per bridge. On this 7XX board the designer decided to use the FETs' "body diodes" (they are shown in the above data-sheet snippet) in one bridge-half for its protection. But, in the opposite half, the body diodes are supplemented with parallel connected discrete diodes (mounted to the PCB's underside). Curious doings.
I believe I see a total of 8 dual diodes, each connected to two drain pins?
Mike, I take it you are pointing to the SOT-23 style diode packages such as D207 & D209 with "Z6" marking. If so, those dual diodes connect power FETs' gates to sources.
To see the power diodes that handle motor generated voltage look inside the small colored rectangles that I marked on a copy of vic's main_PCA bottom-face image, here: viewtopic.php?p=121853#p121853.
Two cases sizes continue to be in use: 1) Diode-Outline size 0.1"-dia x 0.2" LG (like a 1N1007), for small motors; and 2) Diode-Outline size 0.13" x 0.25" LG (between 1N1007 and 1N5401 outlines) for the CHM Brush-motor. Thus, 2 of O/L(2) for the CHM, and 4 of O/L(1) for the wheel motors is what I see.
The Side Brush bridge appears to be identical to that used for 500-series, hence makes use of four O/L(1) diodes--which I did not include in my report of "six" in association with the new MOSFET half-bridge, SO-8 package devices. The Side Brush is out of scope for this thread.
Somewhere on the board will be located a transistor switch (no bridge reversing required) for the fan motor, and with it there will be an O/L(1) diode around the fan motor. The Bin Fan is out of scope for this thread.
Hello, guys, I have currently two opened 780, both after water damage, first has dead CHM, second, dead CHM and right wheel, 7xx board is hard to measure due to heavy tin oxidation, I have to srub pins to measure anything. I believe it's lead free tin - oxidates as hell.
All four are marked as on attached photo C3035LD.
pawel2m wrote: Hello, guys, I have currently two opened 780, both after water damage, first has dead CHM, second, dead CHM and right wheel, 7xx board is hard to measure due to heavy tin oxidation, I have to srub pins to measure anything. I believe it's lead free tin - oxidates as hell.
Have you confirmed that the CHM motor is working by using a 9V battery?
If not, test it first.
If the CHM motor is not turning, turn the motor by hand to clean the motor brushes and rotor contacts.
Make sure the CHM motor is working before changin components.
Of course, CHM works fine in other Roomba. I have compared attached photos of 760 board with my 780 and I can confirm that they share the same mobo, the only difference is in add-on scheduling board where 770 has no Wifi module and no soft touch buttons.
Thx, when I buy and replace the C3035LD / STS8C5H30L I will let you know if it helped.
Last edited by pawel2m on February 15th, 2014, 7:35 am, edited 1 time in total.
pawel2m wrote: Thx, when I buy and replace the C3035LD / STS8C5H30L I will you know if it helped.
Hello pawel2m. I tend to think that replacement of the dual MOSFETs bridge xstrs is a hasty decision. IOW, those dual FETs should not have been damaged by water, but possibly their Gates could be shunted by corrosion products that precipitated around their pads and over to nearby pads(?). Hence, replacement of the FETs' package may not overcome Roomba's problems.
You should be able to make a series of powered electrical measurements that verify FET Gates are HI when need be and LO when need be. If they don't change when a motor is commanded (by the MCU) to operate, you would shift your points of checking to the BJT xstrs that drive the FET Gates. If their Base terminals are not active (following a command change) you would shift attention further upstream toward the MCU, and so on.
...as a template. Of particular importance in that R3-circuit is the use of a 74HC02 Quad NOR-gate to interface MCU ports to each motor's bridge inputs. Try to locate that device, or a similar quad NOR-gate IC near your brush-motor's H-bridge--this is a CMOS device that could be susceptible to shunt resistances formed on the PCB by drying of liquid contaminants.
What? You don't know what the signals should look like on that troubled bridge circuit? Find out by doing the measurement(s) of interest on a motor-bridge (use a wheel-motor's bridge to aid learning) that does work!


text:
w w w . s c h u m i n w e b . c o m
Journal RSS Feed
@SchuminWeb
Anti-war (37)
Black bloc (21)
Project Chanology (53)
World Bank (16)
Kia Soul (15)
Mercury Sable (40)
New car (6)
Toyota Previa (34)
CFW (6)
Giant Food (2)
Howard Johnson's (10)
Martin's (8)
Safeway (4)
Sheetz (4)
DC trips (120)
Roads (25)
▼Family (142)
►Fire alarms (53)
Fire drills (14)
▼Friends (179)
Elyse (49)
Katie (30)
Bedroom remodel (38)
Move to DC area (14)
New porch and floors (8)
LPCM (9)
►Myself (145)
Personal health (43)
DC area local news (14)
Virginia local news (22)
Copyright infringement (10)
►Anne Arundel County (6)
►Frederick County (8)
Montgomery Village (6)
Olney (9)
Silver Spring (26)
Wheaton (11)
Asbury Park (7)
Breezewood (2)
Centralia (2)
Harrisburg (3)
Afton Mountain (18)
►Hampton Roads (16)
Virginia Beach (15)
Harrisonburg (13)
Lake Moomaw (4)
Lynchburg (4)
►Northern Virginia (34)
Arlington (22)
Fairfax County (2)
Loudoun County (6)
Roanoke (19)
Staunton (20)
Stuarts Draft (37)
Waynesboro (20)
National politics (57)
State and local politics (20)
►Popular culture (266)
►Netculture (95)
Homestar Runner (18)
Reddit (10)
Power Rangers (18)
Today's Special (36)
Amtrak (21)
MBTA (3)
MTA Maryland (3)
New York Subway (4)
NJ Transit (2)
PATCO (3)
Ride On (17)
WMATA (217)
►Recreation/Exercise (51)
Restrooms (1)
JMU (58)
Schumin Web meta (191)
Arundel Mills (4)
Gas prices (8)
Some people (39)
Urban exploration (11)
Vacations (37)
Video Journal (18)
►Vintage business (37)
Converted buildings (2)
Outlet Village (8)
Shenandoah Acres (2)
Skyline Parkway Motel (6)
Staunton Mall (11)
Tropical systems (7)
►Winter weather (51)
Snowmageddon (8)
Snowpocalypse (8)
So I had a fun weekend…
I certainly had fun this past weekend, spending it in Stuarts Draft. The goal was twofold: to attend the wedding of Patrick Jarrett and Anna Duncan, and to help Mom clean out some of the junk in the house in preparation for new flooring in the bedrooms.
Coming down, I took I-66 to I-81, on what had to have been one of the least stressful runs ever. Seriously, the ride went better than I've had in a long time. I made really good time, and I reached Waynesboro before you knew it. I only made two stops. At the second one, at the southbound rest area near New Market, I got an interesting picture:
Anyone want to guess what this is? Anyone have any idea what this might be? I'm stumped, and my gut reaction was joking to myself that BP has been busy, spilling more oil.
Before stopping home, though, I visited Katie. We ordered from Buffalo Wild Wings and had it to go, and I had dinner with Katie and her mother at Katie's house. Fun times.
And then off to Stuarts Draft. We got stuff going in the laundry (I usually bring laundry with me because I don't have to feed quarters into their washer), and that was pretty much it.
The next day, we had the wedding in the evening. But first, some cleaning needed to be done. My job was to determine the usefulness and fate of various items in my former bedroom. What is (whatever), and do I still want/need it? We went through a lot of stuff. Mom was surprised about some of the stuff I got rid of, and some of what I kept. We also went through some other boxes of stuff, where we found this:
Yeah, we found an action figure of Tommy the Power Ranger as Zeo Ranger V, and of Kimberly as the Pink Ranger. We sent these photos to Sis in Chicago, who commented that Kimberly had quite the man-body going on there. I suppose that whoever made the toy used the same mold for all the rangers (except Tommy, because he never had a standard uniform during the Mighty Morphin era). Note, however, that the Mighty Morphin Power Rangers never had their power coin symbols on their chests in the television show. While that was on just about all the merchandise and such, it was never on the television show. The first movie had the symbols on the chests, but it was only about fist-sized, and besides, the movie wasn't part of the TV show's storyline anyway. If it was, we would have had Dulcea fighting monsters in giant size next to the Ninja Megazord (much to the delight of the male viewers, I'm sure), rather than Ninjor (who sounded like Dudley Do-Right). We also found a whole bunch of other Power Rangers memorabilia and toys there, including a "morphing" Yellow Ranger toy, where you could set it with Trini's head sticking out (though she looked more like Michael Jackson than Thuy Trang), and then press a button, which would flip the head around, showing the Yellow Ranger helmet.
Then later, we went to my ex-store because Mom needed to get some things. I wanted to see what it looked like post-remodel. And the store certainly looked different:
Compare to how it used to look:
And for the record, that new "Walmart" logo certainly looks like where the sun don't shine. I believe that with this new logo, they forgot to include the hands, best illustrated by this picture that I found online:
Image: Mike D. in a comment to a post on Clusterflock
Yes, I said it, but it's true. That's what it looks like. And no, I'm not going to tell you what this picture is based on. Go look it up.
And of course, they did a few things that were stupid in the remodel, as is to be expected. Back in 2004, the safety team, which I was on, had the cart corrals in the parking lot bolted down to prevent them from moving around when hit, since Wal-Mart won't get a cart corral that is heavy enough to stay in one place on its own. In the remodel, they put new cart corrals in, and they were loose, and from what I could tell, they had shifted:
Lesson obviously not learned, as the new cart corral had already shifted enough to move into the parking space next to it. They say "not responsible for damage done by carts", but what about damage done by the cart corral?
Then after going to Wal-Mart, we did some more cleaning, and then it was time to go to the wedding. So Mom and I got dressed up, and we were ready to go. Dad got our picture:
We looked pretty sharp, no? I added a suit jacket to this for the wedding, which I put on when we got there.
The wedding, held at the First Bretheren Church in Buena Vista, was beautiful, as Anna was given away by both her father and her grandfather. There was even a live musical group, which provided the music for the ceremony. We also got to visit with a couple that we knew from church, and also with a former Wal-Mart coworker of mine.
Then after the wedding, everyone headed to the reception at Glen Maury Park. The reception was at the double decker pavilion. The seating was pre-assigned, and we were at Table 15. Mom and I were listed as "Mr. and Mrs. Ben Schumin", which we found amusing. We had a lot of fun. Our tablemates were a family from Buena Vista, and we had a great time talking to them. The food was excellent, and both Mom and I drank way too much iced tea, as we were both up until 1:00 that night. We were seriously buzzed from the caffeine. One of the perks of drinking icea tea in the evening, I suppose. We also got to talk with Patrick, Anna, and Patrick's parents, who were all glad that we could make it. We departed once the dancing got going, since neither Mom or I really could dance, plus it was starting to get late. So we wished Patrick and Anna a happy honeymoon (a cruise!), and that we should all get together again some time, and then we headed out.
Then on Sunday, I got ready to head back to Washington. We got the laundry together, and also filled a tub with whatever junk I was planning to take with me to Maryland. It's times like this where I say that I never realized I had this much junk. And most of it is junk, too, but junk that I'm not quite ready to part with just yet.
And then I was off. The drive home, via US 29, was more stressful than the drive down, but then again, you can't really beat the stress-free drive that I had coming down. This was a Sunday afternoon, and people had places to go. But the part that I expected would be most stressful – Northern Virginia – was actually pretty tame. So that was good. And the air conditioning didn't spaz out on me, which I appreciated (thank you, car, for that).
And now I can set my sights on next weekend, when Mom and I head out to Chicago for a week…
Web site: AARoads guide to Interstate 81 in Virginia - I traveled southbound from Warren County where I-81 meets I-66 to Augusta County.
Song: iJustine goes to Harris Teeter. Funny - she sees this store as all southern, but I've always considered it more upscale and "yuppie", where the customers generally don't have southern accents...
Quote: Unrelated: I took the exercise bike for its maiden voyage today. I believe I can handle this. I did a 20-minute workout on a low setting, and watched Left of the Dial, a documentary about Air America Radio while I did it. Not bad. I think this exercise bike and I will get along just fine.
Categories: Family, Friends, Katie
Search The Schumin Web:
The Schumin Web © 1996-2021 Schumin Web Design
Please see the Content Licensing page if you wish to reuse material from this site.


My partner and I stumbled over here coming from a different web page and thought I may as well check things out. I like what I see so now i am following you. Look forward to exploring your web page yet again.
Pretty component of content. I just stumbled upon your weblog and in accession capital to assert that I acquire in fact loved account your blog posts. Any way I'll be subscribing on your augment or even I achievement you access consistently fast.


Foundation Home Loans have launched a new range of flat fee products across our Buy to Let range today. These complement their existing products and will give greater choice.
The new 2 and 5 Year Fixed Rates all come with an arrangement fee of £1,995. These are available to Individuals and Limited Companies.


text:
Joint programs
By Mary McGuire	• 14 years ago
Recently a number of universities have begun working with local community colleges to offer joint or "hybrid" programs. Here is a list with links.
VISITORS TO THIS PAGE PLEASE NOTE:The brief descriptions of the programs above were written based on information found at each school's website. If the information is incomplete, out of date or incorrect, please let us know.
See University programs
See College programs
University of Ottawa / Algonquin College / La Cité Collégiale
In Ottawa, the University of Ottawa offers a four-year Bachelor of Journalism program in conjunction with Algonquin College and La Cité Collégiale. Students take courses at both campuses, to receive practical instruction and workshop courses in print, radio, television and online journalism, along with a series of academic and lecture-based courses to prepare them to work as journalists. Student can either complete 75% of their credits at the University of Ottawa, then transfer to Algonquin College to obtain a diploma in journalism, or they can split their time between the two institutions evenly, beginning at the University of Ottawa. Approximately 25 students are admitted to the undergraduate program each year. This program is also open to students who have already graduated from Algonquin College with a journalism diploma.
University of PEI / Holland College
In Charlottetown, the University of PEI, in cooperation with Holland College, offers a four-year Bachelor Applied Arts in Print Journalism. Students acquire technical training and practical experience in Journalism (primarily during study at Holland College) and also receive a series of academic and lecture-based courses to prepare them to work as journalists. The program differs from a Bachelor of Journalism program, which normally has a more theoretical orientation in exploring the nature of the media. Students normally undertake one year of study at the University, then complete the two-year Journalism program at Holland College (earning a Holland College diploma), before undertaking a final year of study at the University. The final year of study normally includes an opportunity for journalistic writing either at the University or arranged through Holland College.
University of Regina / Medicine Hat College
The University of Regina, in conjunction with Medicine Hat College, offers a four-year Bachelor of Journalism program. Medicine Hat College offers the first 20 pre-journalism courses towards a Bachelor of Arts and the next two years are spent at the University of Regina, in which all students receive practical instruction and workshop courses in print, radio, television and online journalism, along with a series of academic and lecture-based courses to prepare them to work as journalists. Approximately 26 students are admitted to the program each year.
University of Guelph/Humber
The University of Guelph, in cooperation with Humber College, offers a four-year Bachelor of Applied Arts with a diploma in Journalism. Students receive practical skills training in print, radio, television and online journalism along with a series of academic and lecture-based classes that examine the nature and role of the media in society.
University of Toronto / Centennial College
The University of Toronto, in cooperation with Centennial College, offers a four-year Bachelor of Arts in Journalism. In addition to completing the requirements for the degree, students have the option of qualifying for a diploma from Centennial College by undertaking one additional semester in a field placement and completing a short, non-credit course on journalism career management at Centennial. Courses are taught at U of T Scarborough and at two campuses of Centennial College (the HP Science and Technology Centre at Morningside and Ellesmere and the Centre for Creative Communications in East York). Centennial courses are taken in the third and fourth years of the program, in which all students receive practical instruction and workshop courses in print, photo and online journalism as well as layout and design.
University of Western Ontario / Fanshawe College
The joint program at the University of Western Ontario and Fanshawe College was suspended in 2016.
Media Theory and Production (MTP): This is a four-year joint program in the Faculty of Information and Media Studies at the University of Western Ontario and Fanshawe College in London, Ont. Students receive a three-year B.A. in Media, Information and Technoculture and a two-year college diploma concurrently. Students take classes in media theory, such as Advertising and Society and The Global Political Economy of Information. After their first year, students specialize in one of four streams: Multimedia Design and Production, Broadcasting Television, Broadcasting Radio, and Journalism Broadcast. Admission to each of the specializations is competitive and depends on students' performance in the first year of the program. The program is a combination of theory and practical instruction. Note: students who wish to pursue university-level graduate studies must take an additional year of university at Western or another institution to earn a four-year university degree. The MTP program is intended for students who wish to move into media-related employment upon graduation.
University of Winnipeg / Red River College
The University of Winnipeg, in cooperation with Red River College, offers a Bachelor of Arts in Communications and a Creative Communications Diploma. Generally students begin at the University of Winnipeg, completing at least 60 credit hours before proceeding to Red River, where they take the two-year Creative Communications Program. At Red River College, all students receive practical instruction and workshop courses in print, radio, television and online journalism, along with a series of academic and lecture-based courses to prepare them to work in the fields of journalism, broadcasting, advertising and public relations.
York University / Seneca College
Seneca College and York University offer a joint program which enables students to earn a Seneca diploma in Journalism – Broadcast and a York University Bachelor of Arts Degree. This program is for students who have completed two years of a B.A. program, or three years of an honours B.A. program at York University.
Mary McGuire
The University of King's
The University of King's College is nowhere to be found in your list of journalism schools. As the oldest university in Canada and a prominent school, I think it's only appropriate that you include it.
Heather McCall
You'll find the University of
You'll find the University of King's College in its alphabetical place (under "U") on our list of undergraduate university programs. (King's is a major collaborator in this project – see our Law section – so we could never forget it.)
I am a graduating
I am a graduating student in the Media, Theory, and Production collaborative program between Fanshawe College and the University of Western Ontario in London, Ontario. Students receive a three year degree from Western and a two year diploma from Fanshawe in one of four streams: Television – Broadcasting, Broadcasting – Radio, Journalism – Broadcast, or Multimedia and Design. The program is four years and has already processed two groups of graduates. You can find all of the information on UWO's website.


Amarth's very presence inspired Geoffrey.
Those uses his Playstation 3 as a Blu-ray player.
I wish to see Rand immediately.
Arnold is filling a bottle with water.
I taught French to Jiri three years ago.
Marsha might have fooled you, but he won't fool me!
Bruno's favorite sport is baseball.
Antonio put his hands on Sanjeev's shoulders and looked deeply into her eyes.
What was your relationship with Roberta?
Lori is smoking his pipe.
Panacea is a very serious guy.
Dirk and Charles are both determined to make the best of this situation.
I came here to tell you that I found Sehyo.
Rajarshi left his son a fortune.
Rodent was in the pool swimming laps.
Lawrence admitted he didn't like Murat very much.
I told Space the whole story.
Vishal began to feel faint.
I think Stefan is fair.
Stephen isn't planning to go, but Neil is.
Rahul schemed to destroy the project.
Kyle called himself the Master of the Universe.
It's amazing, just like that.
There's nothing Stanislaw hates more than lying.
You seem to know a lot about Deirdre and his family.
Should I go talk to Erick?
Alf has not earned such treatment for any of his actions.
Do you know where Sedat lives?
Valentin couldn't remember, but Kamiya did.


programmes | Really useful stuff that I bump into…..
Really useful stuff that I bump into…..
July 2015 Update: Please read this article FIRST.
For those trying (and failing) to download radio programmes via get_iplayer, Peter has very kindly responded with a solution here.
Starting 30th Oct 2014, the BBC removed the previous way they published iPlayer RSS and Feeds to make way for a new API called Nitro – and it has broken a lot of third party apps (including the iPlayer plugin for XBMC). This has naturally caused a LOT of upset.
Once the download is complete, RIGHT CLICK on the file in Windows Explorer and select Properties (should be right at the bottom of the drop-down box that appears).
Click on the Details tab and click in the title box to edit it to be the name of the downloaded programme. This will enable it to show up with the correct name in whichever video player you use.
Stuff you might have missed ….
1. An app to manage Homeplugs that is manufacturer agnostic.
2. An app that can interrogate Homeplugs and show error/noise/interference info and stats.
3. An app that will show current live data point-to-point paths between my PC and external connections like a radar display - where the thicker the coloured line on the radar display, the greater the bandwidth used by data traversing that path.


Senior portraits are kicking off early this year! As you all know, seniors are my FAV! That's no secret! I've been so lucky to book and bunch of AWESOME senior models for the upcoming year! I've also scheduled a lot of regular senior clients as well, making my fall officially FULL! That's right- aside from my senior models who I have held a few spots open for, my calendar is completely booked until 2015. But don't fret- I still have multiple spots open for 2015 seniors who want to complete their session in the months of January, February, or March. 🙂 Phew, it is going to be a whirlwind season and I can't wait!
Nearly two weeks ago, I put out an announcement pertaining to my 2015 senior rep program. The response was overwhelming and amazing! I received SO MANY applications from people wanting to participate! I am so grateful for all of the applicants and really, truly appreciate all of the wonderful potential clients that I have. While I wish I could select all of the boys and girls who signed up, I cannot. My space and time are limited. Therefore I have chosen only a fraction of fabulous guys and gals for this year.
If you contacted me about being a senior rep and were not chosen, I sincerely still hope that you will call me when it comes time for your senior portraits. ALL of you guys are so great! As I said before, I simply had so many applicants and could not possibly chose them all.
And to my new senior reps- CONGRATS! I will be contacting you guys soon to start setting this whole process into motion, so please check your e-mail tonight. I cannot wait to see all of your beautiful faces for our senior model shoot in September!