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

ぷよぐやみんぐ日記

@nemu_souがお送りするNIT-Ok ict委員会でのぷよぐやみんぐ日記 雑記

pythonでの入力

入力に用いる関数 input()

input関数は入力を文字列で返します.
文字列を別の型にキャストして数値として扱ったりします.
ex. pythonで文字列'14'をint型にキャストすると数値14になります.

# 文字列 str型
s = input()
>>> 入力されるよ
# s => '入力されるよ'

# 整数 int型
i = int(input())
>>> 7
# i => 7

# 実数 float型
f = float(input())
>>> 5.4
# f => 5.4

list内包表記

list型(C言語でいう配列のようなもの)
set型(集合を扱う型, 重複を省いたりする)

a_str = [i for i in input().split()]
>>> 複数の値が 入力 されるよ
# a_str => ['複数の値が', '入力', 'されるよ']
# 文字列の場合 a_str = input().split() で同じことができる

a_int = [int(i) for i in input().split()]
>>> 1 2 3
# a_int => [1, 2, 3]

a, b, c = [int(input()) for i in range(3)]
>>> 3
>>> 5
>>> 7
# a => 3
# b => 5
# c => 7

# set内包表記
a_str = {i for i in input().split()}
>>> わーい すごーい たーのしー すごーい
# a_str => {'すごーい', 'たーのしー', 'わーい'}

a_int = {int(i) for i in input().split()}
>>> 1 1 2 3 5 8 13
# a_int => {1, 2, 3, 5, 8, 13}

map

リスト内包表記を使う以外の方法としてmapを使ったものがあります.  
リスト内包表記より実行速度が速いです.

a_str = list(map(str, input().split()))
a_int = list(map(int, input().split()))

文字列の分割に用いる関数 split()

split()は標準で文字列を空白区切りで分割します.

s1 = '文字列が 区切れるよ'
s2 = 'カンマでも,区切れるよ'
s3 = '2文字以上でも, 区切れるよ'
s4 = '文字列が たくさん あっても 区切れるよ'

# 分割された文字列はlist型で返されます.
s1.split() # => ['文字列が', '区切れるよ']

# 引数で分割する文字を指定することができます.
s2.split(',') # => ['カンマでも', '区切れるよ']

# 2文字以上でも区切ることができます.
s3.split(', ') # => ['2文字以上でも', '区切れるよ']

# 文字列が複数あっても区切ることができます.
s4.split() # => ['文字列が', ' たくさん', 'あっても', '区切れるよ']

Flaskアプリケーションをuwsgi + nginxで動かしてみた

やってみる理由

去年のPCK(パソコン甲子園)で作ったアプリ「ふぁみここ」でサーバー側としてFlaskアプリケーションを実装しました.
その時は, uWSGIやnginxは名前だけ知っている状態でPCK本番もFlaskのrunメソッドで動かしていました.
※Flaskのrunメソッドは開発で使うもので, 実際にサービスを提供するためのものではないそうです.
前日夜と本番中, サーバーのメモリ使用率が爆発して数十分間サーバーにアクセスできない事態が起き, 今後それを回避するため uwsgi + nginx での動かし方に挑戦してみました.

環境構築

基本環境 : VMware, Ubuntu 16.04
インストールするもの

sudo pip3 install flask uwsgi
sudo apt-get install nginx

ディレクトリの作成

mkdir ~/python/flask/1/

個人的にできるだけ/ディレクトリ以下をごちゃごちゃさせたくなかったので
基本的にhomeディレクトリのしたで作業しました.

flaskアプリの作成

cd ~/python/flask/1/
vim app.py

Flaskの公式ドキュメントのものを使います.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

uwsgi設定ファイルの作成

flaskアプリと同じディレクトリで作業します.

vim uwsgi.ini

ここで'~‘を使って指定するとNo such file of directoryと怒られるので注意しましょう.

[uwsgi]
#application's base folder
base = /home/nemu/python/flask/1/
# /home/user_name/python/flask/1/

#python module to import
app = app
# app = app_nameを入れる
module = %(app)

