goで ~~ is not a typeのエラーが出た原因と対応

goで独自で定義した型を使用していた時に~~ is not a typeといったエラーが出たのでその原因と対応です。

何があったのか

type responce struct {
    Ok                  bool      `json:"ok"`
    Messages            []message `json:"messages"`
}

var responce responce

var replyResponce responce  //responce is not a type

このように独自で定義した構造体を使っていたらresponce is not a typeと言うエラーが出てきました。

原因

変数を定義する時の型が1回目はtypeを参照しているが、2回目は1回目で定義した変数を参照している。

対応

定義した構造体とは別の名前をつける。

type responce struct {
    Ok                  bool      `json:"ok"`
    Messages            []message `json:"messages"`
}

var apiResponce responce

var apiReplyResponce responce

CentOS8でLAMP環境を構築してみた。

始めに

インフラの勉強をかねてローカルでLAMP環境を構築してみました。 web開発をしてきたけどインフラに関してあまり知識がなく結局nginxとかApatchって何?ってなっていたので、手始めにLAMP環境を一から作ってみようとなりました。

今回の目標

Apatchなどのミドルウェアと呼ばれるものが何をしているかを理解する。

やること

  1. Virtual Boxの初期設定。
  2. Apatchをインストールする。
  3. PHPをインストールする。
  4. wordpressをインストールする。
  5. Mysqlをインストールする。

1.Virtual Boxの初期設定

まずVirtualBOXcentosのisoをダウンロードしてきます。 今回はcliで進めていくのでcentosの公式サイトではminimalでも大丈夫です🙆‍♂️

参考: https://qiita.com/yasushi-jp/items/01b4829a36272954719f https://hackers-high.com/linux/centos8-installation/

少しはまった点として、初期設定が済んだ後に設定の「コントローラー:IDE」に追加したcentOSのisoの割り当てを除去しておらず、永遠に初期設定を繰り返すと言う自体が起きましたので、注意しましょう。

2. Apatchをインストールする。

まずはインストールします。 ここでこれまではyumを使ってインストールしていたのですが、yumはpython2系で動いているらしくそのうち廃止されるらしいです、なのでcentos8ではdnfと言うpython3系で動いているパッケージ管理ツールが推奨されているようです。

dnf -y install httpd

optionの -y は途中で聞かれる Yes or NoにすべてYesと答えるものです。

次に自動軌道の設定を行います。

#自動起動の設定
systemctl enable httpd.service

#起動
systemctl start httpd.service

webサーバーなのでサーバー起動時に自動で立ち上がるように設定しておきます。

3. PHPをインストールする。

dnfでphpをインストールするとphp7.2までしかインストールできないのでremiをつかってインストールする必要があるみたいです。

dnf module install php:remi-7.4

#もし既にダウンロードしてしまっていたらresetする
dnf module reset php

参考: remiとは https://qiita.com/charon/items/6d34ae798e9b05e8bd0a

PHPのインストール(1) https://aulta.co.jp/archives/7697

PHPのインストール(2) https://qiita.com/shark_No95/items/9e00f952f0af43729530#php%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

4. wordpressをインストールする。

サイト内にあるファイルをDLするためのツール(curlみたいなもの)のインストール。

dnf -y install wget

wordpressを配置するディレクトリに移動します。

cd /var/www/html

wgetwordpressをインストールします。

wget https://ja.wordpress.org/latest-ja.tar.gz

インストールしたファイルをtarで展開します。

dnf -y install tar
tar axvf latest-ja.tar.gz

現在のディレクトリに権限を付与します。

chown -R apache:apache .

参考: wgetcurlの違い http://usmysa.hatenablog.com/entry/2016/05/24/223311

tarのオプション https://qiita.com/astro_super_nova/items/e7ff4ef5ec9fa253fd61

5. Mysqlをインストールする。

今回は自分がよく使うMysqlを使用しました。

mariadbが入っているかの確認します

dnf list installed | grep mariadb

mysqlの8.0をインストールします

dnf install @mysql:8.0

自動起動の設定します。

systemctl enable mysqld

正しく動くかの確認をします。

systemctl start mysqld

systemctl status mysqld

mysql用のphpライブラリもインストールします。

dnf install php-mysqlnd

mysql_secure_installationを使ってパスワードの変更も行いましょう。

mysql_secure_installation

上を実行すると色々聞かれるのでよしなに答えていきます。

