完全に実力不足な理系大学生からの成長ブログ

プログラミング能力皆無、でも頑張ります。

知らない言語でアジャイル開発のサイクルにかき混ぜられた

お久しぶりです。
よりです。

本記事は下記のアドベントカレンダーに記事になります。
それにしても4回目ですか。(記事書くのは3回目)
すごい。

adventar.org

ほぼ一年ぶりの更新となりますが、
今回はアジャイル開発についての記事を書きます。

ていうかアジャイル開発って何?
っていう人のために僕の認識でアジャイル開発をさらっと書いてから、
自分の話をして行きたいと思います。

アジャイル開発とは

大まかな説明

さぁ、知識がクソほどしかない僕の説明なので3行でいうと?
みたいな感じでいいっすかね?笑

アジャイル開発とは

  1. 迅速かつ適応的に
  2. ソフトウェア開発を行える
  3. 軽量的な開発手法

つまりは「早く柔軟に」ソフトウェアを作っちゃおう!
みたいな感じです。

ウォーターフォールアジャイル

IT系の人ならわかると思いますけど、
アジャイルってウォーターフォールと比較されがちですよね。
一応ウォーターフォールとの大きな違いについてざっくりと説明しておきます。

ウォーターフォールとは

ウォーターフォールの開発は以下の流れに沿って順番に開発のフェーズが進んで行きます。
要件定義 → 設計 → 実装 → テスト → リリース

このような流れにすることで、
最初に話し合って決めた要件通りにきっちりかっちりとシステムが作られて行くわけです。
もちろん要件定義・設計のフェーズで話し合った内容をドキュメントにまとめて、
その通りに実装が進められます。(ドキュメントが証拠見たいな感じになる)
そしてテストのフェーズでドキュメント通りの機能や画面ができているかを確認します。
この時ドキュメント通りでない場合は不具合として報告されるって感じですね。

僕が体験したアジャイル

アジャイル開発ってやり方が決まってるわけではないので僕が体験した
アジャイル開発についてここに記載したいと思います。

まず、要件定義や設計の段階でそこまで詳細にドキュメントを作成しませんでした。
もちろん必要なものは作りますが、最低限といった感じです。
クラスがどんなフィールドやメソッドを持っているかとか、細かくドキュメントには起こしません。
こんなクラスがある、そのクラスの責務は?くらいの粒度ですかね。

実装をして画面やら操作感を作って見てから一度ユーザーに見てもらいます。
触ってもらってユーザーと話し合いながらこうしようああしようと意見を出して
いいものは取り入れていくといった感じでした。

打ち合わせを1週間に1回程度することでユーザーと認識をすり合わせながらシステムが
作り上げられていきます。

ウォーターフォールアジャイルの違い

さっきから書いてますけど僕が最も違うと感じているのは柔軟性です。
一度決まったものを決まった通りに作るのではなく、
お客様の要望を汲み取りながら、開発を進めていく。

スクラム

スクラムってのは僕が体験したアジャイル開発の手法です。
どんなものかというと、

  1. 優先順位ごとに機能を作る
  2. 期間をスプリントという単位で区切り、スプリントごとに計画を立てる
  3. プロジェクト内では毎日ミーティングを行い、メンバー同士で状況を共有

スクラム手法はチームでのコミュニケーションを最重要とします。
毎日チームで課題確認しますし、近くに座って開発するのでわからないことはすぐに共有、解決することができます。

実際にやって思ったこと

javaで業務システムを開発しました。
次にRuby on Railsを使って業務システムを作りました。

業務システムしか作ってないじゃん!!



まぁそうなんですよねー笑
でもスクラム形式の開発は楽しかったです。
チームで円滑にコミュニケーション取れてれば、
開発者同士仲良くなりますし。
お客様と話しながら作るので、
できてから「こんなはずじゃない・・・」て思われることもないです。

こんな開発形態で今後もシステム作りたいですねー

最後めっちゃ雑になりましたが、
箱根旅行中なので許してください笑

最後に