#socket file's location
socket = %(base)/uwsgi.sock
#socket = /var/www/flask/tmp/uwsgi.sock
#socket = /tmp/uwsgi.sock

#permissions for the socket file
chmod-socket = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

#location of log files
logto  = %(base)/log.txt
#logto = /var/log/uwsgi/%n.log

master = true
processes = 1
vacuum = true
die-on-term = true

nginx設定ファイルの作成

sudo vim /etc/nginx/sites-enable/uwsgi.conf
server {
  listen 8080;
  error_log /home/nemu/python/flask/1/error.txt warn;

  location / {
    include uwsgi_params;
    #uwsgi_pass unix:///tmp/uwsgi.sock;
    #uwsgi_pass unix:///var/www/flask/tmp/uwsgi.sock;
    uwsgi_pass unix:///home/nemu/python/flask/1/uwsgi.sock;
  }
}

設定の確認

sudo service nginx testconfig

[fail]とでたら間違っている場所を探しましょう.
[OK]とでたら設定を読み込ませます.

sudo service nginx reload

uwsgiを動かす

flaskアプリがある場所で作業します.

uwsgi --ini uwsgi.ini

ブラウザから127.0.0.1:8080にアクセスしてHello, World!が表示されると成功です.

やってて困ったこと

  • ‘~'を使ったディレクトリ指定で怒られた
    • /home/<user_name>/ で指定した
  • .confファイルでセミコロンをつけ忘れた
    • /var/log/nginx/にerror.logというファイルがありそれを見て分かった
  • この記事ではやってないが, 参考サイト1でnginxに権限を与えているところでユーザー指定が不正と言われた
    • 参考サイト2でnginx:nginxの場所を<user_name>:<user_name>にすればいいと分かった

参考サイト

  1. http://qiita.com/kent_ocean/items/1d8e0d6e0b853b424fcf
  2. http://vladikk.com/2013/09/12/serving-flask-with-nginx-on-ubuntu/

寝ても眠いのは違憲

※この記事はICT アドべントカレンダーの17日目の記事です.

※この記事はうちな~ICTビジネスプラン発表会の日に,

深夜2時に寝て朝の5時に起き夜の23時30分に帰ってきたのちに書かれています.

 

どうも眠そうな人(@nemu_sou )です.

昨日は強い一年生たちの強い記事でした.

potato0022.hatenablog.com

b-mk.hatenablog.com

rio-k827.hatenablog.com

 

四月に見たときはおもしろくてつよそうだなあ(小並感)などと思っていましたが、

みんな結果を残していてやはりすごかったですね。

 

とりあえず今年を振り返ってみる

1月 : たぶんだらだら競プロしてた.

2月 : 同上

3月 : 競プロをやるならとりあえずAOJ100問解けと教授に言われて100問解いた.

結果的には開発組としてPCKモバイル部門のメンバーになった. (ここからPCKが終わるまで競プロはほぼAtCoderしかしなかった.)

4月 : アイディア出しに苦しむ.

5月 : 同上

6月 : アイディア出しと企画書に苦しむ.

7月 : 企画書提出二週間後に結果発表、予選通過.

8月 : 頭のなさ+テストの合間ということで数学甲子園が爆発した. 夏休み突入.

9月 : (pythonわからず && サーバーわからず && ラズパイわからず)でめっちゃぐぐってたくさんコードを書いて消した.

10月 : すこしずつわかってきたものの頭のないコードをはやしまくった.

11月 :  パソコン甲子園. ベストデザイン賞をとった. latteぷろとwingぷろに出会う.

12月 : JOI予選, 20点足りずBランク. mitoの頑張りによりうちな~ICTビジネスプラン発表会で受賞.

 

おもしろかったこと.

PCK競技予選に相方(@RINPANMAN0606 )が一時間半遅刻してきた.

PCKで送る郵便物の紙を無限に書き間違えた.

PCKのハイライトがしゅりで埋まった.

PCK会場ですぐ近くに日本有数の進学校の人々がいた.

