パンうめぇ

園児ニアの日記帳

Perl 入学式 第4回の補講に参加しました

最近Perlの勉強をしており,Perl入学式で基礎文法を学んでいます.

第4回はenpitの発表と日程がかぶってしまったので,補講という形で参加しました.

僕の大学ではPerl Mongerと呼ばれる先輩方がたくさんいて,Perl関係のコミュニティが活発だという印象があります. 今回のPerl入学式もPerl Mongerの先輩方が講師として教えてくださりました.本当にありがとうございます!!

今回はサブルーチンと正規表現の内容でした.

説明とスライドがとてもわかりやすく,基本的なロジックから教えてもらいました.subルーチンへのリファレンスの渡し方や,正規表現の簡単な使い方を手を動かしながら理解することができました.

これらの技術的なところはPerl入学式のサイトに書いているので,演習問題の中で僕がよくど忘れしてしまうリファレンスについてメモしていきます.

  • 配列のリファレンス
# いきなり宣言
my $hoge_ref = [1,2,3,4,5];
say $hoge_ref->[2]; # ${$hoge_ref}[2] でもリファレンスは参照できるが,$hoge_ref->[2]と書いた方が人間にわかりやすい.
  • hashリファレンス
# いきなり宣言
my $hash_ref = { age => 19 };
say $hash_ref->{age};

まだ慣れていないのか,コーディングの度に毎度スライドを確認してしまいます^^;

Perlのリファレンスはポインタ感があって結構すきです.Cのポインタは沼ですが...

完全に今回の講義内容と話しがずれていますが(第3回だろ),今週末にはYAPCもあるので,時間を見つけて話についていけるようぼちぼち勉強していきたいと思います.

可読性をあげる書き方~同じ処理をまとめて記述する~

昨日リーダブルコードを読んでいて「なるほどな~」って思ったことをメモ.

例えば以下のような足し算,引き算,掛け算,割り算をするPerlスクリプトがあったとします.(Perl絶賛勉強中です)

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

# 変数宣言
my $a = 10;
my $b = 3;

# 足し算
sub add{
  my ($left,$right) = @_;
  return $left + $right;
}
my $add_result = add($a,$b);
print "$a + $b = $add_result\n";

# 引き算
sub min {
  my ($left,$right) = @_;
  return $left - $right;
}
my $min_result = min($a,$b);
print "$a - $b = $min_result\n";

# 掛け算
sub mul {
  my ($left,$right) = @_;
  return $left * $right;
}
my $mul_result = mul($a,$b);
print "$a * $b = $mul_result\n";

# 割り算
sub div {
  my ($left,$right) = @_;
  return $left / $right;
}
my $div_result  = div($a,$b);
print "$a / $b = $div_result\n";

足し算処理を終わらせたあと,また引き算処理を反復する必要があります.

これだと脳内キャッシュを無駄に使ってしまうような気がします.なので同じような処理をまとめて記述すると

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

# subルーチン宣言
sub add{
  my ($left,$right) = @_;
  return $left + $right;
}

sub min {
  my ($left,$right) = @_;
  return $left - $right;
}

sub mul {
  my ($left,$right) = @_;
  return $left * $right;
}

sub div {
  my ($left,$right) = @_;
  return $left / $right;
}

# 変数宣言
my $a = 10;
my $b = 3;

# subルーチンに値を代入
my $add_result = add($a,$b);
my $min_result = min($a,$b);
my $mul_result = mul($a,$b);
my $div_result = div($a,$b);

# 答えを出力
print "$a + $b = $add_result\n";
print "$a - $b = $min_result\n";
print "$a * $b = $mul_result\n";
print "$a / $b = $div_result\n";

となり,多少見やすくなったと思います.

まとめて書いたほうが,無駄に頭を使わずにすんなり理解できる気がします.

この処理自体は簡単なので違いが顕著には出ませんが,もっと複雑かつ大規模なプログラムになってくると読みやすさが全然違ってくると思います.

enpitに参加しました!

12/22日にenpitの発表会があり,もう一週間たってしまったのですが,得られたこと,感じたことを忘れないように書き記していきたいと思います.

まずenpitとはなんぞやってことですが, 情報人材育成のプログラムで,4分野における高度IT人材の育成を目指しているものです. この4分野は以下に分かれています.

  • ビッグデータ,AI分野
  • セキュリティ分野
  • 組み込みシステム分野
  • ビジネスシステム分野

今回僕たちはビジネスシステム分野で,アジャイル開発を通してWebアプリを作成し,成果発表会で発表するという取り組みを行いました.

www.enpit.jp

開発したプロダクト

自己紹介と共通点の抽出ができる名刺に近いアプリを作成しました.

キャッチフレーズは 「人見知りのあなたも,初対面から熱く語ろう」

