spring

[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해

자바 웹 애플리케이션 개발자로서, 여러분은 요청 (HttpServletRequest)과 세션 (HttpSession) 범위를 바로 배우셨을 겁니다. 이들 범위와 데이터, 객체 다루기를 이해하는 것은자바에서 웹 애플리케이션을 디자인하고 빌드하는데 중요한 요소입니다. [리퀘스트와 세션의 범위에 대해서는 스택 오버플로우 게시물을 참조하면 빠르게 배울 수 있습니다]

Spring MVC 범위

Spring MVC에서 웹 애플리케이션을 시작했을 때, Spring 모델과 세션 애트리뷰트는 이해하기 어려웠습니다. 특히, HTTP 리퀘스트와 세션 범위, 거기서 애트리뷰트에 관해서 말입니다. Spring 모델 요소는 세션이나 요청에서 똑같이 나타날까요? 그렇다면, 어떻게 제어할까요? 이 글에서, Spring의 MVC 모델과 세션이 동작하는 것을 파헤치도록 하겠습니다.

続きを読む “[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해”

正規表現レファレンス

はじめ

正規表現(Regular Expression)とは特定の規則を持っている文字列の集合を表現するのに使われている形式言語です。これをうまく使いこなせるなら、コードのラインが確実に減るに違いありません。これから、正規表現の使用例を具体的に調べて、活用方案の例を見てみましょう。

使用例

  • PHPのpreg_match関数
    • $subject = "abcdef";
      $pattern = '/^def/';
      preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
      print_r($matches);
      
  • C#のRegExクラス
    • class TestRegularExpressionValidation
      {
          static void Main()
          {
              string[] numbers = 
              {
                  "123-555-0190", 
                  "444-234-22450", 
                  "690-555-0178", 
                  "146-893-232",
                  "146-555-0122",
                  "4007-555-0111", 
                  "407-555-0111", 
                  "407-2-5555", 
              };
      
              string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";
      
              foreach (string s in numbers)
              {
                  System.Console.Write("{0,14}", s);
      
                  if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
                  {
                      System.Console.WriteLine(" - valid");
                  }
                  else
                  {
                      System.Console.WriteLine(" - invalid");
                  }
              }
      
              // Keep the console window open in debug mode.
              System.Console.WriteLine("Press any key to exit.");
              System.Console.ReadKey();
          }
      }
      /* Output:
            123-555-0190 - valid
           444-234-22450 - invalid
            690-555-0178 - valid
             146-893-232 - invalid
            146-555-0122 - valid
           4007-555-0111 - invalid
            407-555-0111 - valid
              407-2-5555 - invalid
      */
  • JavaのRegExクラス
    • import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class RegexMatches {
      
         public static void main( String args[] ) {
            // String to be scanned to find the pattern.
            String line = "This order was placed for QT3000! OK?";
            String pattern = "(.*)(\\d+)(.*)";
      
            // Create a Pattern object
            Pattern r = Pattern.compile(pattern);
      
            // Now create matcher object.
            Matcher m = r.matcher(line);
            if (m.find( )) {
               System.out.println("Found value: " + m.group(0) );
               System.out.println("Found value: " + m.group(1) );
               System.out.println("Found value: " + m.group(2) );
            }else {
               System.out.println("NO MATCH");
            }
         }
      }
  • javascriptのリテラルまたは、RegExpクラス
    • var myRe = /d(b+)d/g;
      var myArray = myRe.exec("cdbbdbsbz");
  • URL Rewrite Rule
    • rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/blog/sitemap$2.xml" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/blog/index.php?xml_sitemap=params=$2" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/blog/index.php?xml_sitemap=params=$2;zip=true" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/blog/index.php?xml_sitemap=params=$2;html=true" last;
      rewrite ^/blog/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/blog/index.php?xml_sitemap=params=$2;html=true;zip=true" last;

レファレンス

続きを読む “正規表現レファレンス”

yeon.me TLS

[翻訳] SSLとTLSの配布のベストプラクティス

SSL / TLS驚くほど簡単な技術です。配布しやすいし、ダメな時以外はただスムースに動作します。ただ、問題は暗号化は普通性格に配布しにくいところです。TLSが適切な保安を保証するためには、システム管理者は必ず正しいサーバー設定とアプリの配布に気を引き締めなくてはなりません。

2009年、TLSがどう使われているか、TLSツールとドキュメントをどうやって改善するかを知るために、私たちはSSL Labsで働き始めました。その結果、いくつかの目標を達成しました。TLS使用に対する世界的な統計とオンライン評価ツールを作りましたが、ドキュメントの不足はまだまだ見えています。この文書はこの問題の解決のための第一歩です。

私たちのゴールは安全なサイトとウェブアプリケーションを配布するために、管理者とプログラマーができる限り最少の時間をかけるように、明確で簡潔なマニュアルを提供することです。明確さのために、私たちは完成度を削って、そして特定のトピックも飛ばしておきます。実用的で習いやすくするのにポイントを置きました。もっと詳しい説明が必要な方には、第6章から役に立つ情報を提供します。

yeon.me TLS

続きを読む “[翻訳] SSLとTLSの配布のベストプラクティス”

Ubuntu 16.04 + NginXにTomcatを載せてみよう

Tomcatはその生まれながらApacheとのお揃いという気分なので、Nginxのインストールのとき、まったく考えたことがなかった。

しかし、SCITマスターでも習い続けているので、いずれにせよ講義室のパソコンをサーバーに出せないので、Nginxが起動されているこのサーバーにJSPの機能を追加することが一番自然な流れだと思う。

Cafe24という韓国のホスティングサービスでも一時はサービス中断になるほど、古い技術だが、PHPと共存することもあるらしい。

やはり、PHPのバージョン4あるいは5みたい古くなり、伝統さえ感じてしまいそうだが、こちらもレガシーとかなんとかで、バージョンを全部同時に配布している。

すでにNginxが設定済みであると仮定する。

  1. Tomcatをインストールする。
    1. # apt-get update
      # apt-get install tomcat8
  2. はいっ、ここでインストールはおしまい。
  3. 手早くhomeディレクトリから、ウェブルートに入るために、シンボリックリンクを作る。
    1. # ln -s /var/lib/tomcat8/webapps/ ~/webapps
  4. Tomcatが起動中か確かめて、起動してない場合、実行する。
    1. # service tomcat8 status
      # service tomcat8 start
  5. nginx.conf (普段/etc/nginxにある)をロードして、ファイルの修正をする。includeもある場合、server節はinclude命令のディレクトリから探す必要がある。
    1. ファイルの内容でhttp節に次のように書き込む。/etc/tomcat8/server.xmlの内容にあわせて、ただしいポート(最初は8080)を決める。
      1. # for tomcat jsp
            upstream tomcat {
                ip_hash;
                server 127.0.0.1:8080;
            }
    2. server節を次のように変更する。nameがかぶるともともとのserver節の消す必要がある。
      1. server { # MY DOMAIN
                listen       80;
                server_name  mydomain.net;
        
                location / {
                    proxy_set_header    HOST $http_host;
                    proxy_set_header    X-Real-IP $remote_addr;
                    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header    X-Forwarded-Proto $scheme;
                    proxy_set_header    X-NginX-Proxy true;
        
                    proxy_pass http://tomcat;
                    proxy_redirect  off;
                    charset utf-8;
                }
        }
  6. nginx -tを実行して、okサインを確認したら、service nginx reloadで確認する。
  7. server_nameに書いたドメインも確認する。

apt-get install tomcat8-examplesでサンプルを勉強する。JSPとServletがスムースに動くのが見えたら成功だ。

Remote FXを有効にして、設置、設定する方法

このドキュメントはリモートデスクトップとHyper-Vセッションで、 RemoteFxを有効にする方法について説明します。これにより、ユーザーはRemoteFXの技術を使って、より進歩した経験ができます。

要求バージョン

  • RemoteFXが可能なWindowsベースOS (2008 R2、2012、2012 R2など)

説明

次の情報は様々なMicrosoftの資料から収集されたものです。要するに、要求事項と、セッションあるいはVMベースのRemote Desktop Services(以下RDS)のリリースの時、RemoteFXを有効にする方法と設定を表します。

セッションベースのRDSの配布

セッションベースのRDSの配布に必要なもの

  • RemoteFXサーバーのプロセスはストリーミングSIMDエクステンション2(SSE2)命令をサポートしなければなりません。
  • RDセッションホストサーバーとクライアントの間にLAN速度のコネクションがおすすめられます。

設定

リモートデスクトップセッションホストロールが必須です。
(サーバーマネージャー > 役割と機能の追加 > リモートデスクトップサービス > リモートデスクトップセッションホスト)

ローカル グループ ポリシー エディター

ローカル グループ ポリシー エディター

続いて、次のグループポリシーを設定します。 (gpedit.mscをアドミニストレーターの権限で実行します)

コンピューターの構成\管理用テンプレート\Windows コンポーネント\リモートデスクトップ サービス\リモートデスクトップ セッションホスト\リモート セッション環境

設定

  • 色の解像度を制限するクライアント互換または32 ビット設定
  • RemoteFXを有効にする

リモートデスクトップセッションホスト設定からでも、カラーの設定はできます。

RemoteFXサーバーを再起動しなければなりません。

VMベースRDSの配布

VMベースRDSに対する要求事項

  • Hyper-VベースVMの配布
  • SLATができるプロセッサー (Intel: Extended Page Tables (EPT), AMD: Nested Page Tables (NPT))
  • GPU (RemoteFXサーバーにすくなくとも一つ以上のGPUがついていること。GPUドライバーはDirectX 9.0cまたは10.0をサポートが必要。GPU複数ある場合、同じGPUで揃われていること。GPUはシステムメモリーとは別に十分に確保していること。)
  • RDセッションホストサーバーとクライアントの間にはLAN以上の速度の連結がおすすめです。

設定

  • リモートデスクトップの仮想化ホストコアーサービスとRemoteFXサービスの役割も設置が必要です。
    (サーバーマネージャー > 役割と機能の追加 > リモートデスクトップサービス > リモートデスクトップ仮想化 ホスト)
  • (Hyper-Vサーバーに)グラフィックカードドライバーの設置

参考: RemoteFXサーバーに最新のグラフィックカードドライバーの設置完了をしてください。

Hyper-V設定

  1. Hyper-V マネージャーを起動します。
  2. 仮想マシンから対象のマシンでマウスの右ボタンを押して、設定に入ります。
  3. RemoteFX 3D ビデオ アダプターの追加します。
  4. 仮想マシンが実行中ではない場合、実行します。そして、接続します。
  5. ローカル管理者グループ使用者にログオンします。
  6. RemoteFX 3D ビデオ アダプターのドライバーが設置が実行されます。指示通りに、システムの再起動をします。
  7. そしたら、仮想マシンはRDPのみで接続できます。(Hyper-Vの接続画面はアダプターを切るまでは作動しません)

出所: http://2x.helpserve.com/knowledgebase/article/View/233/10/how-to-enable-and-configure-remote-fx

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

Ajenti 설치

시스템 현황을 보여주는 ajenti 콘솔은 강력하고, 유용하게 쓰일 수 있다. 콘솔에서 처리해야할 상당 부분을 건너뛸 수 있고, 현재 서비스가 잘 돌고 있는지 위젯을 만들어서 직접 관리할 수 있다.

공식 사이트는 이곳이며, 설치 매뉴얼이 있긴 하나, 정말로 부실하므로 큰 도움이 되지 않는다.

$ curl https://raw.githubusercontent.com/ajenti/ajenti/master/scripts/install.sh | sudo bash -s -

이걸로 충분하다고 한다.

python 의존성 관련된 오류가 발생하는 경향이 있다. 다행히 별 문제가 없었지만, 케이스가 발견되는대로 여기 내용을 추가해나가야겠다.

설치가 완료되면, sudo 권한을 얻지 못하는 문제를 해결해야할 필요가 있다. 다음 명령으로 conf 파일을 편집할 수 있다.

$ sudo nano /etc/ajenti/config.yml

바인드 포트를 잘 확인하고 지정한다. 기본 포트는 port: 8000이라고 되어 있듯이, 8000번 포트를 사용한다. restricted_user: 계정 이름 이렇게 입력해주고 저장해야만 나중에 1 incorrect password attempt 오류를 피할 수 있다.

$ sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp
$ sudo firewall-cmd --reload

이 명령으로 포트도 확실하게 열어둔다.

 

다 되었으면 실행해본다.

$ sudo systemctl start ajenti

웹에서 구동은 다음 주소에서 가능하다.

http://서버주소:8000

서버 OS 계정으로 로그인할 수 있다. ssh 계정과 동일하다고 보면 된다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

PHP 7.1 설치

홈디렉토리에 역시 저장소 파일을 받아서 등록하자. 기본 php 저장소 역시 너무 구버전이라 remi-release-7으로 갈아치울 필요가 있다.

$ cd ~
$ wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ rpm -Uvh remi-release-7.rpm
$ yum-config-manager --enable remi-php71
$ sudo yum install php php-devel php-fpm php-gd php-mbstring php-pdo php-pecl-swoole php-cli php-intl php-soap php-tidy php-xml php-xmlrpc

쓸만한 php 모듈을 모두 등록한 경우이며, 필요에 따라 가감할 수 있다.

다음으로 php-fpm 연동이다.

$ sudo nano /etc/php.ini

cgi.fix_pathinfo를 찾아서 =0으로 바꿔준다. 이는 필수적인 PHP 보안 설정이라고 한다.

이어서 php-fpm.d 설정을 한다.

$ sudo nano /etc/php-fpm.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock
user = nobody
group = nobody

각각 내부에 listen = / user = / group = 항목이 다 들어 있으므로 복붙하지 말고, 찾아서 해당 부분을 각각 수정해야 한다.

다 되었으면 실행해본다.

$ sudo systemctl start php-fpm

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

maria db 설치

$ cd /etc/yum.repos.d/
$ sudo nano MariaDB.repo

이렇게 입력하면 yum 패키지 원본으로 MariaDB 저장소를 새로 지정할 수 있다. 이렇게 하지 않으면, 기본으로 있는 패키지는 너무 구버전이다.

# MariaDB 10.2 CentOS repository list - created 2017-11-06 14:03 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

저장하고 다음 명령을 실행한다.

$ sudo yum update

이제 설치한다.

$ sudo yum install MariaDB-server MariaDB-client

이렇게 하면 자동으로 패스워드 설정 페이지가 나온다. 접속에 필요한 정보니 신중하게 설정하면 된다.

$ sudo systemctl start mariadb

mariadb가 시작된다.

다음 글에서 이어집니다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

기본 시스템 설정

root인 김에 막바지 작업을 끝마치자. 도메인을 갖고 있다면 시스템을 도메인과 일치시키는 편이 관리하기에 수월할 것이다.

# hostname mydomain.net

이어서 hosts 파일도 수정한다.

# nano /etc/hosts

127.0.0.1 / ::1인 첫 항목을 바꿔버린다.

# nano /etc/sysconfig/network

여기서도 HOSTNAME= 오른쪽의 이름을 나의 도메인으로 맞춘다.

해외든 국내든 서버가 어디에 있어도 대한민국 대상으로 서비스한다면 서버 시계도 맞춰주면 좋을 것이다. 다음 방법으로 금세 시간대를 맞출 수 있다.

# timedatectl set-timezone Asia/Seoul

참고로, 가능한 시간대를 모두 출력하려면 다음 명령을 통해 볼 수 있다.

# timedatectl list-timezones

대륙을 알고 있다면 뒤에 | grep Asia 이런식으로 적어주면 더 간략하게 필요한 정보만 추려낼 수 있을 것이다. 이제 root 로그인은 종료해도 괜찮다.

Nginx 빌드

이 절부터는 처음에 만든 신규 계정으로 로그인하고 진행한다.

yum install nginx로 순식간에 설치되는 것이 nginx의 장점이거늘, 여기서는 직접 빌드에 도전해본다. 원래 빌드는 관련 의존성 패키지를 다 깔아주고, 경로도 맞춰줘야 하는 등 무척 까다로운 과정을 거쳐야 한다. 그러나 Nginx는 비교적 쉬운 작업으로 빌드가 가능하다는 점, 또 빌드를 통해서만 원하는 추가 모듈을 깔아줄 수 있다는 점에서 언젠가 꼭 거쳐야 할 과정이라고 생각한다.

gzip이나 기타 유용한 모듈을 쓰려면 빌드 방법은 꼭 알아둘 필요가 있다.

$ sudo yum install gcc-c++ pcre-devel zlib-devel make unzip libxml2-devel libxslt-devel gd-devel GeoIP GeoIP-devel perl

시행착오 끝에 빌드시 괴롭히는 것들을 다 깔 수 있었다.

$ wget https://zlib.net/zlib-1.2.11.tar.gz
$ wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
$ tar -xzvf ./zlib-1.2.11.tar.gz
$ tar -xzvf ./openssl-1.1.0g.tar.gz
$ tar -xzvf ./pcre-8.41.tar.gz

의존성 있는 라이브러리들도 같이 준비해준다. 공식 홈페이지에서 최신 버전으로 맞추는 편이 좋다. 다만, perl 같은 경우엔 메이저 버전이 높은 것으로 하면 문제가 생길 수 있다.

$ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --build=CentOS --builddir=nginx-1.13.6 --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-compat --with-pcre=../pcre-8.41 --with-pcre-jit --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.0g --with-openssl-opt=no-nextprotoneg --add-module=../ngx_pagespeed-1.12.34.3

make 하기 전 설정 과정을 거친다. 여기서 의존성 체크를 당하고, 에러가 나면 구글링하면서 또 해결을 해야 한다. 무사히 끝나면 make가 남는다.

$ sudo make
$ sudo make install

에러가 나지 않기를 기원한다. 참고로 512MB에서 make시 fatal error가 발생했다. 램이 부족하면 죽어버리는 모양이다. vps라서 업그레이드는 간단했다만, 다운그레이드가 안 돼서 좀 그렇다.

$ sudo groupadd nobody
$ sudo useradd -g nobody nobody

Nginx 서버에서 사용할 계정을 만들어야 한다. 방문자가 파일을 확인하게 되는 기본 사용자인 만큼, 보안을 최대한 고려하여 필요한 권한만 제공되어야 한다.

손수 빌드할 경우 서비스로 등록되지 않는다. 서비스 등록을 위한 과정을 거치면, 부팅시 자동으로 웹 서버가 기동된다.

$ sudo nano /lib/systemd/system/nginx.service

여기에 다음 내용을 붙여넣자.

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
			
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
$ sudo systemctl enable nginx
$ sudo systemctl start nginx

이렇게 하면 실행된다.

다음 글에서 이어집니다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール

root 수정

처음 VPS 서버가 생성되면, root 계정과 비밀번호를 관리 패널에서 알 수 있다. 그러나 root를 로그인할 수 있게 두고, ssh를 기본 포트로 쓰면 IP는 쉽게 알 수 있으므로 전세계에서 공격이 들어오게 된다.

따라서 안전하게 서버를 운영하고, 공격자를 막기 위해서는 본인만의 설정을 만들고 관리자 계정을 비활성화하여 서버 권한 탈취를 막아야 한다.
왼쪽에 $인지 #인지 여부로 쉽게 루트 권한인지를 알 수 있다.

putty로 연결하는 법까지는 알고 있다고 하고, putty 접속을 마친 다음 작업을 시작한다. 주로 쓸 계정을 새로 만들 것이다. 여기서는 myadmin이라고 하자.

# useradd myadmin
# passwd myadmin

비밀번호를 새로 셋팅하는 화면이 뜬다.

# nano /etc/sudoers

이걸 실행하면 sudo 명령을 쓸 수 있는 계정을 선언할 수 있다. 다음 부분을 추가하자.

myadmin       ALL=(ALL)       ALL
myadmin    ALL=NOPASSWD: /usr/libexec/openssh/sftp-server

첫째 줄 따로 모여 있는데 내려가면서 비슷한 명령끼리 모아서 새로 한 줄씩 추가하면 된다.
NOPASSWD라고 쓰여 있는 두 번째 줄은 WinSCP 설치시 유용한 기능인데, 이를 통해 WinSCP에서 myadmin으로 접속해도 sudo를 친 것과 동일한 효과를 얻을 수 있다.

nano 에디터를 저장하는 방법은 Ctrl+O를 누르는 것이다.

ssh 포트 변경

우선 패키지를 처음으로 설치하기 전에 패키지 목록을 업데이트하자.

# yum update

가까운 미러 사이트를 저절로 검색하면서 이것저것 다운로드 받을 것이다. 그걸로 할 일은 충분하다.

이어서 CentOS 7에서 netstat을 설치하는 법은 간단하다. netstat을 통해 열린 포트르 확인할 수 있다.

# yum install net-tools

Install y/n에서 당연히 y를 쳐야 하는 것은 기본이다.

# netstat -anp | grep LISTEN | grep sshd

이렇게 치면 LISTEN이라고 표기된 sshd 포트만을 찾아볼 수 있다.

tcp        0      0 0.0.0.0:22            0.0.0.0:*               LISTEN      825/sshd

숫자는 다를 수 있지만 :22 라고 쓰인 부분에서 22번 포트가 열린 것을 확인할 수 있다.

# cat /etc/ssh/sshd_config | egrep ^\#?Port

여기서 Port 22 라는 글자가 보인다면 이 파일은 타겟이 확실하다.

# nano /etc/ssh/sshd_config

nano 편집기가 뜨면 Ctrl+W 키를 눌러서 port를 찾아서 해당 문구를 주석처리(# 붙이기)하고 밑줄에 같은 형식으로 추가한다. 원하는 포트를 1234로 가정하면 다음과 같다.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
Port 1234
#AddressFamily any

Ctrl+W를 또 눌러서 permit이라고 쳐본다. PermitRootLogin 항목이 뜰 것이다.

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

해당 부분의 주석(#) 표기를 해제하고, no라고 바꿔서 저장한다.

# service sshd start

이 명령을 써서 sshd 서비스를 재시작한다. 현재 sshd로 로그인되어 있는 세션이 풀리지는 않는다. 다음 번 로그인 때 설정이 적용되어 기존 셋팅으로 로그인이 안 될 것이다.

방화벽 설정

잠깐, 아직 연결을 종료해서는 안 된다. 기본적으로 켜져 있는 방화벽 관련 설정을 맞춰야만 한다. 그렇지 않으면 시스템이 모르는 포트로 접속시 바로 차단된다.

# firewall-cmd --permanent --zone=public --add-port=2123/tcp

firewall-cmd 명령에 포트 번호와 프로토콜, 항구적 설정임을 명시하여 config에 추가하는 것이다.

앞으로도 포트를 쓰는 모든 서비스는 이렇게 포트를 열어줘야만 정상 접속이 가능해진다. 예를 들어, 우리는 HTTP/HTTPS 서버를 운영할 것이므로, 다음과 같은 명령도 미리 실행해줘야 웹 서버로서 기능을 할 것이다.

# firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

이렇게 미리 정의된 서비스를 허용할 수도 있다.

# firewall-cmd --reload

모든 과정이 끝나면 –reload를 해야만 변경 사항이 적용된다.

다음 글에서 이어집니다.

CentOS 7でのNginx/PageSpeed Module + PHP-FPM7.1 + MariaDBのインストール (1)

Ubuntu 以外の初のLinuxに挑戦

サーバーを構築するとき、初めは手に慣れていたUbuntuでできるだろうと漠然と思っていたが、あれが思うままには素早く行かなかった。사실 말처럼 우분투는 그렇게 가볍지 않았다.

もちろん、何の問題も検索すれば出るほどのユーザー層はすごく役に立ったし、apt-getを使ったマニュアルが多くあるのも、Ubuntuのおかげであることは否めないところだが、いくつか気に入らないところがないことはなかった。

  • あまりにも多かったアップデート
    • サーバーは構築してから、継続するのが目標に等しい問題だが、サーバーのOSなのに、アップデートを圧迫する傾向がある。
  • 少なくない変数
    • ソフトウェアの多様さもいいところではあるが、Ubuntuでのセッチングは案外、手間がかかるところがあるし、問題の要因につながれるほど、方法はばらばらである。
    • たぶん、ほとんどの原因は自分の未熟さからくると思うので、あれこれ言いながらも、ただ気に入らなかったという感情的な問題ではないとは限れない。
  • aptとapt-getよりyumの方が単純で、便利
    • 一応、コマンドが短いし、分かりやすい。aptとapt-getごとく、ばらばらになってもない。

ApacheよりはNginxは回答なのか

Apacheが普通のサーバー構築に基本になっている傾向だが、Apacheは重たいし、セッチングもあまり簡単ではない。だとして、Nginxの方が軽いとは必ずしもそうとは言えないところもあるし、マルチメディアの性能では大きい違いはないそうだ。慣れているものを使うものだが、configファイルのスタイルが直感的なこともあり、FastCGIが基本として使われるNginxの方が自分にあっていると思った。

그럼 이제부터 서버 셋팅을 시작해보자. 따끈따끈하게 VPS에서 CentOS 7 서버를 만들어낸 상황으로 가정하자.

참고로 본 서버는 Vultr에서 구동되고 있다. 서버 셋팅에 관해서 후일 더 자세하게 적어볼 생각이다. 링크를 누르고 신규 서버를 셋팅하고 금액을 지불하면, 신규 가입자와 글쓴 본인 모두에게 소정의 적립금이 적립된다고 한다.

다음 글에서 이어집니다.

CentOS 7でのGoAccessの設定

書き込み途中なので、翻訳は見込まれています。

概要

GoAccess는 유닉스 계열 시스템의 터미널, 사용자의 브라우저에서 돌아가는 오픈 소스 실시간 웹로그 분석기이자, 상호 작용 뷰어라고 합니다. 터미널 기반 로그 분석기다보니,
SSH 같은 터미널로 접속했을 때, 웹 서버 통계를 빠르게 분석할 수 있는 물건입니다.
터미널 출력 말고도 HTML이나 JSON, CSV로 출력하게 할 수도 있다네요.

背景

nginx의 실시간 통계 기능이 있다는 글을 보고, 그 툴이 나름 잘 만들어졌길래 혹시나 하고 정보를 더 찾아봤습니다.

그리고 알게된 사실은 nginx plus라는 상용 프로젝트에 들어 있는 물건으로 많이 비싸다는 것입니다.

nginx 실시간 현황 확인 페이지 설치에 대해서는 후일 또 올리도록 하겠습니다.

결국 이를 대체할 다른 방법이 없을까 찾아봤는데, GoAccess가 가장 괜찮은 대안 같았습니다.

インストール

cent OS 7 기준…

sudo yum update
sudo yum install goaccess

이걸로 끝.

컴파일을 하고 싶은데 openssl 오류를 뛰어넘지 못해서 빌드에 이르지 못하고 있습니다.

ログ設定

https://github.com/stockrt/nginx2goaccess

オプション

goaccess /var/log/nginx/access.log -o ~/go_report.html --real-time-html

デーモン化

*단순 데몬화는 간단합니다. –daemonize만 붙이면 그 순간부터 백그라운드로 잘 실행됩니다.

그러나 제 경우엔 그것만으로는 부족합니다. 자동 실행되어야 합니다.

1.systemd 관련 설정을 위한 파일 생성

[Unit]
Description=GoAccess Live Log Analyzer

[Service]
Type=simple
ExecStart=goaccess /var/log/nginx/access.log -o ~/go_report.html --real-time-html
ExecStop=/bin/kill -9 ${MAINPID}
PrivateTmp=false

[Install]
WantedBy=multi-user.target

/etc/systemd/system/goaccess.service에 root 권한을 써서 생성합니다.

–daemonize는 불필요합니다. 이 자체가 systemd 데몬으로 구동됩니다.

sudo nano /etc/systemd/system/goaccess.service면 될 듯 합니다.

2. systemctl daemon-reload를 써서 위 정보를 서비스로 읽어들입니다.

3. sudo systemctl start goaccess를 쓰면 정상적으로 시작합니다.

이제 서버에서 go_report.html을 읽어보면 잘 작동하는 것을 볼 수 있습니다.

問題

다만, SSL이 적용된 경우, html 내부에 쓰인 goaccess 구동용 웹소켓 또한 보안으로 암호화되어야 합니다.

아쉽게도 yum에서 손쉽게 설치한 goaccess는 최신 버전인 1.1에서 추가된 openssl 관련 컴파일 옵션이 빠져있습니다.

손수 빌드하셔서 openssl을 포함시켜야 쓸 수 있을 것으로 보입니다.

ちなみに

셋팅 다 해놨더니 불안한 서버 속도를 극복하고자 Cloudflare 캐싱을 활용하게 되었습니다.

접속 경로가 Cloudflare를 경유하게 된 탓에 방문 경로 분석이 무용지물이 되었는데요.

다행히 Google Analytics 스크립트는 영향받지 않으므로 통계 수집에 이상이 없다고 하네요. 그 쪽의 방문자 수 통계를 더 참고해야 할 듯.

역시 본연의 액세스 로그 판단 용도에 맞도록 트래픽이 하드한 파일과 오류 파악에나 신경을 쓰면 되지 싶습니다.

プログラミングとは?

人がプログラミング言語にて、命令し、パソコンを起動させる技術

一つ以上の抽象アルゴリズムを特定のプログラミング言語を使い、詳細なパソコンプログラミングとして、実用化する技術を言う。

ソースコード→コンパイラー→マシン語

JAVAの誕生背景

  • 1991年Sun社でジェームズ・ゴスリン(James Arthur Gosling, 1955-)を中心に、家電に使うための言語の作製
  • 特定のCPU

TickCount 研究

物事の始まり

この疑問が出たのは、ただString(あるいはC#などの言語ではstringとも言えます。以下string)とStringBuilder、StringBufferの性能の違いに対する初心者向けの話でした。

stringは実際には読み出し専用であることは、素人以外は大体知っている事実です。immutableと言いますが、変わらないということです。よって、『+』や『concat』をすると、stringはそのたびに、新しいインスタンスをリターンするようになります。

C++では、strcat()で文字列を修正するとき、あらかじめ大きいスペースを割り当てると、速度が飛躍的に上がるといいますが、C#とJavaでは文字列の修正は難しいので、ほかの方法が必要になり、それはMSDNにも出ています。JavaとC#が似ていることは、コピーしたらすぐわかるところですが。

効果はあるのか

それで、その違いはどうやって判りますか。Javaの先生は文字列を作り出し続けるコードを出して、「まぁ、全然変わらないじゃん」と言いましたが、実際に大きい差があることはある程度、コードからも把握できます。

/* string performance in C# */
            string me = "";
            Console.WriteLine("String START");
            var cnt = Environment.TickCount;
            for (int i = 0; i < 100000; i++)
            {
                me += "a";
            }
            Console.WriteLine("Time: "+(Environment.TickCount - cnt).ToString());
            Console.WriteLine("END");
            //Console.WriteLine(me);

            StringBuilder sb = new StringBuilder();
            Console.WriteLine("StringBuilder START");
            cnt = Environment.TickCount;
            for (int i = 0; i < 100000; i++)
            {
                sb.Append("a");
            }
            Console.WriteLine("Time: " + (Environment.TickCount - cnt).ToString());
            Console.WriteLine("END");

C# コード

/* string performance */
        String me = "";
        System.out.println("String START");
        long cnt = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++)
        {
            me += "a";
        }
        System.out.println("Time: "+(System.currentTimeMillis() - cnt));
        System.out.println("END");

        StringBuffer sb = new StringBuffer();
        System.out.println("StringBuffer START");
        System.out.printf("capacity: %d, length: %d\n", sb.capacity(), sb.length());
        cnt = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++)
        {
            sb.append("a");
        }
        System.out.println("Time: " + (System.currentTimeMillis() - cnt));
        System.out.printf("capacity: %d, length: %d\n", sb.capacity(), sb.length());
        System.out.println("END");

Javaコードは次のように結果が出ました。

String START
Time: 7467
END
StringBuffer START
capacity: 16, length: 0
Time: 9
capacity: 294910, length: 200000
END

中途半端なもんではないですね。10万個のStringにつけながら、7秒以上かかりました。一方、 C#は長ければ、5秒以内程度で、コンパイラー最適化のすごさを分かります。StringBufferとStringBuilderも10msを下回り、0msが出る時もありました。刹那と言っても、過言ではありません。

さすがに、Heapをどれほど、使い切ったり、新しいメモリーの割り当てを避けて、有効に扱うのが大切なのか、目に見える実験でした。

浮かび始める疑問

面白いところは、JavaのStringBufferとは違って、C#のStringBuilderの所要時間が0msと出たところです。コード一つでもなく、10万なのに果たしてできるのか?誤差はないのか?気になりました。

早速、Environment.TickCountを疑いました。実はTickCountでコードのパフォーマンスを比較する時代は、マルチプロセッサの到来で、もう過ぎたという意見もあります。コードの後先はあっても、働くタイミングは異なるかも知らないという、スレッドの危険が日常化した時代ですからね。

C#のゆーざーはどういう方法を使っているのでしょうか。

  • Environment.TickCount
  • GetTickCount / GetTickCount64
  • DateTime.Now(UtcNow).Ticks
  • Stopwatch
  • static Stopwatch.GetTimestamp

Environment.TickCount

簡単で、使いやすいのはEnvironment static classのメンバーであるTickCountです。パソコンのアップタイムをミリセカンドで見せるGetTickCount()とはほぼ同じ機能をしていて、余計に符号が付く整数(int)なので、24.9日以上つけっぱなしのパソコンでは問題が発生します。Int32.MaxValueを超えるとInt32.MinValueに戻ってから始めるらしいです。当然、差を求めると、符号が逆になってしまいます。MSDNではInt32.MaxValueとの&(AND)演算で一時解決したようです。(Math.Abs()より早く符号がなくなりますね。)

GetTickCount64

VistaからできたWin32 APIであるGetTickCount64は符号なしlongタイプでリターンします。システムが始まった時間から積み重ねていくミリセカンドの数字を表すには、十分な長さだと言えるでしょう。しかし、本当に遊ばないで、たとえば、節電、ハイバネーションなどなく、起動時間を求めるには、QueryUnbiasedInterruptTimeが必要となります。

DateTime.Now(UtcNow).Ticks

西暦1年1月1日午前零時から、100ナノセカンドで経った時間を表します。うるう秒などはなく、本当の時間とは差が少なくないらしいです。

Stopwatch

Stopwatchはnewキーワードなく、インスタンス化できるStaticメソッドであるStartNew()を使って、時間を図り始め、Stop()を呼び出した後、ElapsedMillisecondsなどのプロパティで経過時間がわかるようになります。

  • IsHighResolutionプロパティは現在パソコンのハードウェアが別のハイレゾ性能カウンター機能があるかどうかを確認できる読み出し専用のブール属性です。今どきのパソコンはほとんどTrueがリターンされるようです。
  • Frequencyプロパティはタイマーのtick周期をリターンします。
    long frequency = Stopwatch.Frequency;
        Console.WriteLine("  Timer frequency in ticks per second = {0}",
            frequency);
        long nanosecPerTick = (1000L*1000L*1000L) / frequency;
        Console.WriteLine("  Timer is accurate within {0} nanoseconds", 
            nanosecPerTick);
    • このようなコードで、Stopwatchの正確度があらわれます。
        Timer frequency in ticks per second = 2343750
        Timer is accurate within 426 nanoseconds

static Stopwatch.GetTimestamp

Stopwatchのインスタンス化後の時間も無駄だとみる一部のユーザーはGetTimestamp static メソッドの性能に注目をしました。

  • ハイレゾ性能カウンターがあるときには、現在値をリターンします。
  • 一般のシステム時計が使われている場合、DateTime.Ticksと同じ結果が出ます。

ベンチマーク

Repeating measurement 3 times in loop of 10,000,000:

Measured: GetTickCount64() [ms]: 228
Measured: Environment.TickCount [ms]: 50
Measured: DateTime.UtcNow.Ticks [ms]: 83
Measured: Stopwatch: .ElapsedMilliseconds [ms]: 856
Measured: static Stopwatch.GetTimestamp [ms]: 476
Measured: Stopwatch+conversion to DateTime [ms]:  811

Measured: GetTickCount64() [ms]: 219
Measured: Environment.TickCount [ms]: 50
Measured: DateTime.UtcNow.Ticks [ms]: 84
Measured: Stopwatch: .ElapsedMilliseconds [ms]: 847
Measured: static Stopwatch.GetTimestamp [ms]: 465
Measured: Stopwatch+conversion to DateTime [ms]:  799

Measured: GetTickCount64() [ms]: 235
Measured: Environment.TickCount [ms]: 51
Measured: DateTime.UtcNow.Ticks [ms]: 84
Measured: Stopwatch: .ElapsedMilliseconds [ms]: 851
Measured: static Stopwatch.GetTimestamp [ms]: 470
Measured: Stopwatch+conversion to DateTime [ms]:  791

Compare that with DateTime.Now.Ticks [ms]: 1150

General Stopwatch information:
- Using high-resolution performance counter for Stopwatch class.
- Stopwatch accuracy- ticks per microsecond (1000 ms): 2.3
 (Max. tick resolution normally is 100 nanoseconds, this is 10 ticks/microsecond.)
- Approximated capacity (maxtime) of TickCount [dd:hh:mm:ss] 25:20:31:23

Done.

シングルスレッドのみ使うように設定したうえ、スレッドの優先順位を高めて、Stopwatchを利用し、1000万会呼び出しにそれぞれかかった時間です。

TickCountが共通的に早いのかと思うと、StopwatchはElapsedMillisecondsの表示のための手順もあるので、 表示をせずに、ただStart()とStop()を繰り返すのにどうかを確認した方がよかったかなと思いました。

ソースの出所: https://stackoverflow.com/questions/243351/environment-tickcount-vs-datetime-now

それで?

GetTickCountは混沌と混沌の歴史です。まさか、20余日パソコンをつけっぱなしにするあほがいるかと思った先人の誤りでしょうね。DWORDとして、符号をなくしてせいぜい40余日です。

普段使うことで問題はなさそうですが、何が長くかかり、メソッドやクラスの特徴さえ知っておけば、長引く作業を後回しもでき、パフォーマンスも向上できると思います。

これからも、気になることはぜひ実験してみないとわからないのが当然だということでしょう。

プログラミングの基礎

プログラムとは

パソコンが汎用的機会になったのは、プログラム(program)のおかげである。プログラムはパソコンのための作業の指示書であり、具体的にはパソコンがある特定の作業をするためのコマンドの集まりだ。コマンドとは、CPUが遂行する基礎的な演算である。

プログラミング言語

  • ソースコード(source code): 希望する作業をテキストで表したもの
  • ソースファィル(source file): ソースコードがファイルに記録されたもの
  • オブジェクトファイル(object file): コンパイラーが機械語に変換して、ファイルにセーブしたもの

「C:\」などであやしいフォルダがドライブルーツから見つかったら…

変なフォルダ

Windows エクスプローラーでの設定で隠されたフォルダを見えるようにした方がいらっしゃったら、
韓国のあるサイトの訪問後、こういう状態になります。

フォルダの名前はまさにあやしいです。

変なファイル

中にはフォルダなみのネーミングセンスをもったファイルが一つあります。
フォトとはいえ、内容はまったくイメージではありませんので、普通には開けません。

変な内容

ヘックスエディターで確認できます。
ここではHxDという無料ツールを使用しました。

そして、問題は解決されました。
AhnLabはV3というワクチンソフトを作った韓国の会社です。

Ransomwareを防ぐための方法だそうです。
ファイルの変異が見つかったら、その行為を起こしたプロセスが退治されるでしょう。

変なアプリ(マジで) 「パソコンウイルスのワクチンか?お前が?」

ま、こういうやつが普段からないほうがパソコンにやさしいのではないか、なんていつも思っています。

プロジェクト相互投票ページの製作完了の報告書

サンプルページへ進む

期間: 平成27年(2015年) 11月 20日 ~ 12月 22日

人数: 1人

目的: ACEグループ活動コンテスト(大学行事)の発表会に参加した五つのチームを平等に相互評価するシステムを作る

 

ACE グループ活動コンテストの評価システム

プロジェクト 完了報告書

2015.12.07

日語日文学科 201131307 イ・ジンベク

gachon

目 次

1. プロジェクトの完了と概要 3

1.1 概要 3

1.2 構成 4

1.3 実行画面 5

1.4 プログラムの仕組み 11

 


プロジェクトの完了と概要


概要

  • プロジェクト名
『 ACE グループ活動コンテストの評価システム 』開発
  • プロジェクトの説明
大学の先進事業により、政府と大学が力を合わせて進めているプロジェクトの一つで、ACEという大学がある。文学部でも様々なプロジェクトが進められている。五つのプロジェクトのなか、最も学生の注目を集めている活動はグループ活動コンテストである。三人程度の学生どうしのグループを組み、東洋文化について調べたことを発表して、相互評価を行い、一緒に水準を上げることができる。しかし、こういった評価システムは計画の中だけでのことであり、実際には紙を使った異論の余地がある方法だった。予想されている混乱を防ぐため、担当教授の意見に合わせた新たなモバイルプロジェクトの企画の必要性が認められた。

当プロジェクトにより、参加者の発表情報を簡単に見せることにして、認証ができた人間にのみ、自分のグループを除く他グループを評価できるようになり、最終的には発表の直後ランキングに表せる。ランキングの一覧から、細かい点数と予想奨学金も見せて、教授からの案内の必要性も下がり、素早く最終結果を分かるようになる。

  • チームの構成
役割 ID 姓名 email etc
すべての企画と開発 201131307 イ・ジンベク [email protected]
  • ロードマップ
企画 コーディング アップロード データの構成 テスト
  • 開発後の感想(開発後記)
このプロジェクトは大変単純な仕組みを持っているが、これに要求されるコードの難易度はあまり低くは感じなかった。まだ使ってみなかったUIフレイムワークのMaterializeとjQueryの技術は慣れてない新しい挑戦だったけど、結果的に成功につながって、とてもスムースに働いていることが分かった。その他、PHPサーバーサイドコードを使って、データベースの制御ができたが、他にデータベースの授業なしに背景知識でやり遂げたものだから、自分でできたという意味があった。振り替えてみれば、最初から最後まで、すべてが挑戦の過程だった。

プログラムの構成

  • 環境の構成図

  • 実行機能
主要機能 詳細機能 使用者
管理者 一般使用者[1]
順序修正 直接入力、ランダム修正
結果の閲覧 プライベートタイトル、奨学金の計算
問い合わせ 学生の認証、部員の発表と概要の表示
評価 並び変えて評価、やり直し
  • 실행환경

サーバーOS: Linux上のホスティングサービス

サーバーIP: 183.***.***.***

サーバー接続URL: http://vote.yeon.me/ (上記住所に変更)

サポートするブラウザ: IE11 以上やChrome、Safari、FirefoxなどHTML5のサポートされているブラウザ

モバイルプラットフォーム: Chrome, Safari, Opera (Android, iOS, Windows Phone[2])

プログラムの起動画面

  • ユーザー認証

イメージ 1 無効IDの入力

イメージ 2 学生のIDがない場合

イメージ 3 ID入力認証画面

  • 평가 화면

イメージ 4 評価ページのヘッド

イメージ 5 評価ページの全体

  • 整列画面 (管理者限定)
    このページは第一ページからの‘ordr’キーワードで接近できる。

イメージ 6 順序の設定ページ。スクリーンでの表示のため、多少大きめの文字を使った。

  • 結果画面 (管理者権限)
    このページは第一ページからの‘rest’ キーワードで接近できる。(参加者には内緒)

イメージ 7 順位だけを見せて、どのグループかは見せない状態 (発表が終わってから、評価参加人数を確認する段階)

イメージ 8 全体結果の公開

プログラムの仕組み

  • ディレクトリの構造とファイル

tree

│ global.php

│ index.php

│ order.php

│ order_ok.php

│ result.php

│ vote.php

│ vote_submit.php

├─css

│ materialize.min.css

│ style.css

├─font

│ ├─material-design-icons

│ │ LICENSE.txt

│ │ Material-Design-Icons.eot

│ │ Material-Design-Icons.svg

│ │ Material-Design-Icons.ttf

│ │ Material-Design-Icons.woff

│ │ Material-Design-Icons.woff2

│ │

│ └─roboto

│ Roboto-Bold.ttf

│ Roboto-Bold.woff

│ Roboto-Bold.woff2

│ Roboto-Light.ttf

│ Roboto-Light.woff

│ Roboto-Light.woff2

│ Roboto-Medium.ttf

│ Roboto-Medium.woff

│ Roboto-Medium.woff2

│ Roboto-Regular.ttf

│ Roboto-Regular.woff

│ Roboto-Regular.woff2

│ Roboto-Thin.ttf

│ Roboto-Thin.woff

│ Roboto-Thin.woff2

├─img

│ hi1.img

│ hi2.img

│ hi3.img

│ hi4.img

└─js

materialize.min.js

Sortable.min.js

フォルダ ファイル名 説明
global.php 実行可能のフラグ
index.php 参加者認証と管理者限定ページへの接続
order.php 発表順の設定
order_ok.php 発表順の反映後index.phpに復帰
result.php 結果ページ
vote.php 評価ページ
vote_submit.php 評価の送信 (Ajax)
css materialize.min.css Google Android Material デザイン
HTML5 CSS フレイムワーク
css style.css スタイルシート
js materialize.min.js Materialize JavaScript
js Sortable.min.js Sortable (タッチスライドで順序変更)ツールのJavaScript

  1. 普通の使用者は参加者、管理者はプロジェクトの発表者でありながら参加者だがら、普段通りに参加もできるようにしなければならない。
  2. Windows Phoneでは[スライドで操作]機能は動作しているものの、スライド状態が継続できない問題があって、スクロールになるバグがあるライブラリなのに、参加者の中では利用者がないので、表面化してなかった。

Desktop Font

起動ファイルのダウンロード

紹介

ウィンドウズ8以上OSから姿を消したダイアログのフォント設定をかわりにしてくれるアプリです。

使用方法

左からインストールされたフォント名を選択して(右上から検索もできます)、対象を選らび、『Apply』を押したら完了になります。

変更事項はリブートしてから、確認してください。

デフォルトフォントは変えないので、上記項目以外は元通りに維持されます。

ところで

MacTypeというアプリを使用すると、さらに文字をスムースに表示できます。

しかし、最新のWindows 10 (RS2)以降では、MacTypeがタスクバーのリフレッシュバグを起こしますので、ご注意ください。

http://code.google.com/p/mactype/