やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

【レポート】第12回清流elixir勉強会を開催しました【elixirでミニCodeReTreatやろうぜ!!】

トピック

f:id:takamizawa46:20190928165330j:plain:w500

今回で第12回目の勉強会を開催致しました。いつのまに12回も...
elixir-sr.connpass.com

以前よりずっと個人的にやりたいなーって思っていたCodeReTreatを開催しました
名古屋でも開催されているのをちらちらと見たことがありますが、中々参加できない、1日中は難しい...

あ、だったら自分で開催しちゃえばいいじゃんってのが今回の勉強会です
CodeReTreat? 何それ、おいしいの?という方はこちらから詳細をご覧ください

qiita.com

一言でいえば、テーマにペアプロで挑んでお互いに強くなろうぜっていう取り組みです
本来は結構大々的に時間決めて、1日中やろうぜっていうもんですが

  • 時間の都合
  • 場所の都合
  • お金の都合

もあり、ミニCodeReTreatという形で開催をしました(世知辛い...
時間は30分の開発と15分の共有会をワンセット。勉強会時間の都合で2回のセッションを回す形になります

清流elixir-infomation
開催場所: 丸の内(愛知)
参加人数: 6 -> 5 コミュニティ参加人数 : 15 -> 16 update!
20190928現在

第12回の勉強会の内容について

テーマについて

上記の通り今回はミニCodeReTreatをElixir(別に縛っているわけではない)でやってみた
取り組むテーマは「アルゴリズム」について

テーマの選定に深い理由はなく、それとなく無難に取り組めるテーマだからだ
アプリ開発したり、frameworkを使って何かやろうとすると環境整わなかったりで面倒だったという過去はある
出来る限りシンプルに、開発環境を問わないテーマを選ぶのがコツだと思っている

アルゴリズムといっても話が広すぎるので今回は2セッションのために以下を選定した

第1セッション セレクトソートの実装

私は第1セッションは普段はrubyを使った開発をされているosamumu21さんとペアプロしました
かくいう私もペアプロをというものをしたことがなく、osamumu21さんも同様のことでワイワイとやれたかなと

せっかくなのでということで私が普段業務で使用しているpython3を使ってセレクトソートを実装した

osamumu21さんにコードを書いて頂いて横から主にpython3のsyntaxについてワチャワチャと提案した

その時のメモがこれ
何やら色々とメモがあるね。基本syntaxに関するものが多いかな

# coding: utf-8
# Your code here!
import ramdom

lst = [ramdom(0,100) for _ in range(10)]


def select_sort(lst):
    
    
select_sort(lst)


sorted_lst = []

sorted_lst.(56)


for _ in range(10)


len(lst)

]


if 条件式:
    print("nice")
else:

そして、当日はじめてpython3に挑んだosamumu21さんと書き上げたコードがこれ

# lst = [random.randint(0,100) for _ in range(10)]
lst = [55, 13, 11, 80, 90, 10, 39, 60, 21, 34]

def select_sort(lst, is_min):
    sorted_lst = []
    for _ in range(len(lst)):
        if is_min:
            fetch_val = min(lst)
        else:    
            fetch_val = max(lst)
            
        print(fetch_val)
        sorted_lst.append(fetch_val)
        print(sorted_lst)
        lst.remove(fetch_val)
        print(lst)
    return sorted_lst
    
    
sorted_lst = select_sort(lst, False)    
print(sorted_lst)
  • 時間内の実装
  • シンプルな実装
  • 降順・昇順の切り替え
  • ランダム数値をもつ配列の作成

と初めて書いたとは思えない成果となり、自分自身、python3での考え方などアウトプットできてrubyではこうなんだよねという比較の知識も手に入り非常に勉強になった
いいね

続いて若者チーム。ありがたいことにElixirを使ってセレクトソートに挑戦してくれた
時間には間に合わなかったものの、アキュムレーターの考え方、for文ないのきちーと勉強になったようで何より
あ、コードはpaizaで実装していたため、ブラウザ更新して消えてしまった模様ww

第2セッション フィボナッチ数列の実装

フィボナッチ数列の詳しい解説はしないが、関数型言語の最初の取り組みとしてよく例題として扱われる問題だ
今回は普段はpythonをメインで書いているヤングマンNoneさんとElixirを使ってペアプロを行なった

最近Elixir欲が止まらない模様で「ぜひElixirで」ということになった。いいね
Elixirのsyntaxについても助言することもなく、以前よりフィボナッチ数列の実装を何度かやったことがあるそうでスラスラとコードを書いて頂いた
「お、そんな風にフィボナッチ数列ってかけるんけ」と非常に勉強になった

自分の頭の中にあったのはreduce使って前の値を保存しておいて、その値に次の値を足せばええやんと思っていただけにいい意味で意表を突かれた
すげー。再帰的でおしゃれや

defmodule Fibo do
    def fibo(num) do
        Enum.map(1..num,fn(n) -> sub(n) end)
        |>IO.inspect
    end
    def sub(count) when count == 1 or count == 2 do
        1
    end
    # ここがしゃれてる
    def sub(count) do
        sub(count - 1) + sub(count - 2)
    end
end
<200b>
Fibo.fibo(10)

時間が余ったので色んな情報を共有して、プログラミング以外の知識も新たに入ってきた

一方、もう1チームは常連メンバーのG_kenkunが主導となりかなり本格的にElixir使って実装を行なってくれた
再帰関数使って時間内に実装してかなり盛り上がっていました。いいね

感想

CodeReTreatくっそおもろいやんけ!!!!
準備何もしなくていいし、人数だけ揃えば気軽に開催できるし、凄い楽しかった
ペアプロしてもらったこともないので、非常に経験値もあがったので、また定期的に開催したい

写真をとっておけば、この楽しい雰囲気が伝わったのになと反省
あとはテーマの選定だけかな。難しすぎず、簡単すぎず...

おまけのコーナー

せっかくなのでセレクトソートをElixirで実装してみた
再帰関数使ったverとEnum.reduceでゴリ押したverがあるよ

defmodule Sort do
  @moduledoc """
    ## sample
    iex> Sort.execute_sort(5)
    iex> Sort.execute_reduce_sort(5)
  """
  def select_sort(lst) do
    _select_sort(lst, [])
  end
  defp _select_sort([], accum), do: accum
  defp _select_sort(lst, accum) do
    min_num = Enum.min(lst)
    removed_min_num = List.delete(lst, min_num)
    _select_sort(removed_min_num, accum ++ [min_num])
  end
  
  def reduce_select_sort(lst) do
    Enum.reduce(1..length(lst), {lst, []}, fn _, acc -> 
      {base_lst, sorted} = acc
      min_num = Enum.min(base_lst)
      next_lst = List.delete(base_lst, min_num)
      {next_lst, sorted ++ [min_num]}
    end) |> (fn {_, sorted} -> sorted end).()
  end
  
  # 動作確認のためのそれ
  def execute_sort(try_num, lst_size \\ 100, max_num \\ 100) do
    Enum.map(1..try_num, fn _ -> create_random_lst(lst_size, max_num) end)
    |> Enum.map(&(select_sort(&1)))
    |> IO.inspect()
  end
  
  def execute_reduce_sort(try_num, lst_size \\ 100, max_num \\ 100) do
    Enum.map(1..try_num, fn _ -> create_random_lst(lst_size, max_num) end)
    |> Enum.map(&(reduce_select_sort(&1)))
    |> IO.inspect()
  end
  
  defp create_random_lst(lst_size, max_num) do
    Enum.map(1..lst_size, fn _ -> :random.uniform(max_num) end)
  end
end