アプリはこちらです. ぜひ使ってください!!

Github

github.com

なぜ参加したのか

Webアプリの開発に興味があったのと,ポートフォリオを学生のうちに残しとかないとなーという思いがあったからです.あとは無料で県外にいけるので(笑)

チーム開発が好きっていうのもあります.

チーム開発のプロセス

  • 期間
    • 10月~12月
  • 手法

アジャイルスクラムという開発手法を用いました.

僕はスクラムマスターでした.メンバーに恵まれて基本的は楽でしたが,発表前は資料準備や残ってる作業のタスク管理でお腹が痛かったです(笑)

一週間のスプリント

火曜日にデモ・レビューを行い,得られた意見を振り返りながらKPT分析とタスク割当を行いました.

そんでもって土,日はモブプロ,他は個人作業で常にTrelloやLINE,slack等で進捗確認を行いながら作業しました.

アプリを開発していくと,どうしても開発者側の偏った視点に立ってしまい,使いづらいUI/UXになりがちです. なので,火曜のデモで他チームからのユーザー視点な意見がすごく助かりましたm( )m

大変だったこと

  • デザインの統一

これは一番苦労しました.

僕たちのチームには6人中デザイン班が4人もいたので 宗教戦争が勃発し,統一性のないデザインになってました.

なかなか意見がまとまらず意思決定が遅くなっていたので,週2でデザイン班は集まりを設けて意思疎通を行うようにしました.

  • レールを外れたModelの扱い

これはRuby on Railsのレールを外れたModel処理を行おうとして沼った問題です.

Railsは設定より規約なので,レールを外れると度々闇の中に放り出されましたorz

  • エレベーターピッチ

僕たちのアプリが機能上マッチングアプリと勘違いされやすく,コンセプトがうまく伝わっていないことが多々ありました.(たぶん9割伝わってなかった...)

なのでアプリ本来の使い方をしてもらえず,レビューを見ながら 「違う,そうじゃねええええ」と心の中で連呼してました.

いろいろ相談した結果,エレベーターピッチの説明がいまいちだということを指摘され,メンバー全員の語彙力を集結してなんとか簡潔にまとめました.

たとえ高機能でも意図したように使ってもらえないと意味がないので, 語彙力がほしい....

  • 学業との両立

他の課題がめちゃくちゃ多くて,結局0:00まで作業することもしばしばありました.

睡眠大事(戒め)

  • 遠隔メンバーとの作業

メンバーに一人仙台の方がいたので,遠隔でモブプロするのが大変でした.

画面共通ツールを使っていたのですが,ラグや解像度の問題でなかなかうまくいきませんでした...

enpit発表当日に教えてもらったのですが,どうやらVSCodeにリモートペアプロが行える機能があるそうですね!

はやく聞いとけばよかったなあ

工夫したこと

  • 認識のズレをなくす

一番気をつけました.デザインのこともあり,とにかく共通認識をもつためにペアプロ,モブプロを積極的に取り入れて,作業報告はコミュニケーションツールを使い事細かく行いました.

おかげで同じところを作業したりすることもあまりなかったです(あまり)

ペアプロをすると進捗が1/2に減るかもしれないと思われますが,実際は作業効率が2倍近く上がったと感じます.

