カッティングボード

カルマをカットしてます

ハッカーウォーズに出てきました。

 そういえば最近ブログ書いてなかったなーと思い、ハッカソンに参加してきたので久しぶりに書こうと思います。

 11月27-28でスローガンさん主催のハッカーウォーズに参加してきました。

hackerwars.goodfind.jp

 今回のハッカソンでは、新しく以下の2つのことを試しつつハッカソンに挑みました。

  • 付箋を用いたチケット管理
  • githubのプルリクエスト機能を用いてレビュー

 

 付箋を用いたチケット管理では、To Do、In Progress、In Review、Doneの4状態を作り管理しました。今回のチケット管理についてどう思ったかをメンバーに聞いたところ、以下のような感じでした。

  • 誰が何をやってるのかわかるのがいい
  • 残タスクがわかるのでいい
  • どんどんタスクが右に移っていくのが気持ちいい

  githubのプルリクエスト機能を用いてレビューした感じは以下のような感じでした。

  • 各自作業してるとバグが出てるのに気付かず最後の最後で気づくことがあるのでほかの人に見てもらえるのはいい。
  • 開発スピードが少し遅くなる。

 付箋を用いたチケット管理に関しては、右に移っていくのが気持ちよかったのでこれからハッカソンに参加するときには積極的にやっていきたいと思います

 

 プルリクレビューに関しては開発スピード自体が落ちているように思えるが、最後の最後にバグに気付いて修正する時間がないとかなるよりはましなので、メンバーによっては導入していこうと思います。一人でレビューしてるととにかくつらい。。。。

 

 まぁ今回のハッカソンは賞とかはもらえなかったけど一年前と比べて成長を感じられたり、いろいろ試して成果があったし、楽しいいいハッカソンでした。

PHPで配列の結合

 phpでデータベースから取得してきたデータをidをkey、nameをvalueとする連想配列に挿入するという処理を書いていました。その後、複数の同じ形式の連想配列を結合しようと思い、array_mergeを用いて複数の連想配列を結合しました。その処理をテストしたところうまくいっていたようだったのですが、実際に運用してみると問題が生じてしまいました。idとkeyが一致していないことがあったのである。

 原因はphpのarray_mergeはkeyを自動的に1,2,3といったように振り直してくれるという機能でした。テストした時に用いたデータのidが規則的に1から並んでしまっているものを使用したのがまずかったです。テストする時には無作為なデータを用いなくてはいけませんね。

 対処法としてはarra_mergeとか複雑なものを使わずにただ”+”で足し合わせればいいだけでした。

最近作ったもの

最近、煩悩api使って何かやりたいなーと思って除夜の鐘アプリを作ったり、勉強会の時にアラーム見たいのほしいなと思ったので、指定した分数ごとになるアラームっぽいもの作ったのでリポジトリ公開します。

github.com

あとで、テキトーにドメインとってちゃんと公開したいと思います。

ファイルのダウンロード先の指定

 サーバーからデータを出力して、ユーザーのpcに保存する処理を作成しているときに少し詰まったのでまとめ。

 よくある処理としてダウンロードボタンを押すとファイル名と保存先を指定してダウンロードみたいな処理があると思います。それをサーバーから指定しようとしていたのですが、ブラウザの機能としてそれがあるみたいなのでわざわざサーバーから指定する必要ありませんでした。ブラウザの設定いじろうな。おわり

エンジニアが学ぶUI/UX講座

 今日、外部講師の方に来ていただいき「エンジニアが学ぶUI/UX講座」と題して講座をやっていただきました。

 参加人数は20人ほどで3サークル+友達が来てくれました。今まで外部講師の方に来ていただいてやった講習の中で最多人数になったのではないかと思います。宣伝頑張ったかいがありましたね。参加者の皆様、ご参加いただきありがとうございました。

 今回のUI/UX講座は最近自分がUI/UX関連で四苦八苦していることが多いので自分からお願いさせていただきました。今回参加してくれた方たちに感想を聞いた所結構好評だったみたいなので開催した側として大満足です。今月の頭にさらっと決まって、短い間で講習資料を作成していただいた講師の方に大感謝です。

 そのうちまた開催したいと思っているので、今回参加してくれた方たちはまた参加していただけると本当にありがたいです。なにかやってほしい講義とかあれば事前に言って頂ければ対応してもらえる場合もあるかも。