latteぷろがイケメンだった.

温泉さいこう.

くやしかったこと.

ベストデザイン賞でチーム名を呼ばれた時, 受賞した嬉しさよりもグランプリを取れなかった悔しさのほうが先に来た.

JOI予選通過まであと20点だったこと(部分点マスターになれなかった).

感想.

会津秋葉原たのしかった.

東京の駅は人が多すぎる.

python, サーバー, ラズパイの経験値を得た.

来年はまだ時間があるからといってだらけないで開発する.

JOIに落ちたけど逆に競プロモチベが今まで通りある. これは競技の強い人たちにいつか会いたくなったため.

年度末の学校の表彰でICT委員会の人々が無限に呼ばれるのが楽しみ.

 

来年やりたいこと(目標)

競プロ(PCKがんばる, 実装力, 考察力をみにつける<-これは開発にもつながる).

pythonを軸にいろんな知見を得る(小さなツールとかたくさん作ってみたい).

数学と仲良くなる.

 

まとめ

来年も, この不思議でおもしろくてつよい人たちが集まるICT委員会でたくさんおもしろいことができるようにがんばりましょう.

疲れた深夜のテンションで書いたのでとても雑な文章ですが, ここまで読んでくれてありがとうございました.

 

 今日は僕以外にも一年生が二人記事を書いてくれています. ぜひ読みましょう.

//roy-lの記事

//Shoの記事

 

明日は禁止された宗教における神の一人であるところのmitoくんです.

//mitoの記事

楽しみで夜も眠れませんね.

そりでは, ぽやしみ~.

MongoDB 操作入門

mongoDB 起動/再起動/停止

$ sudo service mongod start
$ sudo service mongod restart
$ sudo service mongod stop

mongo shellの起動

$ mongo

DBの作成・選択/選択しているDBの詳細/削除/表示

> use データベース名
> db.stats()
> db.dropDatabase()
> show dbs

collectionの作成/詳細/削除

> db.createCollection('collection名');
> db.collection名.stats()
> db.collection名.drop()

document操作

データ挿入

> db.collection名.insert({"name":"nemu_sou"})

複数データ挿入