あと,ミーティングに遅刻したら全員にアイスを奢るということで時間の認識のズレもなくしました.二回無料でアイスが食べれました(๑´ڡ`๑)

スプリントバックログを細かくすることで,作業の見積もりを行いやすくしました.

改善点

  • テストの記述をおろそかにした

テストほとんどかいてませんゆるして

テストに対する知識が足りないのと,毎回のデモで進捗を見せないといけないという焦りから,ModelTestをほんのちょっとしか書いてませんでした.

結果,後半になるにつれおもわぬバグが発見されることが度々あり,テストで潰しとけば安心して開発ができたと思います.

ただ,テストを勉強しながら開発するとスケジュール的に間に合わなかったと思うので,そこらへんの調整は難しいと感じました.

  • issuesの活用

他のチームを見てみると,わからないことがあればすぐgithub issuesに書き込むことでメンターさんからアドバイスを貰え,効率よく開発を行えていました.

自分たちチーム(の主にバックエンド)はわからないことがあっても,数日考えて作業してたので,少し効率が悪かったもしれません.

これからは積極的に活用していこうと思います.

  • メンターさんとのコンタクト

前述のissuesと重なりますが,メンターさんに相談することが少なく,内側で活動していたのも反省点です.

enpitを通してまなんだこと

  • ユーザー視点にたつ

ユーザーにとって何が大切か,意外と開発側では見失うこと多かったと思います.

なのでユーザーレビューを取り,どうすれば使ってもらえるのかを考えることが重要だと痛感しました.

  • 会話の重要性

意思疎通は重要だと思います.

1年生の頃はコーディング能力さえあればプログラマはなんとかなるんじゃないかと思ってましたが,一人で開発するには限界があるので,チームマネジメントみたいなスキルが必要不可欠だと学びました.

やっぱりコミュ力大事ってことです(震え)

感想

いろいろ思うところもありますが,なんだかんだ楽しかったです!!

アプリを作った背景が,「仙台の方と仲良くなりたい!」という想いだったので,コミュニケーションも取れたし,一緒にお酒も飲めたし満足です.

Best Team賞もいただけて,メンバーに恵まれたと思います.

またなにかしら開発したいです(^^)

セキュリティミニキャンプ in 沖縄

12/8,9の2日間,セキュリティミニキャンプ in Okinawaに参加してきました.

www.security-camp.or.jp

どのような講義を受け何を学んだのか記していきたいと思います┏( .-. ┏ ) ┓

受講した講義

  • Webアプリケーションセキュリティ入門
  • セキュリティツール開発入門 ~Webサーバのセキュリティを検査する~
  • 疑似スマートホームセキュリティ検証で学ぶIoTセキュリティ基礎
  • IoT機器リバースエンジニアリング入門

個人的にはWebアプリを製作途中なので「Webアプリケーションセキュリティ入門」は学ぶことが多かったと思います. IoTの講義が多いのは生活に身近になってきたので重要度が増してきたのかなと.

Webアプリケーションセキュリティ入門

一番興味があった講義です.

用意されたチケットサイトにXSSSQL Injectionといった攻撃を仕掛けてみて,どのような脆弱性が存在しどう対処すべきか学ぶ実践的な講義でした.

一見して何の変哲もないサイトなのですが,入力フォームにスクリプトSQLを埋め込むと簡単にクラックできてしまったので驚きました.

きちんとセキュリティ対策を行わないと,いとも簡単に顧客情報等の情報が漏れてしまい社会的な信用も失うことになることがわかり,セキュリティの重要性を感じました.

また,ある程度意識しなくともRails等のフレームワークではセキュリティ対策が行われていることを知り,先人の知恵が詰まったフレームワークの素晴らしさを知ることとなりました.(Webアプリ作成時XSSとかSQL Injectionとか全く意識してないけど対策されてた...)

一度フレームに頼らずWebアプリつくってみて,どういった脆弱性があるか検証してみたいです. すごく大変そうだけど(^_^;)

攻撃手法を知ることで守る術を学ぶことができる授業でした^_^

セキュリティツール開発入門 ~Webサーバのセキュリティを検査する~

WebサーバApacheのセキュリティツールをPython2を使って作成していく講義でした.

個人的には最初のお話が良くて得ることが多かったです.

自分でセキュリティツールを作る意味とか,自動化する理由など,これからのエンジニア人生で活かせそうな考え方を教わったと思います.

個人的に思っていた「なんでPython2なの?」もちゃんとした理由があってすごく納得しました.

「開発者の負担を最小限かつセキュアに.」セキュリティエンジニアならではの考え方だなと. ただPython3に移行するコストを考えると,なかなか判断が難しいところじゃないかなーと思います.

環境構築でオワタ\(^o^)/

実際にセキュリティツールを作成しようと作業に取り掛かったのですが,VMssh等の環境構築につまずきPythonモジュールをimportしたところで息絶えました(笑)

ほんとはプログラムをいじってツールを作りたかったですが,環境構築のノウハウを学べたので収穫はあったと思います(震え

VMをもらえたので時間あるときいじりたいです.

疑似スマートホームセキュリティ検証で学ぶIoTセキュリティ基礎

スマートホーム環境へのペネトレーションテストをチームで行い,脆弱性検証を行う講義でした.

簡単なパスワードが設定されている無線LANに,ツールで辞書攻撃を仕掛けると容易にパスワードクラックできてしまったので,簡単なフレーズまたは初期設定のままの状態がいかに危険か実感しました.

セキュリティツールやネットワーク関連コマンドの基本的な使い方を学びつつ,IoT機器の脆弱性について考えるきっかけとなりました.

コナンの映画みたいにポットが爆発したら怖いわなあ...

また今回CTF形式での授業だったので,チームで協力して作業を進めることができ純粋に楽しかったです.課題をクリアした時は達成感もあって,大会にも参加してみたいと思いました.

IoT機器リバースエンジニアリング入門

IoT機器を対象にリバースエンジニアリングを行い,脆弱性分析をおこなう授業でした.

私が所属している学科では,3年生までの授業でハードウェアを扱うことがあまりないので新鮮な作業でした.

時間の都合上,IoT機器からのデータの抜き出し等は行なえませんでしたが,OSのシステムファイルを抜き出すことが可能だと知り,身近なIoT機器もそうなる可能性があるのはこわいなと思いました./etc/passwdとか取られたらヤバそう...

個人的にIoTの分野はハードからソフトまで幅広く触れるところが魅力だと思います.IoTのリバースエンジニアリングができる人は両方触れるので本当にすごい...

まとめ

様々な視点からセキュリティについて勉強していきましたが,一番大事なことはダークサイドに落ちない倫理観じゃないかなと感じました.

セキュリティについての知識は攻撃にも使えるので,今回講義で学んだことを悪用してクラッキングができてしまいます.

なぜセキュリティエンジニアがそういうことに力を使わないのか.と考えると,仕事に対して誇りを持ってるからだろうなと思います. 人のためにスキルを活用できるってすごく働きがいがありそうですしね^_^

将来はWebエンジニアを目指しているので, 今回学んだことを活かして, 人の訳に立つWebサービスをセキュアに構築できる2刀流エンジニアになりたいです.

インターン行ってきました!

みんなのウエディングさんの1日インターンに参加してきました!

 

Railsのノウハウもそうですが、実際の現場での話なども聞けてすごく刺激になりました。

 

インターンいくと毎度少し挫折してメラメラ〜🔥🔥ってなるのでモチベーションが上がります(笑)

 

皆さん楽しそうに働いているんだな〜という雰囲気が伝わってきました。

 

次は県外のインターンにも参加したいです!では✋

 

JPHACKSに参加してきました!

10/27,28日に開かれたJPHAKCS@沖縄に参加してきました!

ハッカソンへの参加は初めてだったので,プロダクトを2日で作り上げることができるのか不安でしたが,結果的に動くモノを実装することができたのでよかったです!

なにつくろう?

今回のハッカソンではスポンサーさんが提示した課題を基に開発を行うのもありでしたが,私たちは完全に自分たちのための課題設定をしました.

というのも,そろそろ研究室配属という互いのGPA(内申点)を探り合いながら研究室を決めるデスゲームがあり,希望の研究室がどのくらい人気なのか,自分が全体のどのくらいの順位にいるのか知りたいと思っていたからです.

Googleフォームで集計するのは少しめんどくさいので,もう少し手軽に集計可能なWebアプリ(Rails)を作ろうという形になりました.

わちゃもちゃ開発

課題が完全に自分たちをターゲットにしてるので,謎のモチベーションがありました.

とりあえずアイデアはある程度固まっていたので,インフラと統計グラフ,デザイン担当を分けて開発しました.といっても他の担当の作業頻繁に見に行って談笑しながらゆる〜くわちゃわちゃ開発してた気がします(いつもそんな感じ).

スポンサーさんからの恩恵がすごい

スポンサーさんから飲み物,商品,ステッカー等色々もらえました.

MONSTER飲み放題なのやばいよね.Clova総額いくらなるんだろう...(これは流石にただではもらえません)

f:id:kanekou:20181029163831j:plain:w300

スラックソックスもいい感じ~

f:id:kanekou:20181029163907j:plain:w300

開発終了,デモ

なんとかログインしてグラフを表示するところまでできたので,デモ(コント)をしました.勢いで終わらせたのであまり記憶がないですが,笑いはとれたのでよかったと思います.

そのあと,スポンサーさんから開発したプロダクトについてたくさん意見をもらえました.ビジネス視点からのアドバイスをいただけたので,すごく参考になりました.本当にありがとうございます.

燃えた

今回のイベントを通して,ものづくりの楽しさだったり,ハッカソンのおもしろさを知ることができました(>ω<)

ただ,賞をとることができず少し悔しかったので,次は勝ちにいきたい🔥

企業さんと交流できるのも普段無い体験だったので,こういったイベントにはまた参加したいなーと思います.

たのしかったぞ!

f:id:kanekou:20181029162735j:plain

Rails Tutorial完走しました!

Webアプリ開発のための学習教材としてRails Tutorialを通していたのですが,本日!無事に!完走することができました㊗
長かった...学習時間は100時間ぐらい...一ヶ月ぐらいかかったかな...
これから本格的にアプリ開発が始まるので,作っていきながら実践的なスキルを身につけていきたい所存であります.
時間があればRails Guide

Everyday Rails - RSpecによるRailsテスト入門にも目を通したいと思います(特にTDD開発を初めて行うのでテストについてはもっと勉強せなあかん)
あとはどっか〜もやらんとな〜

YassLabさんありがとうございます

映像つきコンテンツで学習を進めていたのですが,説明がとてもわかり易くて学習が捗りました.
量的に挫折しそうにもなりましたが,序盤の学習の進め方がためになりました.

ステキなアプリを作れるよう頑張るゾイ٩( ‘ω’ )و