sti320a

勉強したことのまとめ

量子コンピュータ/Numpy/電子工作に関する問題_2020年4月7日

量子コンピュータに関する問題

  • 量子コンピューティングにおける基本単位は何か
量子ビット
  • 量子ビットに対して古典的計算のデータの単位を何というか
古典ビット
  • 電子の内部状態について、角運動量を持つ、電子の自転のようなものと考えられているものを何というか。
スピン
量子力学における「測定」は系に影響を与える。
  • 古典力学においては、真のランダム性は存在しない。試行の度に初期条件が変わるためである。このように、入力のわずかな変化が増幅されて、まったく異なる結果を生じる性質を何というか。
初期値鋭敏性
神はサイコロを振らない
  • 直線偏光フィルターを3枚用意する。 まず、1枚目のフィルターを固定し、2枚目を同じ方向で重ねる。このとき、光は2枚のフィルターを通過する。 次に、1枚目のフィルターを固定したまま、2枚目を90°回転させて重ねる。このとき、光は完全に遮断される。 最後に、1枚目のフィルターを固定したまま、2枚目を90°回転させた状態で、3枚目を 45°回転させて重ねる。 このとき、光は3枚のフィルターの重なり合う領域を通過するだろうか。
通過する(2枚だけが重なった領域は通過しない)。
  • 古典的コンピュータで真にランダムな値を出力することはできない。では、量子コンピュータでは可能か。
可能。電子のスピンを、最初に垂直方向と次に水平方向に測定する。すると、N極かS極かの結果を真にランダムに得られる。
これを 0 と 1 のビットに置換すれば、真にランダムな値の列を得ることができる。

Numpy に関する問題

  • Numpy におけるスタッキングとはどのような演算か
ndarray オブジェクトを鉛直または水平に連結する演算。
numpy.hstack または numpy.vstack を利用する。
  • 以下のコードの出力する値を書け
import numpy as np
h = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
np.hstack((h, h * 2))
array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16],
       [ 9, 10, 11, 18, 20, 22],
       [12, 13, 14, 24, 26, 28]])
  • 以下のコードの出力する値を書け
import numpy as np
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
np.vstack((val, val * 2))
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16],
       [18, 20, 22],
       [24, 26, 28]])
  • 以下のコードの出力する値を書け
import numpy as np
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
val.flatten()
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
ndarray.flatten は ndarray をフラット化して出力する
  • 以下のコードの出力する値を書け
import numpy as np
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
for i in val.flat:
    print(i, end=',')
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
ndarray.flat は ndarray をフラット化したイテレータを得る。flatten と異なりメソッドではなく、ndarray の属性である点に注意する。
※ ndarray.ravel() メソッドでも同様にイテレータを得られる。
  • 以下の配列から、値が5の位置だけが False でそれ以外の位置が True である dtype が boolean の ndarray を得るにはどのようにすればよいか。
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
(解答)val != 5
(出力)
array([[ True,  True,  True],
       [ True,  True, False],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])
  • 上記 boolean の ndarray について False を 0, True を 1 とした ndarray を得るにどうすればよいか。