最近お酒飲むの大好きなので飲みに誘ってね!!

社会人1年目でなんやかんや.

はじめに

こんにちは.よりです.
超久々の更新で感慨深いですね.

実はこのブログ,OpenCVの記事が意外とアクセス多くて1日に100アクセスとかあったりするんです.
嬉しいですね.

この記事はKogakuin Univ Advent Calendar 2017 7日目の記事です.
adventar.org

まぁめっちゃ自分語りになりそうなタイトルですよね.
本当はO/R マッパーについての記事とか書こうと思ったんですけど,
大学生にとっては社会人1年目の感想とかのが需要あるかなって.

それでは本題

この記事を読んでるのは大学生(工学院生)が多いんですかね?
そう思って書きます.
もし去年までの僕のことが気になったら過去の記事みてください.
恥ずかしいことたくさん書いてあるんで.

4月から6月

まず僕が入社したのはIT企業です.
でも文系の人もたくさんいました.

入社した会社は研修が手厚く,入社してすぐ3ヶ月間も研修がありました.
もうほぼ学校ですよ.高校生みたいに毎日学校行くみたいな.
まぁ周りのIT企業に入社した人に聞くと結構あるみたいなんですけど.

この期間でプログラミング初心者でも頑張ればプログラミングかなりかけるようになると思います.
僕はとても勉強になりました.

一応少しプログラミングしたことがあったので研修ですごく苦労することはなかったです(プログラミングでは)

あと3ヶ月も研修があるもんだから同期ととても仲良くなりましたね.
最近は同期と遊んでばっかで楽しくてしゃーないです.
入社したら会社はビジネスライクな付き合いで・・・とか思わないで,
同期や先輩とも仲良くやっていこう!っていう気持ちの方が楽しいと思います.

7月から現在

とにかく開発をしています.
でもプログラミングするの楽しいなって思ってるんで苦じゃないですね.
納期に追われて,スケジュールに追われてってなってる時期もありましたが,
当時辛くても今は良かったなーって思ったり.
何かが完成すしてくのって楽しいですやっぱり.

何か問題があっても自分で調べながら解決していくっていうのが楽しい.
まぁ投げ出したかったり放棄したくなったりもしますけど笑

それと自分が作ったものがこれから使われるのかなーって思うと結構テンション上がりますね.

これから就職する人へ

お前まだ1年目だろとか,お前に何がわかるんだとか思いますよね笑
でも知りません.
とりあえず言いたいこと言っておきます.

楽しいようにしましょう!
なんでも楽しいって思えば意外と笑えて楽しかったりするんじゃないですかね.
去年の研究はめっちゃ辛かったけど今思えば真剣にあんなにできて楽しかったなーって思います.

今の開発もめっちゃ期限が迫ってて辛い時もあるけど
なんだかんだできた時はめっちゃ嬉しいし楽しいし.
1人で立ってガッツポーズとかしたりして笑

終わりに

他の人が技術系で一生懸命記事書いてるのにこんな自分語りみたいな記事でごめんなさい笑
気が向いたら真剣にO/Rマッパーの記事に差し替えるかもしれないです.

ま,酒飲んで酔っ払いながら書いてるから許してね!笑

大学生活を経て思うこと

こんにちはよりです.

もう大学生活もあとちょっとで終わるので(当時),
僕の大学生活で良かった点,悪かった点をまとめます.



僕が本当に良かったと思っていることは最後の1年間に集約されています.

普通,大学生って1年でいっぱい出会いがあると思うんですけど,
僕はなぜか大学4年になって突然色々な出会いがありました.

そこで,大学ってこんなに色々な人がいて,色々なことができて,
色々なことを学べる場所なんだって思いました.

自分よりはるかに頭がいい人達と話すことは刺激になったし,
やる気を駆り立ててくれました.

情報系は自分の専門分野なはずなのに,
いかに何もできないで何も知らないで4年になってしまったのかを痛感しました.

研究面では今までで一番プログラミングをしました.