> db.collection名.insert({name:"nemu_sou", hoby:"programming"})
> db.collection名.insert({name:"nemu_sou", hoby:"programming", age:16})
> db.collection名.insert({name:"nemu_sou", hoby:["programming", "sleep", age:16})

document表示

> db.collection名.find()

document検索の条件指定

> db.collection名.find(条件)
> db.collection名.find({name:"nemu_sou"})
> db.collection名.find({name:"nemu_sou", hoby:"programming"})
> db.collection名.find({member:["nemu_sou", "kurokoji", "mito", "luz"]})
> db.collection名.find({member:{ $in:["nemu", "mito"]}})

条件の例

演算子 MongoDB 意味 sample
< $lt 右辺より小さい {age:{$lt:100}}
<= $lte 右辺以下 {age:{$lte:100}}
> $gt 右辺より大きい {{age:{$gt:100}}
>= $gte 右辺以上 {age:{$gte:100}}
!= $ne 等しくない {name:{$ne:‘mr.a’}}
該当なし $in 要素が含まれているか ({member:{ $in :[“nemu”, “mito”]}})
該当なし $exists フィールド(列)自体の存在チェック ({name:{$exists:false}})
OR $or $orで指定する条件のいずれかを満たすものを抽出 ({$or:[{name:“nemu_sou”}, {hoby:‘sleep’}]})

0-1 ナップザック問題のDPを考える

「0-1 ナップザック問題」

AOJ (0-1 Knapsack Problem | Aizu Online Judge

↑これ 

問題内容は以下の通り

価値が vi 重さが wi であるような N 個の品物と、容量が W のナップザックがあります。次の条件を満たすように、品物を選んでナップザックに入れます:

  • 選んだ品物の価値の合計をできるだけ高くする。
  • 選んだ品物の重さの総和は W を超えない。

価値の合計の最大値を求めてください。

DP(Dynamic Programming)、もしくは動的計画法と呼ばれる解き方(考え方)の入門的な問題(かな?)

そもそもDPってなに?

大雑把に考えて、一度見たものを記録(配列に保存する等)してあとで必要になった時にべんり~。みたいなもの

それの何がいいの?

ひとつの情報を扱うときに保存することで何度も計算したりしなくてよくなる。

計算時間が減る

いままで手に負えなかった一部のTLE(Time Limit error)に対応できるようになる。

わーい、やったー(/・ω・)/

 

考え方が...

そう、べんり。わかる。

ただ、ぼくじゃちょっと難しい。

だから考えたことを残しておく事にした。

ここからがアレ

 じゃあ何が難しいなあと感じたのか

動的計画法を使う(使わなくても簡単にできる)問題にフィボナッチ数列の問題がある

AOJ(フィボナッチ数列 | アルゴリズムとデータ構造 | Aizu Online Judge

int fib(unsigned int n) {
    int memo[1000] = {0, 1}, i;
    for (i = 2; i <= n; i++) {
        memo[i] = memo[i - 1] + memo[i - 2];
    }
    return memo[n];
}

(コードはwikiのだからそのまま使ってもできないと思うまる)

わかる

 

さあテーマの0-1 ナップザック問題。(問題内容は上見て思い出して)

#include <iostream>
 
using namespace std;
 
int dp[101][10001];
int main()
{
  int N, W, i, j, ans = 0;
  cin >> N >> W;
  int v[N + 1], w[N + 1];
 
  for (i = 0; i < N; i++){
    cin >> v[i] >> w[i];
  }
  for (i = 0; i < N; i++){
    for (j = 0; j <= W; j++){
      dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
    }
    for (j = 0; j <= W; j++){
      if (j + w[i] <= W){
        dp[i + 1][j + w[i]] = max(dp[i + 1][j + w[i]], dp[i][j] + v[i]);
      }
    }
  }
  for (i = 0; i <= W; i++){
    ans = max(ans, dp[N][i]);
  }
  cout << ans << endl;
 
  return (0);
}

ぼくがNIT-Okで所属しているICT委員会のslackの1day1probrem channelで問題として出されたとき上のコードを提出しました。
しかしこの問題、以前に一度挑戦してあきらめ他の人の解答を見てなるほど~。は~。わからん。とか言ってたんです。
そして今回解いたとき「こんな感じだったなー」、「こうだったかなー」と記憶を頼りにやってました。

そうじゃないんだ!!!

それじゃ使えてるとは言えないんだ!!!

ばかやろう!!!!!!!!!!

めっちゃ分かってなかった場所がここ

dp[i + 1][j + w[i]] = max(dp[i + 1][j + w[i]], dp[i][j] + v[i]);

...(。´・ω・)???
てな感じですよ

やっとここから

今回書いておきたかったことはここから始まる.
ただの整理である.

for (i = 0; i < N; i++){
  for (j = 0; j <= W; j++){
    dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
  }
  for (j = 0; j <= W; j++){
    if (j + w[i] <= W){
      dp[i + 1][j + w[i]] = max(dp[i + 1][j + w[i]], dp[i][j] + v[i]);
    }
  }
}
  • 一番外側のfor文はi=0からN-1まで、つまり個数分roop.
  • 内側の一つ目のfor文で個数違いで同じ重さのとき高い方の価値で上書きしている.
  • 内側の二つ目のfor文で「i番目のものをナップザックに入れたときの重さ<=ナップザックに入る重さ(W) 」が真のとき.
  • max(前に保存された価値, i番目のものを入れたときの価値)で大きい方を保存.

最終的にdp[N][0≦j≦W]の高さに全ての個数を見た後の重さ違いの価値の最大値が入っている.

for (i = 0; i <= W; i++){
  ans = max(ans, dp[N][i]);
}
cout << ans << endl;
  • 最後にその中で一番価値が高い値を変数ansに保存して出力.

いやーわかりやすいなあ(((棒)))

終わりです。

なんか今後もわかんないことがあればこんな感じで一回ちゃんとまとめていこうかと思います.

それでは。

1年の計は元旦にあり(・_・)

あけましておめでとうございます。

激動(O高専入学)の年2015年が過ぎ2016年がやってきました。

4月には後輩が来るなんて信じられません。

 

nemu-sou.hatenablog.com

なんでもやります。

らしいです。素晴らしいですね。

 

 

f:id:nemu_sou:20160101174956p:plain

 

アばばばばばばっばばばばばっばばっばっばっばっばばっばっばbbっばっばっばばっばbbbbbbbbbbbbbbっばあbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbっばあああああああああああああああ

 

まったくわからなぁぁぁぁい( )

ggrggr

f:id:nemu_sou:20160101180022p:plain

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

 

・・・

冬休み明けて余裕ができたらict委員会の先輩に聞きに行こうと思います。

 

 

ムリ、じゃあなにしよう

ぷよぐやみんぐクソザコジャンaojやろ

 

問題文を読む

(白目)

 

ここまでの時間わずか数秒

解けない上にやる気でないって詰んでるじゃん。。。

 

もうゃだ。まぢむり、、、ITPしょ。。。

ict委員会に入ってからの出来事、、、来年は(=゚ω゚)ノ

※この記事はICT Advent Calendar 2015 の17日目の記事です。

はじめに

皆さんこんにちは、こんばんは。今年もやっと寒くなってきて布団から出れない季節になりましたね。私は最近22時に寝て3時に起き二度寝する生活をしてます。(不本意です。眠いです)

 

mosmos-syrc.hateblo.jp

 

12期から「かわいい」と評判のC++のプロ、眠そうな人(@nemu_sou)

 

だいぶ誤弊がありそうなこと書かれてましたね。

結局JOI予選でもc++で書きはしませんでしたし。

 

※この記事はJOIの結果が出た後かなしみに包まれながら書いています。

 

もくじ的なの

  • 四月から大まかに振り返る

  • 来年やる事

  • ict委員会12期生へ

  • matome

四月から大まかに振り返る

  • 四月--高専入学、ict委員会に入るプロⅠわっほい
  • 五月--プロⅠわっほい
  • 六月--同上
  • 七月--プロⅠおわた、プロⅡわっほい
  • 八月--プロ(略)
  • 九月--お家でダラダラしてたらいつの間にか夏合宿
  • 十月--プロⅡがやっと終わる、c++の道へ
  • 十一月--パソコンにvim, cygwin君がやってくる
  • 十二月-- JOI君にメタメタにされる

夏休みにだらだらしすぎました。1か月ちょっと、大きいです。

それにしてもいろいろありました。←(まとめるの下手)

 

来年やる事

 書こうと思ったんですがやる事やりたい事いちいち書いてたらきりがないので

 興味を持ったことなんでもやります。

 プログラミング、それ以外いろんな事を知りたいです。

 

 ここで横から「筋トレしろ」と言われましたはい。やるかどうかはわかりません。

 

ict委員会12期生へ

 負けない!!!

 プロ(@kuro__koji__), 神(@mitohato14), 超ハイスペック(@mosmos_syrc),

 まなうぇい(@manae_manawey), じゅり氏(___10riridk0)

 いつも一歩先を行ってる上記の強い人たちに追いついてやる。

 ※るいこ(@___rrr1130)は言うまでもなくみんなの癒しです。

 

matome←(まとめるの下手)

 来年は

  • 明らかに無駄に過ごしている時間を減らす。
  • いろんなことを知る。やる。

 そこに立ちはだかる睡魔の壁。座右の銘は「睡魔に勝て」にでもしましょうかねぇ。

 

これで終わりです。。。

 さあ13日(日)から始まった一年生ラッシュも今日で終わりです。

 明日からはまたict委員会の偉大な先輩たちの記事が見れますね!!!!!!!!!

 

 これでICTアドベントカレンダー17日目〆とさせていただきます。

 

 座右の銘:「睡魔に勝て」 by眠そうな人