参考: https://qiita.com/ucan-lab/items/c80fb8a880679fa20162

Firewallの設定

firewallに80番ポートでの通信を許可させる。 永続化させるためにpermanentオプションをつけ、対応するportを自動的に開けルためにadd-serviceオプションも追加しましょう。

firewall-cmd --permanent --add-service=http
firewall-cmd --reload

ブラウザ上で確認

これで一通りの設定が終わったのでwordpress上で確認してみましょう。 ホストのブラウザで見るために、virtualBox上で動いているサーバーのIPアドレスを探してみます。

ip a

enpp0s3 に表示されているipアドレスをブラウザ上で打ち込んでみましょう。

wordpressの初期設定画面が表示されたら成功です🎉

まとめ

今回1からLAMP環境を作ってみてなんとなくミドルウェアがどういった役目をしているのかを理解することができました。 次回はnginxを使用してキャッシュをしてみたり、今作ったものの仮想化を行ってみようと思います。

pythonでのdatetimeモジュールを使った時間の演算

Pythonでdatetimeモジュールを使った時間の計算をする時に少し時間がかかったのでそれについての備忘録です。

背景

10:00~19:00の差をdatetime.time型生成する必要があったので終了時間-開始時間みたいなことをしたかった。

結論

datetime.time型は四則演算がサポートされてないので、一度秒数に戻して計算しないといけない。

time.resolution 等しくない time オブジェクト間の最小の差で、 timedelta(microseconds=1) ですが, time オブジェクト間の四則演算はサポートされていないので注意してください。 https://docs.python.org/ja/3/library/datetime.html#time-objects

解説

まず引き算したい時間を作成します。00:00:00~12:30:30で計算をしてみます。

>>> import datetime
>>> start_hour = datetime.time(0,0,0)
>>> end_hour = datetime.time(12,30,30)

これをend_hour - start_hourとして12:30:30と出て欲しいところですが、そうするとエラーが出てしまいます。

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

なので一度秒数に戻して計算を行います。 start_hour.hourstart_hour.minuteとすると対応した数字をint型で返してくれます。

>>> print(type(start_hour.hour))
<class 'int'>
>>> caluculated_second = ((end_hour.hour * 60 + end_hour.minute) * 60 + end_hour.second - (start_hour.hour * 60 + start_hour.minute) * 60 + start_hour.second)
>>> print(caluculated_second)
45030

あとは秒数を時・分・秒に変換して、time型に戻して完成です。

>>> minute, second = divmod(caluculated_second, 60)
>>> hour, minute = divmod(minute, 60)
>>> print(datetime.time(hour=hour,minute=minute,second=second))
12:30:30

感想

単純な時間の計算を行いたい場合はtime型でやった方が早いと思います もっと良いやり方あれば教えていただきたいです🙇‍♂️

サイバーエージェント主催のインターン CA Tech Dojo 2期に参加してきました!

2/17〜2/21までの1週間サイバーエージェントさんのインターンに参加してきました!

本記事では今回参加したインターンについて簡単にまとめていこうと思います。

今回参加したインターンhttps://www.cyberagent.co.jp/careers/students/event/detail/id=24135

参加期間

もともとこのインターン自体2週間のインターンで1週間目に基礎課題・2週間目に発展課題といった内容だったのですが、コロナウイルスの影響で1週間で中止、コロナが落ち着き次第再開するといった内容になってしまいました。残念です( ; ; )

参加理由

参加しようと思った主な理由ですが、大きく二点ほどあります。 1.  エンジニアアルバイトを始め1年ほど経ちある程度コードをかけるようになってきが、綺麗なコード(パフォーマンスやテストのしやすさを意識したコード)が書けていないと感じていたため。 2. これまでほぼ独学できたので自分のコードにしっかりとしたレビューを貰いたかった。 これらを解消できる環境を探していた時に、ちょうどこのインターンを見つけてすぐに応募しました。

応募

ESを書くということが今回が初めてでかなり苦戦しました。 基本的にこれまでやってきたことを書いたのですが、書いていく上で意識したのは文章にストーリー性を持たすことで読みやすくすることです。 単純に「〜をしました。〜をしました。」といった箇条書きではなく、「〜をするために〜をはじめ、結果〜でした。」のように読みやすい文章を心がけました。

事前課題