(当時の僕には)無理難題だと思われる技術の勉強をしなきゃいけなくて,
ぶっちゃけ,
「こんなアルゴリズムを実装することなんて素人にできるのかよ」
とか思ってました(笑)
本当に何もしてなかったので…

きっと強い人たちは
「論文に乗ってるアルゴリズム動かさなきゃ始まらんだろ」
とか思ってると思います.
それができない僕はかなり辛かったです.

そんな時のモチベーションは
研究室の仲間だったり
周りのレベルの高い人達だったり
教授への恐怖心だったりしましたが笑

とにかく人との繋がりの大切さを痛感した1年でした.
もっと色々な人と話して色々なことに興味を持っていたかった.


もし大学生活,最初からやり直せるなら,
最初からそんな人たちに出会っていて,
僕も勉強頑張ってればなぁとか思います.

更新日現在社会人になってしまってますが,
最後の一年で成長できたことが今に活かせていると感じています.

これから大学生の人たちは,
何事にも関心をもって,積極的に勉強して欲しいです.

OpenCV(Python)で画像をトリミング

抄録が終わったので,一回更新しときます.
なんだかんだアクセスあると嬉しいですね.
なんだかんだ無料で使えるOpenCVはよい.

なんども言いますが,メモ代わりです.

早速コードを.

#OpenCVをインポート
import cv2

if __name__ == '__main__':

  #画像入力
    im = cv2.imread('Lena.bmp',0)
    
    #新しい配列に入力画像の一部を代入
    dst = im[200:400,70:270]
    
    #書き出し
    cv2.imwrite('cut.bmp',dst)


f:id:yori1029:20170115012702j:plain
入力画像


f:id:yori1029:20170115012723j:plain
出力画像



いや,めっちゃ簡単ですよね笑
pythonだとすごい簡単に書ける気がするんですけど.

こんどから簡単な処理はpythonで書くって誓いました.

OpenCV(C++)で自作二次元フィルタと正規化(0~255)

今回は教授から突然2次元フィルタかけてって言われたのでかけましたってだけの話です笑
メモ程度です.

OpenCVってfilter2Dって関数があるからそこにぶっこんでおけば
ガウシアンフィルターとかメディアンフィルターとか簡単にかけれちゃいますよね.
でも自分で作ったフィルターかけるにはどうすればいいの?
って時のためのメモです.

ていうか今回はあえてfilter2Dを使わないでやったんですけど,
本当はfilter2Dを使った方が早いです.
下記のサイトを参考にしてください.
画像フィルタリング — opencv v2.1 documentation

おそらくfilter2Dだとフーリエ変換して周波数空間でフィルターかけてるんだと思います.
よくわからないですけど笑

とにかく今回は画像に直接フィルターをかけます.

早速ソースコードから.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <math.h>
#include <fstream>
#include <string>
#include <sstream>

using namespace cv;
using namespace std;

//0~255に正規化
Mat normalize(Mat in) {

    //最大と最小の初期値を設定(minが適当なのはやばそう)
    double max = 0;
    double min = 9999;

    //めんどくさいから入力画像をclone
    Mat out = in.clone();

    //最大と最小を取得
    for(int j = 0; j < in.rows; j++){
        for(int i = 0; i < in.cols; i++){
            if(max < in.at<double>(j,i)){
                max = in.at<double>(j,i);
            }
            if(min > in.at<double>(j,i)){
                min = in.at<double>(j,i);
            }
        }
    }
    
    //取得した最大値と最小値で正規化
    for(int j = 0; j < in.rows; j++){
        for(int i = 0; i < in.cols; i++){
            out.at<double>(j,i) = in.at<double>(j,i) * (max - min)/ 255;
        }
    }
  //0~255になったMatを返す
  return in;
}

