Таблица символов, или Связующая нить
Алексей Вторников
// Таблица символов (первый вариант)
import java.util.*;
public class SymbolTable {
public TreeMap symtab;
public SymbolTable () {
symtab = new TreeMap ();
}
// Найти символ в таблице символов и увеличить на 1
// значение счетчика; если такого символа нет,
// то добавить новый символ в таблицу символов
// и инициализировать значение счетчика 1:
public void incValue (String name) {
if (symtab.get (name) != null) {
int count = (Integer) symtab.get (name);
symtab.put (name, ++count);
}
else {
symtab.put (name, 1);
}
}
// Вспомогательный метод распечатки содержимого
// таблицы символов:
public void printSymbolTable () {
Set > entries = symtab.entrySet ();
System.out.printf ("+---------------+----------+\n");
for (Map.Entry entry : entries) {
System.out.printf ("|%15s|%10d|\n", entry.getKey (), entry.getValue ());
}
System.out.printf ("+---------------+----------+\n");
}
}
public class Test {
public Test () {
SymbolTable stab = new SymbolTable ();
stab.incValue ("81.200.56.45" );
stab.incValue ("151.36.14.207" );
stab.incValue ("101.175.18.138");
stab.incValue ("81.200.56.45" );
stab.incValue ("81.200.56.45" );
stab.incValue ("81.200.56.45" );
stab.incValue ("81.200.56.45" );
stab.incValue ("101.175.18.138");
stab.incValue ("101.175.18.138");
stab.incValue ("101.175.18.138");
stab.incValue ("81.200.56.45" );
stab.printSymbolTable ();
}
public static void main (String [] args) {
new Test ();
}
}
public TreeMap symtab;
...
; Загрузить данные:
1000: START: MOV DATA, R1
1002: MOV R1, @TEMP
1004: TST
1005: BZ NEXT
...
1200: NEXT: ADD TEMP, #1
...
; Продолжить обработку:
1220: BR START
...
; Данные:
2000: DATA: 1
2001: 50
2002: -54
...
; Ссылка на адрес временной переменной:
3000: TEMP: 200
1000: START: MOV NUMBERS, R1
// Таблица символов (второй вариант):
import java.util.*;
public class SymbolTable {
public static TreeMap symtab;
public SymbolTable () {
}
// Статическая инициализация: заполнить таблицу
// символов ключевыми словами ассемблера:
static {
symtab = new TreeMap ();
symtab.put ("ADD", new Attributes ('K', 0, false, 10));
symtab.put ("BR", new Attributes ('K', 0, false, 56));
symtab.put ("MOV", new Attributes ('K', 0, false, 13));
}
// Тип символа. Возвращает «K» для ключевых слов
// или «L» для меток:
public char getType (String name) {
Attributes f = (Attributes) symtab.get (name);
char type = (f != null ? f.getType () : '-');
return type;
}
// Номер строки исходного кода, в которой определена
// метка:
public int getLine (String name) {
Attributes f = (Attributes) symtab.get (name);
int line = (f != null ? f.getLine () : 0);
return line;
}
// Признак перемещаемости символа:
public boolean isRelocatable (String name) {
Attributes f = (Attributes) symtab.get (name);
boolean tpe = (f != null ? f.isRelocatable () : false);
return type;
}
// Значение символа. Если символ в таблице нет,
// то возвращается -1
public long getValue (String name) {
Attributes f = (Attributes) symtab.get (name);
long value = (f != null ? f.getValue () : -1);
return value;
}
// Добавить имя в таблицу символов:
public boolean putSymbol (String name, char type, int line, boolean relocatable, long value) {
if (symtab.get (name) == null) {
symtab.put (name, new Attributes (type, line, relocatable, value));
return true;
}
System.out.println ("Duplicated symbol " + name);
return false;
}
// Распечатать содержимое таблицы символов:
public void printSymbolTable () {
Set > entries = symtab.entrySet ();
System.out.printf ("+---------------+-+------+-+----------------+\n”);
for (Map.Entry entry : entries) {
String key = entry.getKey ();
char symbtype = getType (key);
System.out.printf ("|%-15.15s|%1s|%6d|%1s|%16s|\n",
key,
symbtype,
getLine (key),
(isRelocatable (key) ? "T": "F"),
getValue (key));
}
}
System.out.printf ("+---------------+-+------+-+----------------+\n”);
}
// Атрибуты элемента таблицы символов:
class Attributes {
private final char type; // Тип символа
private final int line; // Номер строки
// Признак перемещения
private final boolean relocatable;
// Значение (адрес или число)
private final long value;
Attributes (char type, int line, boolean relocatable, long value) {
this.type = type;
this.line = line;
this.relocatable = relocatable;
this.value = value;
}
// Методы доступа к атрибутам:
public char getType () {return type;}
public int getLine () {return line;}
public boolean isRelocatable () {return relocatable;}
public long getValue () {return value;}
}
public class Test {
public Test () {
SymbolTable stab = new SymbolTable ();
stab.putSymbol ("START", 'L', 1, true, 1000);
stab.putSymbol ("DATA" , 'L', 10, false, 2000);
stab.printSymbolTable ();
}
public static void main (String [] args) {
new Test ();
}
}
-----------------------------------------------------------------------------------------------------------------
Возможности ILD. Инициализация логики по требованию
Александр Майоров
Exceptions (здесь лежат классы с исключениями);
Import (классы сторонних разработчиков);
Shared (некие общие классы, используемые на разных проектах);
Core (классы вашего проекта) –
|-- Cache
| |-- CCache.php
| |-- _
| | |-- Controller
| | | |-- CCache_Controller.php
| | | |-- ICache_Controller.php
| | | `-- init.php
| | `-- Engine
| | `-- _
| | |-- EAccelerator
| | | |-- CCache_Engine_EAccelerator.php
| | | `-- init.php
| | |-- File
| | | |-- CCache_File.php
| | | |-- _
| | | | `-- Engine
| | | | |-- CCache_File_Engine.php
| | | | `-- init.php
| | | `-- init.php
| | |-- Memcache
| | | |-- CCache_Engine_Memcache.php
| | | `-- init.php
| | `-- XCache
| | |-- CCache_XCache.php
| | `-- init.php
$name' not defined!");
require_once $f;
}
return call_user_func_array($foo, $args);
}
private function __construct(){}
private function __clone(){}
private static $I;
public static function Init()
{
self::$I
or self::$I = new self;
return self::$I;
}
}
?>
function __cf__foo_name() { ... }
function_name()
?>
class F
{
public static function __callStatic($methodname, $arguments)
{
...
}
}
-----------------------------------------------------------------------------------------------------------------
Управление сайтом. Взгляд на систему изнутри
Александр Слесарев
CREATE TABLE `module` (
`module_id` int(11) NOT NULL auto_increment,
`name` varchar(64) NOT NULL default '',
`description` text NOT NULL,
`path` varchar(255) NOT NULL default '',
`admpath` varchar(255) NOT NULL default '',
`access` enum('n','y') NOT NULL default 'n',
PRIMARY KEY (`module_id`)
);
CREATE TABLE `template` (
`template_id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`path` varchar(64) NOT NULL default '',
`file` varchar(64) NOT NULL default '',
PRIMARY KEY (`template_id`)
);
CREATE TABLE `part` (
`part_id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`template_id` int(11) NOT NULL default '0',
`position` int(11) NOT NULL default '0',
`in_menu` enum('visible','hidden') NOT NULL default 'visible',
`is_module` enum('0','1') NOT NULL default '0',
`mod_link` varchar(255) NOT NULL default '',
`mod_id` int(11) NOT NULL default '0',
`default` enum('n','y') NOT NULL default 'n',
`name` varchar(255) NOT NULL default '',
`meta_title` varchar(255) NOT NULL default '',
`meta_description` text NOT NULL,
`meta_keywords` text NOT NULL,
PRIMARY KEY (`part_id`)
);
CREATE TABLE `paragraph` (
`paragraph_id` int(11) NOT NULL auto_increment,
`part_id` int(11) default NULL,
`position` int(11) NOT NULL default '0',
`text` text NOT NULL,
PRIMARY KEY (`paragraph_id`)
);
/**
* Метод, выбирающий раздел из БД
*
* @param integer $id Идентификатор раздела
* @access public
* @return array
*/
public function GetPartCont($id)
{
$data = array();
//Создаем запрос для выбора раздела:
$sql = "SELECT
`p`.*, `pc`.*, `t`.`path`, `t`.`file`
FROM
`part` AS `p`,
LEFT JOIN
`template` AS `t`
ON
`t`.`template_id` = `p`.`template_id`
WHERE
`p`.`part_id` = ".$id;
//Выбираем раздел:
$partition = $this->db->query($sql)->current();
//Выбираем наполнение раздела из таблицы paragraph:
$this->db->where('part_id', $partition->part_id);
$this->db->orderby('position', 'ASC');
$paragraph = $this->db->get('paragraph');
//Заносим полученные результаты в массив:
$data['part'] = $partition;
$data['cont'] = $paragraph;
//Возвращаем полученные значения:
return $data;
}
/**
* Метод, формирующий раздел
*
* @param integer $id Идентификатор раздела
* @access public
* @return array
*/
public function part($id)
{
//Получаем всю информацию раздела с помощью метода модели GetPartCont:
$data['content'] = $this->part->GetPartCont($id);
//Формируем метаданные страницы:
$data['title'] = $data['content']['part']->meta_title;
$data['description'] = $data['content']['part']->meta_description;
$data['keywords'] = $data['content']['part']->meta_keywords;
//Запоминаем идентификатор раздела:
$data['part_id'] = $id;
//Получаем шаблон раздела:
$body = $data['content']['part']->path.'/'.$data['content']['part']->file;
//Выводим полученный раздел в браузер:
$this->compile($body, $data);
}
/**
* Метод, собирающий отображение
*
* @param string $body Контентный шаблон страницы
* @param array $data Массив данных для отображения
* @access public
* @return void
*/
public function compile($body, $data)
{
//Создаем объекты элементов страницы:
//Верхняя часть страницы
$this->head = new View('inc/head', $data);
//Контентная часть страницы
$this->body = new View($body, $data);
//Нижняя часть страницы
$this->foot = new View('inc/foot', $data);
//Вывод в браузер
$this->head->render(TRUE);
$this->body->render(TRUE);
$this->foot->render(TRUE);
}
/**
* Метод, формирующий раздел каталога
*
* @param string $param Идентификатор раздела и каталога
* @access public
* @return void
*/
public function content($param)
{
//Разбиваем параметр на переменные:
list($part_id, $catalog_id) = explode('-', $param);
//Получаем всю информацию раздела с помощью метода модели GetPartCont:
$data['content'] = $this->part->GetPartCont($part_id);
//Получаем информацию из каталога:
$data['catalog'] = $this->content->GetCatalog($catalog_id);
//Формируем метаданные страницы:
$data['title'] = $data['content']['part']->meta_title;
$data['description'] = $data['content']['part']->meta_description;
$data['keywords'] = $data['content']['part']->meta_keywords;
//Запоминаем идентификатор раздела:
$data['part _id'] = $part_id;
//Запоминаем идентификатор каталога:
$data['catalog_id'] = $catalog_id;
//Получаем шаблон раздела:
$body = $data['content']['part']->path.'/'.$data['content']['part']->file;
//Выводим полученный раздел в браузер:
$this->compile($body, $data);
}
CREATE TABLE `language` (
`language_id` int(11) NOT NULL auto_increment,
`name` varchar(64) NOT NULL default '',
`pseud` varchar(8) NOT NULL default '',
`default` enum('n','y') default 'n',
PRIMARY KEY (`language_id`)
);
CREATE TABLE `partcont` (
`partcont_id` int(11) NOT NULL auto_increment,
`part_id` int(11) NOT NULL default '0',
`language_id` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`meta_title` varchar(255) NOT NULL default '',
`meta_description` text NOT NULL,
`meta_keywords` text NOT NULL,
PRIMARY KEY (`partcont_id`)
);
/**
* Метод, выбирающий язык, установленный по умолчанию
*
* @access public
* @return integer
*/
public function GetDefault()
{
$this->db->where ('default', 'y');
$ln = $this->db->get('language')->current();
return $ln->language_id;
}
/**
* Конструктор класса
*
* @access public
*/
public function __constract()
{
parent:: __constract();
//Запуск сессии:
$this->session = Session::instance();
//Инициализация необходимых объектов:
$this->part = new Parts_Model();
$this->settings = new Settings_Model();
$this->language = new Language_Model();
$this->elements = new Templelements_Model();
//Проверка переменной отвечающей за языковую раскладку:
$lang = $this->session->get('lang');
if(empty($lang)){
$lang = $this->language->GetDefault();
}
else{
$lang = $this->session->get('lang');
}
//Запись переменной в сессию:
$this->session->set('lang', $lang);
}
$this->lang = $this->session->get('lang');
/**
* Метод, выбирающий раздел из БД
*
* @param integer $id Идентификатор раздела
* @access public
* @return array
*/
public function GetPartCont($id)
{
$data = array();
//Создаем запрос для выбора раздела:
$sql = "SELECT
`p`.*, `pc`.*, `t`.`path`, `t`.`file`
FROM
`part` AS `p`
LEFT JOIN
`partcont` AS `pc`
ON
`p`.`part_id` = `pc`.`part_id`
LEFT JOIN
`template` AS `t`
ON
`t`.`template_id` = `p`.`template_id`
WHERE
`pc`.`language_id` = ".$this->lang."
AND `p`.`part_id` = ".$id;
//Выбираем раздел:
$partition = $this->db->query($sql)->current();
//Выбираем наполнение раздела из таблицы paragraph:
$this->db->where('part_id', $partition->partcont_id);
$this->db->orderby('position', 'ASC');
$paragraph = $this->db->get('paragraph');
//Заносим полученные результаты в массив:
$data['part'] = $partition;
$data['cont'] = $paragraph;
//Возвращаем полученные значения:
return $data;
}
function ChangeLang(id)
{
$.post('/main/changelang/', {lang_id: id},
function(){location.reload();
});
}
/**
* Метод, выбирающий раздел из БД
*
* @access public
*/
public function changelang()
{
$lang = $this->input->post('lang_id',null,true);
$this->session->set('lang', $lang);
}
| Артикул |
Название |
Описание |
Цена |
foreach($products as $row):?>
echo $row->article;?> |
echo $row->name;?> |
echo $row->description;?> |
echo $row->price;?> |
endforeach;?>
CREATE TABLE `element` (
`name` varchar(255) NOT NULL default '',
`element_id` int(11) NOT NULL auto_increment,
`pseud` varchar(255) NOT NULL default '',
PRIMARY KEY (`element_id`)
);
CREATE TABLE `elvalue` (
`elvalue_id` int(11) NOT NULL auto_increment,
`element_id` int(11) NOT NULL default '0',
`language_id` int(11) NOT NULL default '0',
`value` text NOT NULL,
PRIMARY KEY (`elvalue_id`)
);
/**
* Метод, выбирающий статичные элементы
*
* @access public
* @return array
*/
public function GetAll()
{
//Выбираем статичные элементы:
$data = array();
$sql = "SELECT
*
FROM
`element` AS `e`
LEFT JOIN
`elvalue` AS `ev`
ON
`e`.`element_id` = `ev`.`element_id`
WHERE
`ev`.`language_id` = ".$this->lang;
$res = $this->db->query($sql);
//Формируем массив:
foreach($res as $val){
$data[$val->pseud] = $val->value;
}
//Возвращаем полученный массив:
return $data;
}
$data['element'] = $this->elements->GetAll();
| echo $element['article'];?> |
echo $element['name'];?> |
echo $element['description'];?> |
echo $element['price'];?> |
foreach($products as $row):?>
echo $row->article;?> |
echo $row->name;?> |
echo $row->description;?> |
echo $row->price;?> |
endforeach;?>
CREATE TABLE `setting` (
`setting_id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`pseud` varchar(255) NOT NULL default '',
`position` int(5) NOT NULL default '0',
`value` varchar(255) NOT NULL default '',
PRIMARY KEY (`setting_id`)
);
/**
* Метод, выбирающий конфигурационную настройку
*
* @param string $pseud системный псевдоним
* @access public
* @return string
*/
public function get($pseud)
{
//Выбираем соответствующую настройку:
$this->db->where('pseud', $pseud);
$res = $this->db->get('setting')->current();
//Возвращаем ее значение:
return $res->value;
}
/**
* Метод, добавляющий запись в каталог
*
* @access public
* @return void
*/
public function add_save()
{
//Ширину и высоту загружаемого изображения получаем от пользователя:
$width = $this->input->post('width');
$height = $this->input->post('height');
/*
Максимальный размер загружаемого изображения берем
из конфигурационного файла:
*/
$size = Kohana::config('upload.size');
//Устанавливаем начальное значение файла изображения:
$imgname = '';
/*
Если пользователь не указал размеры изображения,
берем их из наших настроек:
*/
if(empty($width))
$width = $this->settings->get('SmallImgWidth');
if(empty($height))
$height = $this->settings->get('SmallImgHeight');
//Проверяем, был ли выбран файл изображения:
if(!empty($_FILES['image']['name']))
{
//Определяем правила для загружаемого изображения:
$file = Validation::factory($_FILES)->add_rules('image', 'upload::valid', 'upload::type[gif,jpg,png]', 'upload::size['.$size.'M]');
//Проверяем валидность файла:
if($file->validate())
{
//Загружаем изображение:
$filename = upload::save('image');
$imgname = 'img/upload/catalog/'.$filename;
//Изменяем его размеры и сохраняем:
Image::factory($filename)->resize($width, $height, Image::WIDTH)->save(DOCROOT.$imgname);
//Удаляем временный файл
if(file_exists($filename))
unlink($filename);
}
}
//Собираем данные в массив:
$data = array
(
'parent_id' => $this->input->post('parent_id'),
'language_id' => $this->input->post('language_id'),
'name' => htmlspecialchars($this->input->post('name')),
'description' => $this->input->post('description'),
'alt' => htmlspecialchars( ?
$this->input->post('alt')),
'image' => $imgname
);
//Вставляем в БД:
$this->content->InsertCatalog($data);
//Возвращаемся на исходную страницу:
url::redirect('http:/'.url::base().'edit/catalogue/maincatalogue');
}
-----------------------------------------------------------------------------------------------------------------
Bourne Shell. Основные приемы программирования
Рашид Ачилов
# myscript -a text_a -b text_b -c -d
# myscript text_a text_b
help="Run: pinger
var cont='';
var w = new Ext.Window({
title: 'Window',
width: 560,
autoHeight: true,
items: {
title: 'Collapse Me',
height: 560,
collapsible: true,
border: false,
html: 'Trees
',
padding: 40,
listeners: {
beforecollapse: function() {
w.el.shadow.hide();
},
beforeexpand: function() {
w.el.shadow.hide();
},
collapse: function() {
w.syncShadow();
},
expand: function() {
w.syncShadow();
}
}
}
}).show();
collapsible: true,
border: false,
// html: 'Trees
',
contentEl: 'tabs1',
padding: 40,
listeners: {
Ext.onReady(function(){
var store = new Ext.data.ArrayStore({
fields: [
{name: 'name'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pctChange', type: 'float'},
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
]
});
var myData = [
['Samsung N127 (LA01RU)',346.67,0.02,0.03,'9/1 12:00am'],
['Samsung N130 (KA03)',354.9,0.42,1.47,'9/1 12:00am'],
['Samsung N150 (KA02)',358.33,0.28,0.34,'9/1 12:00am'],
['Asus Eee PC 1001PX',370.279,0.01,0.02,'9/1 12:00am'],
['Acer Aspire One (LU.SCM0D.001)',385.799,0.31,0.49,'9/1 12:00am'],
['HP Compaq Mini(WR254EA)',386.73,-0.48,-1.54,'9/1 12:00am'],
['Lenovo IdeaPad S10-3-2KB-B',401.62,0.53,0.71,'9/1 12:00am'],
['Lenovo ThinkPad X100e (NTS4TRT)',442.50,0.92,1.39,'9/1 12:00am']
];
store.loadData(myData);
var grid = new Ext.grid.GridPanel({
store: store,
columns: [
{id:'name',header: 'Name', width: 240, sortable: true, dataIndex: 'name'},
{header: 'Price', width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
{header: 'Change', width: 75, sortable: true, dataIndex: 'change'},
{header: '% Change', width: 75, sortable: true, dataIndex: 'pctChange'},
{header: 'Last Updated', width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
],
stripeRows: true,
autoExpandColumn: 'name',
height: 200,
width: 480,
title: 'My Grid',
stateful: true,
stateId: 'grid'
});
grid.render('grid-example');
});
{header: 'Change', width: 75, sortable: true, renderer: change, dataIndex: 'change'},
{header: '% Change', width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
function change(val){
if(val > 0){
return '' + val + '';
}else if(val < 0){
return '' + val + '';
}
return val;
}
function pctChange(val){
if(val > 0){
return '' + val + '%';
}else if(val < 0){
return '' + val + '%';
}
return val;
}
-----------------------------------------------------------------------------------------------------------------