読者です 読者をやめる 読者になる 読者になる

GraffitiNote

Pythonistaの情報系大学生がプログラミングやらDTMやらデザインやら

Webサイト作成のための準備の記録 その2

以前のサーバーのセットアップでは、
Ubuntu14.04 LTS に Python, Django, Apache, mod_wsgi を入れましたが、
Webサイト作成のための準備の記録 - GraffitiNote

NginxやuWSGIが良いという記事を散見したのでそちらを利用してみる。

環境構築の際に参考にしたのはこちら。
Ubuntu 14 でLAMP(Nginx+MariaDB(MySQL)+PHP)インストールからWordPressを動かすまで(Nginx編) | レンタルサーバー・自宅サーバー設定・構築のヒント

記事通りに進めていくと何故かエラーが出たりしますが、
(何度か手順を逆戻りをしたりはしたものの)
今回は記事通りに上手く環境構築が出来ました。

ということで、
Ubuntu14.04 LTS + Python + Django + Nginx + uWSGI
で新しいWebサイトは作成していきます。

現在はphpinfoを表示させている状態。
phpinfo()

今後の予定としては、人狼サイトを作るので、
とりあえず原型となる掲示板サイトを作成。
その後デザインや掲示板の仕様変更を行い、
コマンドや時間制限による切り替えを実装。
肝となるAIの実装はまだ保留。

「絶対普通の脳ミソじゃない」に対するアルゴリズム屋の考察


www.youtube.com

最近こんな動画が話題だそうです。

一般的な視点としては、
1.カスケード(ジャグリング)を行う
2.ルービックキューブを揃える
以上2点を同時に行っているということになると思います。

しかし、動画を見てみると、3つのキューブが全て
同じタイミング(21回目の操作)で揃っていることが分かります。
このことから、規定の動作を3つのキューブに適用しているのではないか?
ということが予想されます。
また、規定の動作を共通の解法としている場合、
元のキューブの状態が(グラフ理論的に)同型であると考えられます。

左手手前のキューブの状態は殆ど確認することができませんが、
左手外側のキューブと右手のキューブの2面が
同型であることは容易に確認できます。
f:id:sweetsoundstory:20160323002221p:plain
f:id:sweetsoundstory:20160323002233p:plain

また、ルービックキューブは、ある一面に着目した場合、
縦に回すことを考えると左右側面と中央の3パターンに分けられます。
カスケード中に中央を回すのは難易度が高すぎるので、
側面を回し続けていることが推測されます。

以上の考察より、動画投稿主が実行していると考えられるアルゴリズムは、
1. 左(または右)側面を回す
2. 1を回転軸をx軸⇢y軸(⇢z軸)の繰り返しで変更しながら21回転分行う
3. 1と2を3つのキューブに適用する
4. 3つのキューブに対してカスケードしながら操作を逆戻りしていく

ちゃんと画像(映像)解析してやればきちんと検証できると思いますが、
そこまでする余力が今のところないので考察のみで今回は終わります。

汎用ビルドスクリプト

恐らく将来的に新しい言語を習得する時に使うであろうということでメモ。

C++の勉強をしていた時、ひたすらサンプルプログラムを走らせてるうちに、
いちいちコンパイル⇢実行の手順を踏むのが面倒くさい!!!
ということで書いた、コンパイルと実行をまとめてやってくれるだけの
ビルドスクリプトです。特にすごい機能はありません。
気が向いたら機能もりもりに更新します。

仕様としては、スクリプト言語はそのまま実行、
コンパイラ言語は実行ファイル(.exe)を生成して実行、
既に生成済の xxx.exe は xxx を宣言することで実行できます。
コンパイルや実行文は赤文字で、実行結果は青文字で表示されます。
現状、CとC++pythonが動きます。
引数やpython2,3系の使い分けには対応してないです。


run.sh

#! /bin/sh

