読者です 読者をやめる 読者になる 読者になる

Screaming Loud

研究・プログラミングなど気づいたことをメモをしています

Scala用のコレクション操作の拡張ライブラリsansyo(山椒)を作りました

scala プログラミング

タイトルの通り、Scala用のコレクション操作の拡張ライブラリを作りました。

名前はsansyoです。

意味としては、 「山椒は小粒でもぴりりと辛い」 から来ていて、コレクションの拡張ライブラリのため、小さいですが便利になるものとして作りました。

ライブラリのサイズとしても小さいので、気軽に入れてもらえるかと思います。

github.com

作成方針

方針としては、標準のScalaだけを使ってる人が簡単に導入できるように作りました。

また、implicit conversionで作っています。 objectの名前は ~Utilsなので一般的ですが、 implicit conversionで作っているため名前衝突はしないかなーと思っています。

機能

今すでに作っているものとしては3つです。 使い方の細かいところはQuickStartを見ていただければと思います。

emptyOrElse

OptionはgetOrElseがあるのですが、Seqはそれに当たるものがないため作りました。

partitionMap

partitionMapはpartitionをした後、分けたものに対して同じ処理を行うものです。

grouping

tupleのSeqをMapにするものです。 単純にgroupByをすると、Mapのvalue部分が元の配列のtupleになってしまうのですが、 結構元の配列を使うことが少なくて、tuple._2のほうが欲しいことが多くて、このメソッドを作りました。

まとめ

もし使ったり、プルリクなど送っていただけたら幸いです。

最新技術とビジネスとしての成功

自分のツイートをまとめてみた。




混同しがちな話

さらに混同しがちなのが、

  1. 新しい技術
  2. 雑でいいからスピード勝負

とは違う。
どちらもプロダクトを早く世の中に出すという思想。

違い

【新しい技術】
デメリット:技術検証というリードタイムが発生し、リリースが遅れてしまう。
作り直すタイミング:新しい技術に乗り換える。既存技術では耐えられないサービスヒット。

【雑でいいからスピード勝負】
デメリット:拡張性を考えられていないなどサービスが当たった後、根本からスケールできないような設計になってしまっている。
作り直すタイミング:サービスがスケールしたとき


合わせて読みたい
Open database life: ムック「データベース徹底攻略」 - MySQL/Redis/MongoDB/Redshift

「考える」とはなんだろうか

日常 勉強

考えるとはなんだろうか?

時々「自分は考えずに行動してしまうなー」と思っていますが、
そのときの考えるとはなんなのでしょうか?

数学の問題

例えば、数学の問題を考えることについて
これは、ある解けない問題に対して、自分の知っているパターンを次々適用し、どのパターンがその問題に対して最適かどうかを見つけること。

この「考える」の中では、
思い出す、予測する、適用する
が含まれています。

チームの課題

例えば、チームの課題を考える
チームの課題を考えるという際は、

  1. まずチームで実施した事象を思い出す
  2. その中で失敗だったものを抽出する

ここにおける「考える」は、
思い出す、適用する
が含まれていると思います。

企画

例えば、企画を考えることについて
企画を考えることとは、その企画を体験する人たちに「よかった」と思われる段取りを決めることと同義だと思います。
では、何かを企画しよう!というときに、どういう思考過程を経ているのでしょうか?

  1. まず課題が何かを特定
  2. 今まで自分が体験した面白いことを思い起こす。
  3. 流行っているものを収集する
  4. 今までになかった組み合わせを思考実験する
  5. 段取りを決める

ざっくりこんなイメージ(自分は企画専門ではないので、フローが間違いはご了承ください。。)

この「考える」には
思い出す、探す、予測する、適用する
かと思います。

「人の気持ちを考えろ!」

例えば、人の気持を考えるについて
人の気持を考えるとは、相手がどうしたら喜んでどうしたら悲しむか、相手の感情がどうしたら動くかをパターンマッチさせることかと思います。

この「考える」には、
思い出す、適用する
かと思います。

結局どういうこと

結局考えるとは、
・自分の知っている知識から「思い出す」
・その中から、最適なパターンを「見つけ出す」
という過程をあわせたものかなと思います。
ただ、その知識というのは具体的な知識(例えば微分の解き方みたいなもの)だけでなく、人間との会話の経験や遊んだ体験なども含まれています。

しっかり考えられる人とは?

しっかり考えられる人とは、上の「思い出す」と「見つけ出す」の両方がうまくできる人かと思います。

上記の「知識」を増やすということは、勉強をしてたくさんの知識をつけることにもあると思いますが、それとは別にたくさんの体験をしているかということも知識を増やすことにつながります。
なぜなら、人の感情がどうやったらどう変わるかなどは、勉強してもわからないことです。(心理学などはありますがw)
でも人間にとって何かを経験できる回数はたかが知れているため、書物という人類の遺産で補うのです。

「見つけ出す」というのは、生まれもっているものに近いので、考える力を養う上では、たくさんのパターンを知ることが近道かと感じています。

