blank page

プログラミングなどについて書きます

#procon28に参加してきました

第28回高専プロコンに参加してきました.

H!ghSight

team 「サーモン焼いたら鮭」でH!ghSightというシステムを作っていました.

チームメンバーを紹介します.
(6年生)wassan: お笑い芸人
(6年生)yona: お笑い芸人
(3年生)gatya: 笑う人担当
(3年生)u_chi_ha_ra_: 皆の椅子を温める・お茶汲み担当
(2年生)cheese: 天然cheese担当
(2年生)poteto大先生: 実質ドローン


システムの概要としては,2台のドローンにカメラを1つずつのせてそのカメラから撮った映像をHMD(ヘッドマウントディスプレイ)で見よう!!!みたいなシステムです.


結果

敢闘賞でした(´・ω・`)

反省

すぐに思いつくものを何個か挙げると...

  • 完成度がだめだった
  • 使うものの注文が遅かった
  • 費用を抑えるためにやってしまった
  • システムの構成(?)をしっかりと考えていなかった
  • PCが壊れた(?)か何かしたときの対応を考えていなかった


最後のやつが結構大きく,デモ審査とマニュアル審査という実際に動かしたりして審査するやつのときに,HMDが使えなくなるというトラブルが起きて,とてもパニックになりました.(結局直すことができず,HMDでみれない状態で審査を行った)

チームとしての開発力としては十分だったと思うので,いろいろ考え直していきたいです...(´・ω・`)

来年

来年は阿南(多分徳島県あたり)で行われるらしいです.
自分はまだ出るか決まっていませんが,出るんだったら今年の悔しさを来年の大会でぶつけて,企業賞をかっさらいたいです!!!
出ない場合は,出るチームの開発のサポートなどをやろうと思っています!

感想

チームで開発という経験が初めてだったのでとてもいい経験になりました!
使ったことのなかった技術や,普段触ることのない分野を触ることができていろいろ学ぶことができました!

それと,いろいろな企業の人と話すことができてとても楽しかったです!(来年インターンシップがあるのでそのときはぜひよろしくお願いします)


(もっと参加記が書きやすくなるようなつぶやきをしないといけないと思いました)


最後に

つみきっず特別賞おめでとうございます!!!!!
サポートしてくれた皆さん本当にありがとうございました!!!!!

FlaskとOpenCVを使っていたらVIDEOIO ERRORなるものでハマった

Flask && OpenCV

サーバーにアクセスが来たらOpenCVを使ってWEBカメラから写真をとっていろいろするみたいなコードを書いていた時にハマったことがあったのでメモメモ...  

起こったこ

VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

こういうエラーで,カメラが使えないぜ馬鹿野郎と言われています.
           

環境

OS: Ubuntu 16.04 xenial
Kernel: x86_64 Linux 4.4.0-93-generic
🐍 miniconda3-4.1.11

この他に,raspi3でもエラーが出るのを確認しました.
  

     

Sample code

import cv2
from flask import Flask

cap = cv2.VideoCapture(0)
app = Flask(__name__)

@app.route("/")
def hoge():
    _, frame = cap.read()
    """
        ここでいろいろする
    """
    return "HOGE"

if __name__ == "__main__":
    app.run(debug=True)

   

みたいなコードです.

 

いろいろ省いたりしていますがこれを実行すると...

     

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

   

鯖は立ち上がるがVIDEOIO ERRORが出ます:innocent: ぐぐっても解決策の載ってる記事が見つかりませんでした...(自明的なことなのかな)
 
 
 
これに1日あるかないかくらい時間を取られました...
 
まじかなpeopleです.
    

解決方法

app.run(debug=True)debug=TrueFalseにするか消しましょう.
それを保存して実行すると動きます.(自分の環境では)
 
 

おわり

正直理由はこんな感じなんかな〜(?)程度でしかわかってないのでわかるかたぜひ教えてくれると嬉しいです〜!

FlaskでWebアプリケーションを書くときの自分が使うディレクトリ構成のメモ

メモ

メモです.
自分がFlaskでWebアプリケーションか何かを書くときのディレクトリ構成をメモしておきます.

本当に構成しか載せてません :construction:
これは罠で最後にパッケージ管理の何かの話を書いている

小さいアプリケーション

.
├── LICENSE
├── README.md
├── Pipfile
├── Pipfile.lock
├── app.py
└── config.py

基本的にはこんな感じですが,app.pyが大きくなってきた場合は適当にview分けたりしてます.

大きめのやつ

このくらいのやつを書くくらいからはBlueprintを使っています.

.
├── LICENSE
├── Pipfile
├── Pipfile.lock
├── README.md
├── app
│   ├── __init__.py
│   ├── __pycache__
│   ├── config.py
│   ├── statics
│   │   ├── css
│   │   ├── img
│   │   └── js
│   ├── templates
│   │   └── template.html
│   └── views
│       ├── __init__.py
│       ├── __pycache__
│       └── view.py 
│
└── server.py

ファイル名は例です;)

このほかに必要なものが出てきたら,適宜ディレクトリをapp内に生やしたりすると良いです.
大きめとありますが,初心者が作る程度の構成です.

パッケージ管理

最近からpipenvを使い始めましたが,なかなか良さです;)

github.com

前まではpyenv + pyenv-virtualenvを使っていたのですが,pipenvは導入が楽すぎて楽なので楽って感じです.(pip install pipenvで終わるため)

AtCoder Regular Contest 082 & AtCoder Beginner Contest 072

ABC全完したので一応報告

初めてABC全完したので適当にコードを書いておこうと思います.

A

A - Sandglass2

やる

#include <iostream>
using namespace std;

int main()
{
  int x, t;

  cin >> x >> t;
  if (x - t <= 0) {
    cout << 0 << endl;
  } else {
    cout << x - t << endl;
  }

  return (0);
}

B

B - OddString

やる.

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string s;
  
  cin >> s;
  for (int i = 0; i < s.size(); i++) {

    if (i % 2 == 0) {
      cout << s[i];
    }
  }
  cout << endl;

  return (0);
}

C

C - Together

割と時間かかった. 思いついたら簡単だった.

#include <bits/stdc++.h>
using namespace std;

int res[100005];

int main()
{
  int n;
  cin >> n;

  for (int i = 0; i < n; i++) {
    int tmp;
    cin >> tmp;

    res[tmp]++;
    res[tmp + 1]++;
    res[tmp - 1]++;
  }

  int max = -100;
  for (int i = 0; i < 100005; i++) {
    if (max < res[i]) {
      max = res[i];
    }
  }

  cout << max << endl;

  return (0);
}

maxを変数にするのはまずいですね…反省…(´・ω・`)

D

D - Derangement

簡単でした.

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int n;
  cin >> n;
  vector<int> p(n);
  int cnt = 0;

  for (int i = 0; i < n; i++) {
    cin >> p[i];
  }

  for (int i = 0; i < n; i++) {
    if (p[i] == i + 1) {
      if (i != n - 1) {
        swap(p[i], p[i + 1]);
        cnt++;
      }
      else {
        swap(p[i], p[i - 1]);
        cnt++;
      }
    }
  }

  cout << cnt << endl;

  return (0);
}