Javaの配列の挙動を調べてみた

 JavaにはCとかC++のようなポインタと言われるものは存在しません。メモリの開放であったりはガベージコレクタがやってくれてしまうので、基本的にJavaではメモリを気にせずにプログラムを書くことができます。しかし、オブジェクトを別の変数に代入したりするときに参照渡しをしていて、同じ実体を複数の変数から参照することがあります。その時の挙動に自信がなかったため配列でその挙動を確かめてみました。
 JavaではC、C++のように参照値を直接取得することができないため、ObjectクラスのhashCodeメソッドを用いて参照値を取得します。hashCodeを用いて参照値を取得するプログラムを以下のように書きました。

public class Main {
    public static void main(String[] args) {
        int[] num1 = {1,2,3};
        
        System.out.println(num1.hashCode());
        
        int[] num2 = num1;
        
        System.out.println(num2.hashCode());
        
        int[] num3 = test(num1);
        
        System.out.println(num3.hashCode());
    }
    
    private static int[] test(int[] num){
        System.out.println(num.hashCode());
        return num;
    }
}

実行結果

366712642
366712642
366712642
366712642

 結果として、配列を他の変数に渡したり、メソッドの引数、返り値として受け取っても参照値は変わりませんでした。このことから基本的にJavaでは配列の受け渡しには参照値を受け渡していることがわかりました。

C++のポインタとスマートポインタ

 シューティングゲームをサークルで作っていたら、自分の担当箇所が原因でメモリリークを起こしてしまったので、今まで逃げに逃げていたポインタとスマートポインタについて調べました。案外調べてみたら理解できたような気がしたので自分なりにまとめてみます。

 

 前提知識としてメモリ以外のインスタンスだったりメモリリークだったりの基本用語は分かることとします。また、メモリ領域を確保するものとしてインスタンスの生成以外にもありますが今回はそれらを無視します。

 

 いきなりですが、あなたは探偵社を経営しているとします。あなたの探偵社には100万円まで探偵を雇う資金があります。(この資金がメモリで探偵がインスタンス。)

 当たり前のことですが、あなたは資金以上に探偵を雇うと破産してしまいます。(メモリの容量以上にメモリ領域を確保しようとするとメモリリークを起こす。)

 そのため、その資金内で自分の探偵社に必要な探偵を雇わなければいけません。(メモリの容量内で必要な機能を持つクラスのインスタンスを生成しなければいけない。)

 最初のうちは、依頼者が来た時にいちいち探偵自身を呼んで依頼者の対応を行っていました。(変数にインスタンスを格納している。)

 しかし、依頼者が来るたびにその依頼者に会った探偵をいちいち呼ぶのが大変なので探偵の連絡先を依頼者に渡すことで依頼者と探偵でやり取りを行ってもらうことにしました。(変数にインスタンスを格納すると重いのでインスタンスのアドレスだけ格納している。つまりポインタを利用することにした。)

 日が経つにつれて、依頼者のニーズが変わり今まで使っていた探偵がいらなくなってしまいました。(変数のスコープが外れたり、変数に違う値が格納された。)

 あなたは資金に限度があるためいらなくなった探偵を解雇することにしました。(deleteを行うことでメモリの開放をする。)

 

 ここまでがポインタを利用し、自分でメモリ領域を確保したり開放することでメモリリークを防ぐ方法です。次からはスマートポインタを利用する方法です。

 

 あなたの探偵社は軌道に乗り多くの探偵を雇うことになりました。(コード量が多くなり大量のインスタンス持っている。)

 しかし、探偵を多く雇うにつれ依頼者のニーズに合わせた探偵の管理が仕切れなくなり始めました。(コード量が多くなりどこでスコープが外れるのか、変数に違う値が格納されるのかを把握しきれなくなった。)

 そこで依頼者のニーズに合わせた探偵の管理をしてくれる仲介業社を雇うことにしました。(スマートポインタの導入。)

 仲介業社は依頼者のニーズを調査しニーズがなくなった探偵を勝手に解雇してくれます。(変数のスコープが外れたり、変数に違う値が代入された時に、自分でdeleteを行わなくてもスマートポインタがメモリの開放を行ってくれる。)

 これで、あなたは資金を基本的に気にすることなく依頼者のニーズにあった探偵を採用しスムーズに探偵社を運営することができるようになりました。(メモリリークを気にせずにインスタンスを生成できるようになる。もちろん同スコープ内でメモリ容量以上の容量になるインスタンスの生成を行えばメモリリークは起きる。)

 

 かなりガバガバですが自分はこんな感覚でポインタとスマートポインタを理解しています。違う部分とかあればまさかりを投げていただけると助かります。これでポインタとスマートポインタを理解したとドヤ顔をすると詳しい方に殺されるので自分でもしっかり調べてください。