まとめ

最初の「考えずに行動してしまう」とは、3パターンあると思っていて、
1. 過去の失敗を思い出していない
2. そもそもそのパターンを体験していない
3. 似たようなパターンは体験したが、今回のパターンにマッチさせられなかった
というものです。

人間は年をとると失敗しづらくなるといいます。
しかし、失敗をしなければ思い出す対象にもなりません。
人間として豊かな思考を持つには、大量の経験を行い、その経験をクラスタリングすることかと思います。
新しい体験とは人間にとって大きな心理的抵抗がありますが、それを乗り越えることで「考える」ための材料が増えると考えるとちょっと試してみたくなりませんか?
(辛い道を行くというのも、こう考えると理にかなっているかも)

2016年に読んだ本のまとめ

読書

昨年末に読んだ本をまとめましたが、今年もやってみたいと思います。
昨年のリンクはこちら→ 2015年に読んだ本を振り返る - Screaming Loud

今年読んだ冊数は42冊でした。
昨年が30冊なので増えたのですが、前半にすごい高いペースで読んでいたのが、多くなった理由です。

あと、今年から引っ越して電車通勤になったおかげで読む時間ができたというのも、一つの理由ですね。

また、後半は組織論的な話を考える部分が多く、読んだ本もその付近が多かったですね。
ビジョナリーカンパニーなども名著ですが、今更ながら読みました。

良かった本

elk.bookmeter.com

この本はメッセージ集なので一瞬で読めるのですが、その一語一語に重みがあるので突き刺さってくる。
ぜひ、一度手にとって見て欲しいです。

elk.bookmeter.com
自分たちが普通に行っていることが実は女性だからと思って実施してしまっていることが多数あることに気づきます。
女性の社会進出が求められている中で、男性にも女性にもぜひ一度読んで自分の考え方を見直してみては。


他にも読んだ本は色々感想も書いているので、以下リンクから見てみてください。
moc_yutoさんの読んだ本 - 読書メーター

Slackから始めるChatOps

slack chat

先日発表したChatOps事例のスライドを共有します。


www.slideshare.net

連携のハマりどころ

この発表でちゃんと伝えてないので補足です。

続きを読む

Play2.4で非推奨のGlobalSettingをなくす

scala playFramework プログラミング

Play2.4で非推奨、かつPlay2.5ではなくなっているGlobalSettingの消し方を紹介します。
なかなか大変なので、ブログにまとめておきました。

Global.scalaで書いていたコード

Play2.3で書いていたGlobal.scalaのコードを記載します。

object Global extends WithFilters(CsrfFilter, AccessLoggingFilter, SystemAccessFilter) with GlobalSettings with JsonHelper {

  override def onStart(app: Application) {
    Akka.system.scheduler.schedule(1 hour, 1 hour) {
      Image.cleanTempImage()
    }
  }

  override def onError(request: RequestHeader, ex: Throwable): Future[Result] = {
    Logger.warn(s"Internal server error. Messages : ${e.getMessage} ExceptionMessage: ${e.getMessage()}")
  }
}

/**
 * アクセスログ出力フィルター
 */
object AccessLoggingFilter extends Filter {
  import models.component.RequestComponent._

  val accessLogger = Logger("access")
  def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = {
    val resultFuture = next(request)
    val startTime = System.currentTimeMillis

    resultFuture.flatMap { result =>
      val takeTime = System.currentTimeMillis - startTime
      val msg = s"method=${request.method} uri=${request.uri} remote-address=${request.ipAddr} status=${result.header.status} user-agent=${request.userAgent} takeTime=${takeTime} ms"

      if (takeTime >= 1000) accessLogger.warn(s"*** ${msg} ***")
      else accessLogger.info(msg)

      resultFuture
    } recover {
      case NonFatal(ex) => {
        val takeTime = System.currentTimeMillis - startTime
        val msg = s"method=${request.method} uri=${request.uri} remote-address=${request.ipAddr} status=500 user-agent=${request.userAgent} takeTime=${takeTime}"
        accessLogger.error(msg)
        throw ex
      }
    }
  }
}
続きを読む

fileを開いて指定行数分取得する

scala プログラミング

fileを開いて、指定行数の分だけ取得するというロジックを作成していたのですが、
そもそもinputが指定行数以上あるかどうかを知りたかったので、そこもうまく取得できるような実装にする必要がありました。

BufferedReaderで最後の値が、nullになるので、null判定を行うことで、実装。

lisp脳なのか、headとtailでばかり考えていたのですが、
initとlastを使えばうまく実装できたので、メモとして。

ちなみに、aの値は以下のようになるのですが、

val a = Stream(1,2,??)

aの値代入が終わったあとでも以下のようにreader.readLine()を呼ぶと、aの値が変わります。

val reader = new Buffered...
val a = Iterator...
println(reader.readLine())
print(a)

なぜかは完全には把握していないのですが、Iteratorが遅延して評価しており、aの値が確定する前にreader.readLine()を読んでしまうのだろうということが仮説です。