事前課題はGoのチュートリアルA Tour of Goを一周以上してくるとのことでした。 日本語ページもあったり、記事も出ているためそこまで難しいといった感じではなかったです。 これとは別に「Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」を読んだり、実際に手を動かしてみて簡単なAPIサーバーを作成したりしました。 自分としてはGoの知識より、webの知識を勉強しておいた方が良いなと思いました。

インターン期間中

インターンはゲームのAPIサーバーを実装するといったもので、ガチャのロジックを考えたりMySQLやRedisを使ったユーザー管理、ランキング機能の実装などをしました。 参加メンバーは10人程度で、プログラミングを始めて3ヶ月の方などもいらっしゃったので、技術面というよりやる気(アウトプットがしっかりできているかなど)が見られたのかなと思います。 3人から4人のチームに分かれ、1チーム3人のメンターさんがつきました。 内容は仕様書に沿って一人で実装してPRを作成し、そのレビューをもらうといった形でした。 レビューは実際にベンチマークのスコアなどを提示していただいたりと、しっかりとしていたのでかなり勉強になりました、この辺りは再度まとめて別記事にしようと考えています!

全体を通して

参加目的の一つであった、コードを書く中でパフォーマンスを意識するようになるという目標はある程度達成できたのかなと思います。 ただ、発展課題でやる予定だったテストなどはかけなかったので、そこに関してはまた再開できたときにできればなと思います。

まとめ

コロナウイルスの影響で1週間と短い期間でしたが、かなり多くのことを勉強できたかなと思います。 また技術面のみならず、エラーハンドリングの重要性(エラーログ一つで補填額がすごく変わるらしい、、、)やバズった時の話など色々なお話が聞けてかなり面白かったです! 一旦中断ということですが、再開を願ってこれからも勉強を続けていこうと思います。

インターンのより詳細な内容はTechBowlというサービスで公開もしているそうなので興味ある方はぜひそちらも検索してみてください!

打ち上げはアジア系の料理屋さんでした、ほとんどカレーの味がしましたが美味しかったです😀↓

ポートフォリオサイトを作る。

エンジニアを初めて1年が経過し、ある程度作品も溜まってきたのでポートフォリオサイトを作ってみることにしました! このブログは作成しながら書き進めていき、その時々の考えなどを書いていこうと思います。

今回公開したページ: soshinaito.github.io

デザインを考える。

Figmaを使いモックアップを作っていきます。

意識したい点
  • なるべくシンプルに!
  • 画面遷移をしない!
項目
  1. top 名前とSNSのリンク

  2. about 簡単な自己紹介と、エンジニアとしての経歴

  3. Interest 自分が興味のある事柄

  4. works これまでの作品

  5. contact SNSリンクと、メールアドレス

細かい調整は実装時にするとして、とりあえずおおよそのデザインは完成しました。 https://www.figma.com/file/lKBpPEShCzxXdApu8uVBKm/portfolio?node-id=0%3A1

実装していく。

今回はVueを使って実装していこうと思います。 他で作っているアプリがReactを使っているので、違う技術をも触ってみようということでVueを採用しました。

使ったことのないFontAwsomeやwebfont等も使っていきます。

まずtopページです。 f:id:na7110:20200112005359p:plain

ここでは自分の名前とツイッター、qiita、GitHubはてなブログのリンクを貼ります。 FontAwsomeでそれぞれのアイコンを表示していきます。 qiitaとはてなブログはなかったので、それらしい物を組み合わせて作成しました。

参考:qiita.com


次にaboutページです。 f:id:na7110:20200113143136p:plain

デザインのように、ほとんどのページが同じレイアウトなのでコンポーネント化し再利用できるようにしていきます。


次にworksページです。 f:id:na7110:20200113143227p:plain 画像をクリックするとモーダルが表示されるように実装します。 再利用するために、コンポーネント化していきます。 モーダルが開いているかどうかのフラグは親コンポーネントで管理し、閉じる際にはemitを使いこコンポーネントから変更しています。 Vuexを使うことも検討しましたが、今後のことを考えてもそこまでする必要はない、バケツリレーをしたとしても、2回程度ということで今回はやめておきました。


skillもabout ページとほぼ同じで、contactページはフッターとしてsnsなどのフォームが付いてくるように変更しました。 f:id:na7110:20200113143422p:plain スクロールするとついて来ます!

デプロイ

GitHub Pagesを使いました。コンソール上でデプロイできて便利!

まとめ

