Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Но для сохранения зрения, лучшее упражнение всё-таки вблизь-вдаль.Джордж Лукас — великий человек! Ещё с 1977 года он начал заботиться о ваших глазах и выпустил уже шесть специальных тренажёров для чтения вблизь-вдаль (под кодовым названием «Звёздные войны»).

Разработали, оттестировали на рабочей машине, на тестовом сервере, выкатили на продакшен и… ничего. Программа данные не качает, молчит, а через некоторое время валится с ошибкой.
Страничный режим книг придуман не просто так, он тысячелетиями отрабатывался.Сомневаюсь, что страничный режим был придуман ради удобства чтения. Скорее ради удобства упаковки и хранения текста компактными кирпичиками книг.
500было бы выведено
слов
в
минуту
без
подготовки
500 словно это лишь в том случае, если подобное «улучшение» не снизит показатели в целом.
в минуту
без подготовки


В точка, как микроосциляции Если точки ней, за
switch (wordLength) {
case 1:
bestLetter = 0; // first
break;
case 2:
case 3:
case 4:
case 5:
bestLetter = 1; // second
break;
case 6:
case 7:
case 8:
case 9:
bestLetter = 2; // third
break;
case 10:
case 11:
case 12:
case 13:
bestLetter = 3; // fourth
break;
default:
bestLetter = 4; // fifth
};
#!/bin/bash
# $1 - считываемый файл
# $2 - скорость (около 0.2 достаточно комфортно)
data=`cat $1`
for i in $data; do
clear
printf " %s" $i
sleep $2
done
package x.mvmn.speedread;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
public class SpeedRead {
private final JFrame mainWindow;
private final JLabel label;
private final List<String> words = new LinkedList<String>();
private static volatile boolean PAUSE = false;
private final JSlider delaySelectSlider = new JSlider(JSlider.HORIZONTAL, 0, 500, 100);
public static void main(String[] args) throws Exception {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null)) {
new SpeedRead(fileChooser.getSelectedFile());
}
}
public SpeedRead(final File selectedFile) {
mainWindow = new JFrame(selectedFile.getName());
mainWindow.getContentPane().setLayout(new BorderLayout());
mainWindow.getContentPane().add(delaySelectSlider, BorderLayout.NORTH);
label = new JLabel("", JLabel.CENTER);
label.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
label.setFont(label.getFont().deriveFont(50f));
mainWindow.getContentPane().add(label, BorderLayout.CENTER);
{
JButton pauseBtn = new JButton("Pause");
mainWindow.getContentPane().add(pauseBtn, BorderLayout.SOUTH);
pauseBtn.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
SpeedRead.PAUSE = !SpeedRead.PAUSE;
}
});
}
label.setText("Supercalifragilisticexpialidocious");
mainWindow.pack();
label.setText("Reading file " + selectedFile.getName());
mainWindow.setVisible(true);
new Thread() {
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(selectedFile));
String line = reader.readLine();
while (line != null) {
words.addAll(Arrays.asList(line.split(" ")));
line = reader.readLine();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(mainWindow, e.getClass().getName() + " " + e.getMessage(), "Error reading file", JOptionPane.ERROR_MESSAGE);
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (Exception e) {
}
}
Iterator<String> iter = words.iterator();
while (iter.hasNext()) {
while (PAUSE) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
Thread.yield();
}
final String next = iter.next();
try {
SwingUtilities.invokeAndWait(new Runnable() {
Override
public void run() {
label.setText(next);
}
});
} catch (Exception e) {
}
try {
Thread.sleep(delaySelectSlider.getValue());
} catch (Exception e) {
}
}
}
}.start();
}
}
package x.mvmn.speedread;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
public class SpeedRead {
private final JFrame mainWindow;
private final JLabel labelOne;
private final JLabel labelTwo;
private final JLabel labelThree;
private final List<String> words = new LinkedList<String>();
private static volatile boolean PAUSE = false;
private final JSlider delaySelectSlider = new JSlider(JSlider.HORIZONTAL, 0, 500, 100);
public static void main(String[] args) throws Exception {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null)) {
new SpeedRead(fileChooser.getSelectedFile());
}
}
public SpeedRead(final File selectedFile) {
mainWindow = new JFrame(selectedFile.getName());
mainWindow.getContentPane().setLayout(new BorderLayout());
mainWindow.getContentPane().add(delaySelectSlider, BorderLayout.NORTH);
labelOne = new JLabel("", JLabel.RIGHT);
labelTwo = new JLabel("", JLabel.CENTER);
labelThree = new JLabel("", JLabel.LEFT);
// GroupLayout layout = new GroupLayout(labelPanel);
Font font = new Font(Font.MONOSPACED, labelOne.getFont().getStyle(), 50);
labelOne.setFont(font);
labelTwo.setFont(font);
labelThree.setFont(font);
labelOne.setText("Supe");
labelTwo.setText("r");
labelThree.setText("califragilisticexpialidocious");
labelOne.setMaximumSize(labelOne.getPreferredSize());
labelOne.setMinimumSize(labelOne.getPreferredSize());
labelTwo.setMaximumSize(labelTwo.getPreferredSize());
labelTwo.setMinimumSize(labelTwo.getPreferredSize());
labelThree.setMaximumSize(labelThree.getPreferredSize());
labelThree.setMinimumSize(labelThree.getPreferredSize());
labelTwo.setForeground(Color.RED);
JPanel rightLabelPanel = new JPanel(new BorderLayout());
JPanel rightLabelSubPanel = new JPanel();
rightLabelSubPanel.add(labelTwo);
rightLabelSubPanel.add(labelThree);
rightLabelPanel.add(rightLabelSubPanel, BorderLayout.WEST);
JSplitPane labelPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, false, labelOne, rightLabelPanel);
labelPanel.setDividerSize(0);
labelPanel.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
mainWindow.getContentPane().add(labelPanel, BorderLayout.CENTER);
{
JButton pauseBtn = new JButton("Pause");
mainWindow.getContentPane().add(pauseBtn, BorderLayout.SOUTH);
pauseBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SpeedRead.PAUSE = !SpeedRead.PAUSE;
}
});
}
mainWindow.pack();
labelOne.setText("");
labelTwo.setText("");
labelThree.setText("Reading file " + selectedFile.getName());
mainWindow.setVisible(true);
new Thread() {
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(selectedFile));
String line = reader.readLine();
while (line != null) {
words.addAll(Arrays.asList(line.split(" ")));
line = reader.readLine();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(mainWindow, e.getClass().getName() + " " + e.getMessage(), "Error reading file", JOptionPane.ERROR_MESSAGE);
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (Exception e) {
}
}
Iterator<String> iter = words.iterator();
while (iter.hasNext()) {
while (PAUSE) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
Thread.yield();
}
final String next = iter.next();
try {
SwingUtilities.invokeAndWait(new Runnable() {
Override
public void run() {
int hl = getHighlightedCharIndex(next);
if (hl < 0) {
labelOne.setText("");
labelTwo.setText("");
labelThree.setText(next);
} else {
labelOne.setText(next.substring(0, hl));
labelTwo.setText(next.substring(hl, hl + 1));
labelThree.setText(next.substring(hl + 1));
}
}
});
} catch (Exception e) {
}
try {
Thread.sleep(delaySelectSlider.getValue());
} catch (Exception e) {
}
}
}
}.start();
}
private static Pattern LETTER = Pattern.compile("[\\p{L}'`\\-]+($|[^\\p{L}'`\\-])");
private int getHighlightedCharIndex(String text) {
int result = -1;
if (text != null) {
Matcher matcher = LETTER.matcher(text);
if (matcher.find()) {
int indexOfFirstLetter = matcher.start();
int indexOfLastLetter = matcher.end();
int length = indexOfLastLetter - indexOfFirstLetter - 1;
result = indexOfFirstLetter + getHighlightedCharIndex(length);
}
}
return result;
}
private int getHighlightedCharIndex(int wordLength) {
int bestLetter = 0;
switch (wordLength) {
case 0:
case 1:
bestLetter = 0; // first
break;
case 2:
case 3:
case 4:
case 5:
bestLetter = 1; // second
break;
case 6:
case 7:
case 8:
case 9:
bestLetter = 2; // third
break;
case 10:
case 11:
case 12:
case 13:
bestLetter = 3; // fourth
break;
default:
bestLetter = 4; // fifth
}
return bestLetter;
}
}
Обычная скорость чтения на русском языке составляет 120—180 слов в минуту.
#content P {
margin-top: 3pt;
text-indent: 10pt;
color: #FFF;
}html {
font-family: 'PT Sans';
font-size: 25px;
line-height: 1.4em;
background: rgb(240, 240, 240);
}
#pnl-read {
width: 500px;
height: 200px;
margin: 50px auto;
position: relative;
}
#frame {
width: 270px;
height: 2em;
border: 2px solid #555;
border-left: none;
border-right: none;
position: absolute;
left: 25%;
top: 90px;
background: white;
box-shadow: 0 0 0 20px white;
padding-top: 4px
}
#frame:before {
content: '';
display: block;
position: absolute;
top: 0;
left: 66px;
background: #555;
width: 2px;
height: 4px;
}
#frame:after {
content: '';
display: block;
position: absolute;
left: 66px;
bottom: 0;
background: #555;
width: 2px;
height: 4px;
}
#content {
width: 36em;
overflow: hidden;
position: absolute;
}
#content P {
margin-top: 3pt;
color: rgba(220, 220, 220, 0);
}
#content .cur {
color: #333;
}
#content .cur A {
color: #B00;
}
500 слов в минуту без подготовки