一年寝過ごした。
※この記事は ICT Advent Calendar 2017 の11日目の記事です.
nemuです.
今年もアドベントカレンダーの時期がやってきましたね.
昨日は偉大なるジェダイ マスター・ヨーザの記事でした.
フォースの継承、楽しみですね。
1年何してたの
- 1~2月 覚えてないぞい
- 3月 春合宿でぴゅあのしゅーがくりょーこんを2年生と一緒に開発する, PCKチーム決定
- 4月 アプリ発表会で1時間クオリティのタイマーを出す
- 4~6月 アイディア出しで病む
- 7月 企画書提出後+お話し会あとに一週間くらい休む
- 8月 寝て起きたら9月になっていた
- 9月 U-22プロコンになにかを出したりした
- 10月 greeeenapple先輩のHardeningに参加
ISUCONに参加 - 11月 パソコン甲子園(PCK)2017でベストデザイン賞
- 12月 研修旅行でしゅーがくりょーこんが動いてて感動
パソコン甲子園のアイディア出しはプロコン組より長くできるので強い心がないと病みます.
しゅーがくりょーこん凄かったですね.
ISUCONは高専プロコンとパソコン甲子園の間にあるのでそのメンバーで参加すると爆発します(爆発しました)
セキュリティ系やISUCON楽しかったのでハマりそうです.
ということでセキュリティミニキャンプ in 沖縄 12月16, 17日に行ってきます.
やりたかったことはできたか
競プロ(PCKがんばる, 実装力, 考察力をみにつける<-これは開発にもつながる).
寝ても眠いのは違憲 - ぷよぐやみんぐ日記
pythonを軸にいろんな知見を得る(小さなツールとかたくさん作ってみたい).
数学と仲良くなる.
競プロ <= いいえ(たまにABC全完できるようになった)
pythonを軸にいろんな知見を得る <= いいえ(ISUCON, アプリづくり楽しかった)
数学と仲良くなる <= いいえ(かなしいね...)
来年何やりましょうか
- バックエンド
- フロントエンド
- でぃ~ぷら~にんぐ実践
- ictechとか引き継いでやりたさがある
セキュリティ・ISUCON続けます.
2, 3年ではサーバーサイドをやっていたので動きが見えるものを作っていきたいです.
今年はでぃ~ぷら~にんぐの勉強をしていたらパソコン甲子園が発生したので遊んでいきたい.
ictech, なくしたくない文化のひとつです(発表したことはないですが :hoge: )
後輩たちへ
好きなことやって強くなろうな :punch:
やるならやっぱり自分のしたいことがいいですよ.
やりたいことがわからない~って人は流行りのものとか触ってみると
強い人が教えてくれたりします.
わからないことがあったら誰かに相談するとよさがあるかも
Twitterでツイートしたりすると技術的なことはたいてい解決しそう.
合宿と根性があれば過去問かなにか使ってISUCON開催するぞい
興味ありそうな人もいるのでがんばってやりたいぞい.
あしたのアドベントカレンダーは
ICT委員会屈指の歌声yagamian_sobaya先輩です.
きっと記事からもとてつもない美声を感じられることでしょう.
fish shellインストールからanyenvまで on ubuntu17.04
fish shellインストールからanyenvまで on ubuntu17.04
why fish
ubuntu17.04を仮想環境で構築している時に, twitterでfishいいぞ電波を受信したのでfishを始めてみた.
Friendly Interactive SHellの略らしいのでとてもフレンドリー.
why anyenv
こちらも環境構築時に耳にしたのでやろうと思った.
fishのインストール
versionを考えないのであれば何も考えずにapt-get installできる.
$ sudo apt-get install fish
fishのカスタマイズ
fishの設定ファイルであるconfig.fish
(bashの.bashrc
みたいなもの)は,
~/.config/fish/config.fish
にある.
proxyの設定が必要な場合は, 任意のエディタでconfig.fish
を開いて環境に合わせて以下を書き込む.
set --export http_proxy http://proxy_name:port set --export https_proxy http://proxy_name:port set --export ftp_proxy http://proxy_name:port
anyenvのインストール
https://github.com/riywo/anyenv
上記リンクのREADMEを参考に進める.
上記の想定shellがbashなので若干違うことに注意.
$ git clone https://github.com/riywo/anyenv ~/.anyenv $ echo 'set --export PATH "$HOME/.anyenv/bin" $PATH' >> ~/.config/fish/config.fish $ exec $SHELL -l # shellの再起動
**envのインストール
今回はpyenv, goenvをインストールした.
$ anyenv install pyenv goenv
config.fishを開いて以下を書き込む.
# pyenv set -x PYENV_ROOT "$HOME/.anyenv/envs/pyenv" set -x PATH $PATH "$HOME/.anyenv/envs/pyenv/bin" # ここから下にterminalで"pyenv init - fish"と打って出たものを書き込む ### *** ### # goenv set -x GOENV_ROOT "$HOME/.anyenv/envs/goenv" set -x PATH $PATH "$HOME/.anyenv/envs/goenv/bin" set -x PATH $PATH "$HOME/.anyenv/envs/goenv/shims" command goenv rehash 2>/dev/null
python, goをインストールする.(2017/5/10現在の最新(?))
$ pyenv install 3.6.1 $ pyenv global 3.6.1 $ pyenv rehash $ goenv install 1.8.0 $ goenv global 1.8.0 $ goenv rehash $ exec fish
versionの確認
$ python --version Python 3.6.1 $ go version go version go1.8.0 linux/amd64
参考
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>
にすればいいと分かった
- 参考サイト2で
参考サイト
寝ても眠いのは違憲
※この記事はICT アドべントカレンダーの17日目の記事です.
※この記事はうちな~ICTビジネスプラン発表会の日に,
深夜2時に寝て朝の5時に起き夜の23時30分に帰ってきたのちに書かれています.
どうも眠そうな人(@nemu_sou )です.
昨日は強い一年生たちの強い記事でした.
四月に見たときはおもしろくてつよそうだなあ(小並感)などと思っていましたが、
みんな結果を残していてやはりすごかったですね。
とりあえず今年を振り返ってみる
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点だったこと(部分点マスターになれなかった).
感想.
東京の駅は人が多すぎる.
来年はまだ時間があるからといってだらけないで開発する.
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’}]}) |