(解答) (val != 5).astype(int)
(出力)array([[1, 1, 1],
       [1, 1, 0],
       [1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
  • 下記の ndarray について val が4より大きく12以下であるかを boolean で表現した ndarray を得たい。どのように書けば良いか。
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
(解答)(val > 4) & (val <= 12)
(出力)array([[False, False, False],
       [False, False,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True, False, False]])
  • 下記の ndarray について val が 4より大きい値のみの ndarray を得たい。どうすれば良いか。
val = np.array(
    [[0,1,2],
    [3,4,5],
    [6,7,8],
    [9,10,11],
    [12,13,14]]
)
(解答)val[val > 4]
(出力)array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

電子工作に関する問題

  • 導体に関して AWG とは何か
American Wire Gauze (アメリカンワイアゲージ)のこと。
米国ワイヤゲージ規格で、導体の太さの規格である。
  • ジャンパ線とは何か
離れた電気回路間をつなぐ導線や端子のこと。
導線を切って端の被覆を10mm程度剥いて折り曲げれば作れる。
  • リレーとはどのような電子部品か説明せよ
電気的にコントロールするスイッチのこと。低電圧・小電流で高電圧・大電流をスイッチできる。
  • 3つの端子があるトグルスイッチを考える。トグルを切り替えることにより、中央の端子を両端のいずれかの端子に接続できるが、このとき、中央の端子を何と呼ぶか。
極(pole)
  • 1つのスイッチで 2 つの接続に切り替えることができる場合、このスイッチを何というか
双投スイッチ(DT)
  • では、1つのスイッチで1つの接続のみの(一方に切り替えると接続するが、もう一方では何にも接続しない)スイッチを何というか
単投スイッチ(ST)
  • 1つの極をもつ双投スイッチを何というか。
単極双投スイッチ(SPDT)
  • 1つの極をもつ単投スイッチを何というか。
単極単投スイッチ(SPST)

ネットワーク/Numpyに関する問題_2020年04月05日

ネットワークに関する問題

  • ネットワーク層において、制御メッセージの送受信や診断に用いられるパケットを何というか。
ICMPパケット
  • 米国の商品返品システムにおいて使用される、返品確認のための番号を何というか。
RMA(Return Material Authorization)番号
  • TCPフラグを6つすべて答えよ
URG, ACK, PSH, RST, SYN, FIN
  • TCPフラグの1つである PSH はどのような目的で使用されるか。
受診者側でデータをバッファリングするのではなく、上位階層に引き渡すことを要求する
  • RST はどのような目的で使用されるか
コネクションのリセット
  • SYN はどのような目的で使用されるか
コネクションの先頭で、シーケンス番号を同期させる
  • FIN はどのような目的で使用されるか
コネクションを正常終了させる
  • 3ウェイハンドシェイクの第一ステップで、クライアントからサーバーに送信する際のパケットの SYN フラグと ACK フラグの状態をそれぞれ答えよ
SYN オン ACK オフ(SYNパケット)
  • これらは第二ステップでサーバーからクライアントに送信するパケットではどうなるか
SYN オン ACK オン (SYN/ACKパケット)
  • 第三ステップでクライアントからサーバーに送信するパケットではどうなるか
SYN オフ ACK オン(ACKパケット)
  • 非スイッチングネットワークにおいて、イーサネットのパケットはネットワーク上のすべての機器に送信される。通常、各機器は自身に関係のあるパケットのみを上位階層に引き渡すが、設定をあるモードに変更すると、すべてのパケットを読むことができる。この、あるモードとは何か。
プロミスキャスモード
  • プロミスキャスモードへの変更を ifconfig を用いて行う際のコマンドを書け。対象の機器を eth0 とする
ifconfig eth0 promisc
  • 他の機器あてに送信されるパケットをキャプチャする行為を何というか
スニッフィング
  • パケットキャプチャをコマンドラインから実行する際に使用可能なツールを1つ答えよ
tcpdump
  • スニッフィングツールの1つで、ユーザ名とパスワードの検索に特化した、Dug Song 氏によるプログラムの名称を答えよ
dsniff
  • スイッチングネットワーク環境では、パケットは本来の宛先の機器にしか送信されない。しかし、送信元アドレスが正規のものであることを保証する仕組みがないため、送信元の詐称が可能である。この行為のことを何というか。
スプーフィング

Numpyに関する問題

  • numpy.empty((1,2,3)) の戻り値について説明せよ
shapeが (1,2,3) で値が初期化されていない array を返す。
  • numpy.empty() の戻り値の配列について、配列にはランダムな値が入っているように見えるが、実際にはランダムではない。どういうことか説明せよ。
numpy.empty() は、引数に与えられた shape を扱えるようにメモリを確保する。このとき、メモリの値は初期化しない。つまり、numpy.empty() が確保したメモリに格納された既存の値が、そのまま配列の値となる。 numpy.empty() が確保したメモリ領域に 3.14, 3.15, 3.16 という値が格納されていれば、戻り値の配列には、それらの値が格納されている。確保されたメモリに格納されていた値が人間にとって理解しやすい値になっているとは限らないため、ランダムに見える場合がある。
参考: https://stackoverflow.com/questions/54379325/numpy-empty-array-not-giving-random-float-after-defining-normal-numpy-array
  • numpy で ndarray を生成する関数の引数 order には、'C' または 'F' が指定できる。それぞれ何を意味するか。
'C' ... メモリ内の要素をClang 風(行ごと)の配置順にする。 
'F' ... メモリ内の要素を Fortran 風(列ごと)の配置順にする。
  • 以下、それぞれの属性が何の情報を持っているか答えよ
1.ndarray.size
2.ndarray.itemsize
3.ndarray.ndim
4.ndarray.shape
5.ndarray.dtype
6.ndarray.nbytes
1.要素数
2.1要素のバイト数
3.次元
4.ndarrayオブジェクトの形状
5.要素のdtype
6.メモリに使われる総バイト数(たぶん ndarray.size * ndarray.itemsize)
  • ndarray.reshape() を実行すると ndarray のオブジェクトが新規に作成される。OかXか。
X。reshape では形状を変更するが、配列のビューの形状を変更するだけで、オブジェクトを新規に作成することはない。
また ndarray は immutable であるため、要素が変更されることもない。
  • ndarray.resize() を実行すると ndarray のオブジェクトが新規に作成される。OかXか。
ndarray は immutable であるため、サイズを変更する際には、新規にオブジェクトを作成する。
  • 次のメソッドを実行した場合の出力を答えよ
g = np.array([[1,2,3],[4,5,6]])
np.resize(g, (3,1))
array([
[1],
[2],
[3]
])

セキュリティ/ネットワーク/Numpyに関する問題_2020年04月04日

セキュリティに関する問題

  • オフバイワンエラー(off-by-one error)とは何か?
数を1つ間違えてしまうことにより発生するエラーのこと。
たとえば、比較演算子を使用した条件分岐で、以下と未満を間違えて使用した場合などに起こる。
  • フェンスポストエラー(fence-post error)とは何か?
オフバイワンエラーの一種。
100メートルの柵を作るために10メートル間隔で杭を打つとすると、杭は全部で何本必要かという問いに対して「10本」と答えてしまう誤りのこと。
正解は 11 本である。
  • OpenSSHにおける有名なオフバイワンエラーのコードと、その正しい(本来記述すべきだった)コードを書け。 また、その誤りによってどのような脆弱性が生じたか。
誤り
if (id < 0 || id > channels_alloc) {

正解
if (id < 0 || id >= channels_alloc) {

一般ユーザーで認証・ログインしている場合でも、システム管理者の特権を奪取することができた。
Unicode 文字のサポートによりバックスラッシュ(0x5c)を表現する文字コードが複数できてしまった。
たとえば、%c1%9c という文字が IIS ではバックスラッシュとして解釈されるが、これを解釈するタイミングが、
パスチェックの後になっていた。このため、バックスラッシュの代わりに %c1%9c という文字を入力すると、ディレクトリを横断できるようになっていた。
  • NOPスレッドとは何か。また、どのような目的に使用されるか。
NO Operation を意味するアセンブリ命令 nop に由来するハッキング技術。スタックベースのバッファオーバーフロー攻撃を成功させる目的で用いられる。
攻撃者が実行したいシェルコードの前に nop 命令を詰め込むことによって、インストラクションポインタがシェルコードに到達するのを助ける。
NOP スレッドのスレッドは「そり(sled)」を意味する。
  • bash のコマンドで数値列を生成するものは何か。
seq コマンド。 `seq 1 10` で 1~10の値を出力する。Python の range と違って 1 から出力される。
  • コマンド置換とは何か。またどのように記述するか。
$()をつけて記述することによって、コマンド出力に置き換える方法。

$ echo $(ls -ls)
  • /etc/passwd ファイル中でユーザIDを0に変更すると、そのユーザにはどのような権限が与えられるか
root 権限
  • c言語の printf() 関数の引数にフォーマット文字列として %n パラメータを与えた場合、どのような挙動をするか
何も出力せず、与えたパラメータ(メモリアドレス)に、%n までに出力したバイト数が書き込まれる。
(%n パラメータにはポインタを入力として与える)

ネットワークに関する問題

Open Systems Interconnection
データリンク層
TCP

-データグラムソケットは、トランスポート層で使用される技術の1つであるが、ストリームソケットと比較してどのような利点・欠点があるか

ストリームソケットに対してプロトコル(UDP)にオーバーヘッドが存在しない、また、開発者が通信を自由に作り上げることができる、という利点があるが、一方向通信であり信頼性は低い。
  • ASCII コードで 0x0d と 0x0a はそれぞれ何を示しているか
0x0d CR キャリッジリターン
0x0a LF ラインフィード
セッション層
MACアドレス
Media Access Control
  • MACアドレスは6バイト長であるが、前半3バイトと後半3バイトで、それぞれどのように割り当てられるか
前半3バイトがベンダーID。後半3バイトが製造者が独自に割り当てるID(機種ID、シリアルIDなどが当てられる)。
14バイト
送信元アドレスと宛先アドレスなど
  • イーサネットアドレスの1つとしてブロードキャストアドレス ff: ff:ff:ff:ff:ff があるが、このアドレス宛にパケットを送信した場合、パケットは、どの機器に送信されるか。
同一ネットワークに接続されたすべての機器
  • ARP とは何の略か
Address Resolution Protocol
  • ARP の役割は何か
IPアドレスとMACアドレスを対応付ける
  • ARPメッセージには4つのタイプがあるが、そのうち最も重要なものを2つ答えよ
ARPリクエストメッセージ
ARPリプライメッセージ
  • 機器Aが機器Bに対しTCPコネクションを確立しようとしたとき、機器BのIPアドレスを得るために、最初に参照するところはどこか。
ARPキャッシュ
  • ARPキャッシュに接続先のIPアドレスが存在しなかった場合、機器はどのアドレスに対してARPリクエストを送信すればよいか。
ブロードキャストアドレス。ブロードキャストでARPリクエストを受け取った機器のうち目的とする接続先だけが、ARPリプライを返す。このとき、ARPリプライに含まれるIPアドレスがARPキャッシュに保存される。

機械学習に関する問題

  • googol とはどのような数字か
10**100
(Google の命名のもととなったといわれる)
  • 次のコードの最終行の出力はどうなるか
(問題)
>>> v = [0.5, 0.75, 1.0]
>>> m = [v, v, v]
>>> m
[[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]]
>>> v[0] = 'Python'
>>> m
(解答)
[['Python', 0.75, 1.0], ['Python', 0.75, 1.0], ['Python', 0.75, 1.0]]
  • 次のコードの最終行の出力はどうなるか
(問題)
>>> v = [0.5, 0.75, 1.0]
>>> m = 3 * [deepcopy(v)]
>>> m
[[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]]
>>> v[0]='Python'
>>> m
(解答)
[[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]]
  • Python3 における list と array の主要な違いは何か。
array は型を制限できる。
>>> from array import array
>>> arr = array('f', [0.1, 0.2, 0.3])
>>> arr.append('str')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be real number, not str
  • numpy.ndarray の nd とは何を意味するか?
N-dimensional
  • numpy.arange は range 関数と似ているが、引数にあるものを追加できる。何を追加できるか?
dtype

>>> from numpy import arange
>>> from numpy import float
>>> arr = arange(0, 30, 3, dtype=float)
>>> arr
array([ 0.,  3.,  6.,  9., 12., 15., 18., 21., 24., 27.])
  • 次のコードの出力を答えよ
(問題)
import numpy as np
a = np.arange(1, 11, 1, dtype=np.float)
a.sum() ... (1)
a.mean() ... (2)
a.cumsum() ... (2)
(解答)
(1) 55.0
numpy.ndarray.sum() は全要素の総和を出力する。
(2) 5.5
numpy.ndarray.mean() は平均値を出力する。
(3) array([ 1.,  3.,  6., 10., 15., 21., 28., 36., 45., 55.])
numpy.ndarray.cumsum() はインデックス0からの累積和を出力する。
  • Numpyにおけるユニバーサル関数とはどのような関数か
numpy.ndarray の全要素について、要素ごとに演算を実行して返す関数。結果は ndarray で返される。
ndarray だけでなく、Python の基本データ型についても適用できるため「ユニバーサル」という名前がついている。
ただし、math モジュールより性能が劣る場合がある。

>>> import numpy as np 
>>> lst = [1, 2, 3]
>>> np.exp(lst)
array([ 2.71828183,  7.3890561 , 20.08553692])
>>> np.sqrt(lst)
array([1.        , 1.41421356, 1.73205081])
  • 次の最終行の出力を答えよ
(問題)
>>> a = np.array([.1, .2, .3])
>>> b = np.array([a, a*2])
>>> b[:, 1]
(解答)
array([0.2, 0.4])

ndarray[:, 列インデックス」で列の ndarray が取得できる。
  • 次のコードの出力を答えよ
(問題)
>>> a = np.array([.1, .2, .3])
>>> b = np.array([a, a*2])
>>> b
array([[0.1, 0.2, 0.3],
       [0.2, 0.4, 0.6]])
>>> b.sum(axis=0) ... (1)
>>> b.sum(axis=1) ... (2)
(解答)
(1) array([0.3, 0.6, 0.9])
ndarray.sum(axis=0) で第1軸(縦軸)の要素の総和が出力できる。
(2) array([0.6, 1.2])
ndarray.sum(axis=01 で第2軸(横軸)の要素の総和が出力できる。

レジスタ/アセンブリ言語/メモリ空間/無線通信/コンデンサに関する問題_2020年04月03日

レジスタに関する問題

eax アキュミュレータ
ecx カウンタ
edx データレジスタ
ebx ベースレジスタ
  • 汎用レジスタのうちポインタまたはインデックスときて用いられるレジスタを4つ答えよ
esp スタックポインタ
ebp ベースポインタ
esi ソースインデックス
edi デスティネーションインデックス
  • eip レジスタ(インストラクションポインタまたはプログラムカウンタ)の役割を簡潔に述べよ
プロセッサの実行しようとする現在の命令が格納されたアドレスを指し示す。

アセンブリ言語に関する問題

命令語    操作対象,参照元
(ニーモニック  デスティネーション,ソース)
1. mov    ebp,esp
2. sub     esp,0x8

1.espからebpへのデータの移送
2.espから8を減算

メモリ空間に関する問題

  • メモリのセグメント化について、メモリ空間を5つのセグメントに分割した場合の、それぞれの名称を答えよ
text data bss heap stack
  • プログラムの実行時、最初にeipレジスタが指し示す場所は、5つのセグメントのうち、どのセグメントのどこか。また、なぜ、そのセグメントを指し示すかについても、合わせて答えよ。
textセグメントの先頭。textセグメントにマシン語が格納されるため。
  • dataセグメントとbssセグメントの違いを述べよ。
dataセグメントには、初期化されたグローバル変数や静的変数が格納される。bssセグメントには、初期化されていないグローバル変数や静的変数が格納される。
  • bssセグメントのbssは何の略か。
Block Started by Symbol
  • スタックセグメントにおいて、スタックを実現する際に、esp(スタックポインタ)とebp(ベースポインタ)はどのような働きをするかを説明せよ。
espはスタックの末端のアドレスを記憶し、スタックフレームのプッシュやポップの度にアドレスを変更する。ebpは、現在のスタックフレームに格納されている局所変数を参照する。
  • 32ビットで数値を表現するとき、符号なし整数は0からいくつまでの値を表現できるか。
4,294,967,295
  • 32ビットで数値を表現するとき、符号付き整数が表現できる値の範囲を答えよ。
-2,147,483,648 ~ 2,147,483,647

無線通信に関する問題

  • 無線通信において、送信するデータは 0, 1 のバイナリデータとして表現されるが、このデータ列のことを何信号というか。
ベースバンド信号
  • ベースバンド信号を電波として放出する際に、基準となる信号の周波数のことを何周波数というか?
搬送波周波数
  • ベースバンド信号と搬送波周波数を使用する変調方式を3つ答えよ。
振幅偏移変調方式(ASK), 位相偏移変調方式(PSK),  周波数偏移変調方式(FSK)
  • 振幅偏移変調方式(ASK)とは、どのような変調方式か。
ベースバンド信号の 1 は搬送波信号のまま、0 は搬送波信号の振幅 0 として表現する。

位相偏移変調方式(PSK)とは、どのような変調方式か。

ベースバンド信号の 1 は搬送波信号のまま、0 は搬送波信号の位相を反転して表現する。
  • 周波数偏移変調方式(FSK)とは、どのような変調方式か。
ベースバンド信号の 1 は搬送波信号のまま、0 は周波数を変更して表現する。
攻撃者が盗聴して得た通信情報を再送信することによって成立する攻撃。
たとえば、スマートキーの解錠の通信情報が盗聴され、攻撃者によって再送信された場合、
攻撃者が不正にキーを解錠できてしまう可能性がある。通信が暗号化されていても成立する場合がある。
  • Bluetooth の通信方式の特徴の1つとして周波数ホッピングある。これはどのようなものか。
短い時間間隔で周波数を変更する通信方式。盗聴対策として取り入れられた。
攻撃者が、短時間で変更される周波数を追わなくてはならないため、盗聴が困難になる。

コンデンサに関する問題

セラミックコンデンサには極性がない。
電解コンデンサには極性がある。
ファラッド(F)。目安として、初心者向けの電子工作では1,000μF(マイクロファラッド)くらいのコンデンサを使う。

CentOS7への不正なログイン失敗のログを取得する

さくらのVPSを借りて、CentOS7をインストールしたあと、パスワードによるログインを許可したままにしておくと、大量に不正なログイン試行があるので、そのログを取得して中身をみる。

さくらのVPSでは、OSインストール時に、パケットフィルタが設定される。デフォルトの設定では ssh のみ許可されるが、ssh のアタックログはかなり多い。

続きを読む

VSCodeから直接コードを共有できる拡張機能 Harigami for VSCodeを作った

先日、Qiitaで紹介したWebサービス「Harigami」のVSCode拡張を作成したので、開発でハマった部分を含め、共有します。

Harigamiとは

Harigamiは、ログインや新規登録不要で、ソースコードを共有できるWebサービスです。

Harigami

f:id:sti320a:20190103182425p:plain

トップページの入力フォームに共有したいソースコードを入力し、言語を選んで送信します。 すぐにURLが発行され、モーダルに表示されるので、それをコピーして共有します。

f:id:sti320a:20190103182512p:plain

そのままTwitterやLINEで共有することもできます。

続きを読む

Werkzeugのチュートリアルを3時間くらいでやってみた

WSGI準拠のサーバーライブラリ「Werkzeug」のチュートリアルをやってみました。

Werkzeug とは?

Werkzeug(ヴェルクツォイク)は、Flaskにも使われている非常にシンプルなWSGIユーティリティライブラリです。WSGI(ウィズギー)に準拠したアプリケーションを簡単に作ることができます。

公式チュートリアルは、こちらの公式サイトで読むことができます。

Werkzeugのチュートリアルの概要

Werkzeugのチュートリアルでは、URL短縮サービスを作ります。 公式チュートリアルにはTinyURLのクローンを作ると書いてあるので、これを見るとイメージしやすいでしょう。

チュートリアルを実施するにあたり、Werkzeug以外に、テンプレートエンジンに「Jinja2」を、データベースに「redis」を使います。 また、Windows環境では、redisを使うために、MicrosoftArchiveから最新版の.msiをダウンロードし、インストールする必要があります。

続きを読む