int main(int argc, char *argv[]){

    //画像入力
    Mat inputimg = imread("01_Lena_syukukaku.bmp_img_6.bmp",0);
    
    //入力画像のコピー
    Mat img = inputimg.clone();
    
    //Matの型をdouble型に変換
    img.convertTo(img,CV_64F);

    //出力用のMat配列を用意
    Mat out = Mat::zeros(inputimg.rows, inputimg.cols, CV_64F);

    //自作二次元フィルター1
    Mat filter1 = (Mat_<double>(3,3) << -0.0625, 0.125, -0.0625,
                                        0.125, 0.75, 0.125,
                                        -0.0625, 0.125, -0.0625);

    //自作二次元フィルター2
    Mat filter2 = (Mat_<double>(3,3) << 0, 0.125, 0,
                                        0.125, 0.5, 0.125,
                                        0, 0.125, 0);

    //画像サイズ分のforループ
    for(int j = 0; j < inputimg.rows; j++){
        for(int i = 0; i < inputimg.cols; i++){
            if(j == 0 || i == 0 || j == inputimg.rows-1 || i == inputimg.cols-1){
                out.at<double>(j,i) = img.at<double>(j,i);
                continue;
                }
            //フィルターサイズ文のforループ
            for(int l = 0; l < filter1.rows; l++){
                for(int k = 0; k < filter1.cols; k++){
                    out.at<double>(j,i) += img.at<double>(j+l-1,i+k-1) * filter2.at<double>(l,k);
                }
            }
        }
    }


    //出力用Mat
    Mat outputimg;
    
    //正規化(上記参照)
    outputimg = normalize(out);
    
    //Matの型変換
    outputimg.convertTo(outputimg,CV_8U);

    //出力
    imwrite("01_Lena_filt2.bmp",outputimg);
    
    //表示
    imshow("out",outputimg);
    //waitKey(0);

    return 0;
}

ポイントは1画素ずつアクセスするところ.
.atを使ってます.
OpenCVは画素単位のアクセスが非常にめんどくさい.
頑張って書きましょう笑

あとはMatの型に注意しなきゃいけないってことくらいですかね.

以上です.

MacにVimの導入

初期化してから環境構築に手間取ってるのでメモ程度に.

Vimにも種類があるみたいなんですけど,調べるとKaoriyaさんのVimが良さそうなのでそれを使います.

下記のサイトからMacにアプリケーションを入れる流れと同じようにMac Vimを入れます.
github.com

これでGUIからVimを使えます.

でもやっぱVimCUIから使うもの.(?)
だから設定をしましょう.

設定的にはおそらく自分の使っているシェルからVimにパスを通す.
僕はoh-my-zshを使いたかったからzshです.
初期はbashなんだと思います.

.zshrcファイルに以下の文を追加します.

alias vim=/Applications/MacVim.app/Contents/MacOS/Vim
alias vi=vim

はい,これでMacVimをターミナルから起動できるようになりましたー!!

Homebrewの導入

こんにちは、先日macを初期化したよりです。
悲しみに包まれながらメモとして色々書いていこうかなって思います。
(以前一回やったことをまた調べるの面倒なので備忘録として)

そもそもHomebrewってなに?

Homebrew(ホームブルー)は、Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである。MacPortsFinkと同様の目的と機能を備えている。LinuxDebianのAPTに似た使用感で急速に利用が広がっている。(Wikipediaより)


なるほど…
正直僕みたいにOpenCV使えればいいや、みたいな人間にはよくわかりません。

そもそも、
WindowsでネットサーフィンとOfficeをちょっと使ってたくらいだし(情報系だけど)には縁がない話なんだろうなぁ…

とりあえず、あってるかわからんけどライブラリを管理する便利なものなんだな!理解。

Homebrewの導入方法

僕も記事書いておきながらググってやったんですけど一応。

まずはXcodeをインストールしてください。
AppStoreに入ってるやつ。

その後下記のコマンドを実行。

$ xcode-select --install

これれコマンドラインツールとやらが使える、とりあえず必要だと理解。

あとはHomebrewのホームページにあるコマンドを実行!
Homebrew — macOS 用パッケージマネージャー

これで入ったっぽいです。



参考にしたのはこちら。
vdeep.net

次はOpenCVを入れていきます。