今回は、コンポーネント化することを意識して実装してきたのですが、どんどん無駄がなくなっていくなーという気持ちになりました! まだまだ付け足していきたい機能もあるので、今後もどんどん追加していきたいと思います!

三月に参加したいろいろ

セキュリティミニキャンプ福岡

自分がセキュリティに初めて興味を持ち出した頃に参加したセキュリティミニキャンプinやまなし。

それまで本を読むことで勉強していた自分にとってハンズオン形式の講義は革命的で、ぜひまた参加したいなと思っていました。ようやく今回、時間とお金に余裕ができたので参加しました。

 

「Webアプリケーション攻防戦演習」

はじめてのA&D、PHPということで最初は全然歯が立たず、同じチームの方々も初めてということで一回目はボロボロでした。

2回目からは、チューターの方が加わってくださり、一回目よりは点数を稼ぐことができました。

最初はこういったものはあくまでゲームで、本当に役に立つのか?と思っていました。

ですが実際に体験してみると、書籍等でなんとなく理解していた程度の「webアプリケーションがどのように構成されていて、どういった攻撃手法があるのか、それに対する対策は?」などといったことが勉強になりました。

 

「LANケーブルを自作して通信をモニタリングしてみよう」

PC二台の間での通信を物理層で盗聴するというものでした。

友人に紹介したら興味を持ってくれたので、後日みんなでやってみて記事にしようと思うので感想もその時に書こうと思います。

 

クラウドホスティングサービスのセキュリティと運用技術の研究」

これは文字通りクラウドホスティングサービスのお話で、かなり高度な内容でした。

クラウドホスティングのサービスが普及した歴史やどういった技術的で成り立っているかなどのお話で、わからない単語が出てくると調べながら聞くといった感じでした。

途中アウトプットすることの重要性をおっしゃていました。研究するだけじゃなくそれを論文にするというようなお話でした。

アウトプットすることにより他人からの意見をもらうことができるし、何よりアウトプットには自分の中で整理する必要があるので、より理解が深まります。

確かにこれまで自分はものを作ったり調べたりしても自分の中で完結していたなと思うので、今後はブログなどにもアウトプットしていこうかなと思います。

 

「Private CaaS 基盤の構築と開発」

DockerやKubernetes、Goをつかってハンズオン形式アプリケーションを開発していくといった内容でした。

DockerもKubernetesもGoも触ったことがなかったので事前課題でしっかりと予習し、講義に臨みました。

講義ではわからないところはチューターさんに教えていただいたりしながら、なんとか用意されていた手順の最後までこなすことができました。

 

 

SecHack365 成果発表会

去年の夏頃、自分の通っている専門学校で以前いらっしゃった先生に紹介されて知ったSecHack365。

セキュリティーキャンプと違いミニキャンプのようなイベントがないため、公式の開催レポートなどをチェックしていたら今回の成果発表会は見学できるということですぐに参加申し込みをしました。

セキュリティといってもwebサービスを作っている方もいれば本を執筆している方などもいて、幅広い分野でやっているんだなという印象でした。

特に感じたことは、発表している方一人一人自分が解決したい社会の中の課題を明確にもっているということです。

セキュリティミニキャンプ福岡で講師をされていた方がSecHack365にも参加していて、セキュリティキャンプとの違いを教えていただいたのですが、その時にSecHack365はあくまでハッカソンであるということを教えていただきました。

つまりはスキルを磨くために参加するのではなく、何かやりたいことがありそれを手伝ってもらうために参加するのがSecHack365であるということです。

今年度、自分は第1回に参加できなかったため、応募を見送りました、次回までに明確に自分のやりたいことを定めておこうと思います。 

 

セキュリティキャンプ ワークショップ

「攻防型CTFによるWebオンラインゲームのチート行為体験」という題のWSで、全国大会の講義が受けれるということですぐに応募を決意しました。

タワーディフェンス系のゲームを1グループ5人になり、お互いのタワーを攻撃し合いながら点数を稼ぐ、またはNode.jsで実装されているサーバーの脆弱性を修正して点数を稼ぐというものでした。

簡単な説明のあと、早速サーバに接続しCTFが始まりましたが、最初は何をしたらいいのかわからずとりあえず周りの様子を伺いながらサーバーのコードを読んでいました。

同じグループの方が攻撃の自動化を実装し、どんどん点が取られてしまい1回目は終了してしまいました。

その後簡単な解説があり、2回目