tput setaf 1 #red
if [ $# -lt 1 ]
then
    echo " "
    echo ">>./run filename"
    echo " "
    tput setaf 0 #black
    exit 1
fi

echo " "
case $1 in
    *.c)
        name=${1/\.c/}
        echo "gcc $name.c -o $name.exe"
        gcc $1 -o $name.exe
        ;;
    *.cpp)
        name=${1/\.cpp/}
        echo "g++ $name.cpp -o $name.exe"
        g++ $1 -o $name.exe
        ;;
    *.py)
        echo "python $1"
        echo " "
        tput setaf 4 #blue
        python $1
        echo " "
        tput setaf 0 #black
        exit 1
        ;;
    *.*)
        echo "not support."
        echo " "
        tput setaf 0 #black
        exit 1
        ;;
    *)
        echo "./$1.exe"
        echo " "
        tput setaf 4 #blue
        ./$1.exe
        echo " "
        tput setaf 0 #black
        exit 1
        ;;
esac
echo "$1 ===COMPILE===> $name.exe "

echo "./$name.exe"
echo " "
tput setaf 4 #blue
./$name.exe
echo " "
tput setaf 0 #black


さて、ここで実行するC++のコードを用意します。
有名なa^=b^=a^=bというエレガントなコードでswapを行うプログラムです。

swap.cpp

#include <iostream>
using namespace std;

int main(){
  int a = 1,b = 2;
  cout << "a = " << a << ", b = " << b << endl;
  a^=b^=a^=b; cout << "swapped." << endl;
  cout << "a = " << a << ", b = " << b << endl;
}


上記のコードをビルドスクリプトを使用して実行した結果が
以下のようになります。

$ ./run swap.cpp
 
g++ swap.cpp -o swap.exe
swap.cpp ===COMPILE===> swap.exe 
./swap.exe
 
a = 1, b = 2
swapped.
a = 2, b = 1


ここでは全て黒文字で表示されていますが、
実際には上から順に黒文字、赤文字、青文字で表示されます。

pythonの演算子オーバーロードはIQ150を超える

算数の問題だ!┗(^o^;)┓足し算かな????wwWwwWWw┏(;^o^)┛足し算じゃないな?????wWWWwww(´・`;) こ… これ…これは……演算子オーバーロードだあああああ┗(^o^)┛WwwwWW┏(^o^)┓ドコドコドコwwwwwwwwwww

IQ150もあるわけねーだろ


というわけでこの問題を演算子オーバーロードを使って解いてくれる
python3のソースコードです。(解法の説明は要らないと思われる)

overload.py

class N(int):
  def __init__(self,value):
    self.value = value
  def __add__(self,other):
    n1,n2 = self.value,other.value
    if n1 < n2: n1,n2 = n2,n1 #念の為
    return str(n1 - n2) + str(n1 + n2)

#a+bのフォーマットで標準入力
while True:
  a,b = map(int,input().split("+")) #標準入力から数値受け取り
  a,b = N(a),N(b) #わざわざ変換する
  answer = a + b #演算子オーバーロードだ!!!(これがやりたかっただけ)
  print("=" + str(answer))


実行結果
(標準入力時に改行しない方法を知ってる方がいたら教えてください)

$ python3 overload.py
6+4
=210
9+2
=711
8+5
=313
5+2
=37
7+6
=113

Webサイト作成のための準備の記録

まずはConoHaでサーバー(VPS&SSD)を借りる

サーバーにUbuntu14.04をブチ込む

adduser
passwd
apt-get update
apt-get upgrade
apt-get install openssh-server
ifconfig
apt-get install build-essential

PYTHONでWEB開発: Django実践チュートリアル(サーバー編)DjangoをUbuntu,Apache, mod_wsgiで動かしてみる

に従ってUbuntuを構築していく

途中でエラーがでたので

Apache2 on ubuntu で a2ensite すると does not exist と言われるときの対処法 - Qiita

を参考に対処

名前.comでドメインを借りてDNSレコードを設定する