先ほどの反省を生かし、とりあえずバグがありそうなところを探して、そこから該当箇所のコードを読むことにしました。

バグがありそうなところに目星はつけれたのですが、どのように修正するか悩んでいるうちに2回目も終了。

2回目も、結果としては特に何もできずに終わってしまいました、ですが1回目よりは進歩していたので、次の3回目こそポイントを取るぞと思っていたところ、時間の都合で終わってしまいました。

最後に恒例の記念撮影をして終了でした。

参加者の大半は全国大会修了生で、僕を合わせて地方大会は30人中4人ほど。

自分のグループも自分以外全国大会修了生で最初こそは弱気になっていましたが講義が進んでいくにつれ、集中して気にならなくなっていました。

今回学んだことは、オンラインゲームの簡単な仕組みと予備知識の重要性です。

予備知識があればどこらへんに脆弱性がありそうか、またどう行った修正を行えばいいかなどある程度パターン化でき素早く処理できるからです。

それこそオンラインゲームなどの他のユーザーに影響が出るチート行為などは素早い処理が要求されると思うからです。

今回のWSでは周りの方々のレベルの高さや、講義の面白さ、何より事前課題から講義に至るまでで自分がかなり成長できたと感じました。

 

以上が3月に参加したイベント等です。

3月は学校が3週間ほどお休みだったため、興味があるものに片っ端から参加してみました。

セキュリティキャンプフォーラムにも参加しようと思っていたのですが、当日風邪を引いてしまい断念。。。来年度ぜひ参加したいと思っています。

今年は最初で最後のセキュリティキャンプ全国大会、魅力的な講義も盛りだくさんので是非参加できたらなと思います。

埼玉県警察サイバー犯罪対策課 インターンシップ!

1月26日に開催された、埼玉県警サイバー犯罪対策課のインターンシップにいってきました!

 学校でインターンシップの募集があり、警察の業務なんて滅多にみれるものではないだろうと思い早速応募しました。当日の流れを簡単に説明していこうと思います。

 

サイバー犯罪対策業務の概要説明

流行りのインターネットを使ったサイバー犯罪や警察組織の説明がありました。

警察では大きく分けて捜査と対策の業務があるそうで、商業施設や小・中学校に出向きインターネットの使い方セミナーなどを行なっているそうです。

 

コンピューターウイルスの感染実演

被害者と加害者に別れ、ウイルスに感染させてみるというものでした。

友人を装った犯人から送られてきたメールに、添付ファイルがついており、開くとウイルスに感染するといった内容でした。

ファイル名が「image.jpg」という名前で、一見画像ファイルに見えるが、拡張子を表示すると「image.jpg.exe」という実行ファイルでした、というものです。

自分も友人から送られてきたファイルだと油断して開いてしまいそうだなと思い、過去に流行ったウイルスなどの手口を知っておくのも十分な対策になるんだなと思いました。

 

サイバー犯罪捜査体験

おそらくこれがこのインターンシップの肝でインターネットバンキング不正送金事件を想定した捜査を体験しました。

すでに捕まった犯人グループの一人の通信機器から情報を分析し、そのデータをもとに、取り調べ、よう撃捜査(張り込み)を体験するというものでした。

犯人の証言をどこまで信じていいのか、職務質問はあくまで任意なため犯人だと確信していても強く出れないなどなかなかに制約が多い中でやっていかないとダメということで、警察官がいかに大変な職業なのかということを体験できました。

 

インターンシップが終わった最後に、埼玉新聞に取材を受けました!

インターンシップを通して得たものは?身近に感じる犯罪は?といった質問に答えさせていただきました。普段できない体験ですごく面白かったです。

 

全体の感想

正直なところ今回のインターンシップはサイバー犯罪対策課ということで、ウイルスの解析、不正アクセスがどのように行われているかなど専門的なものを期待していましたがそういったところはあまり触れなかったため、残念でした。

ただ、警察が普段どのように捜査を行い、逮捕するのかといったプロセスを知れたことはすごく勉強になりました。

やはり1日インターンでは会社見学程度だったので、今度は中・長期のインターンに参加してみたいなと思います。

一般企業やNISCといったスペシャリスト集団などの業務内容にも興味が湧いたので、これからまた調べてみようかなと思います!

 

前年度の様子が公開されているようなのでよければ参考にどうぞhttps://www.police.pref.saitama.lg.jp/b0011/saiyo/fair/internship20170219cyber-after.html