Unyablog.

のにれんのブログ

Haskell入門 13日目

十三日目

時間が開いてしまってやることを忘れたのでまずここのログを読みなおした。メモ残すこと大事だなって思いました()

WindowsHaskell しようかと思って Stack いれたけど cmd 使うこと考えると嫌になってすぐアンインストールしました*1

7.9

  • 型クラス懐かしい
    • 要するにjavaインターフェースみたいなもんでしょっていうjava変換おじさんになってる。
  • 自動でやってくれるけど今回はちゃんとやってみますねっていう感じか
    • Serializable 的な hogehoge
  • 循環的な定義もできるの良い

  • 試しに Show を付けなかったらghci で Red だけするとエラーになった。これ前もやったかもしれない。

  • サブクラスは制約っぽい

  • Maybe は直接できないので二重にやるなるほど

  • このへん Haskell 勝手にやってくれるの良いですね。

7.10

  • if の中になんでも入れれるの便利で java 使ってると羨ましくなる。
型クラス制約付きの引数を具体型によってパターンマッチングはできるのか?
hoge :: (Num a) => a -> String

といった関数がある時、Int とそれ以外で挙動を変えたい場合はどうすればいいのか?と思って調べたメモ。

データ型の直和型や列挙型をパターンマッチングするのは簡単にできるのですが...

試しに

hoge :: (Num a) => a -> String
hoge (x::Int) = "aaa"
hoge x = "hoge"

などと書くと Perhaps you intended to use ScopedTypeVariables と言われたのでそうしてみたけど関係なさそう。

しばらく考えたらこういう案件こそ型クラスを使うべきなんだなあと気付きました。

  • 最悪っぽいの

http://stackoverflow.com/questions/4131552/haskell-check-if-integer-or-check-type-of-variable

にある二番目の解答。

import Data.Typeable
isInteger :: (Typeable a) => a -> Bool
isInteger n = typeOf n == typeOf 1

最悪っぽい。

  • yesnoIf が簡単に実装できるのは便利だなあという感じ。

7.10

  • instance Functor [] where と書くことになるのは、class Functor
class Functor f where
   fmap :: (a -> b) -> f a -> f b

と宣言されていて、これによって f 自体は 具体型ではなく型コンストラクタになる ためである。

そのため、

class NonyFunctor f where
    fmap :: (a -> b) -> f a -> f b

instance Functor Int where

として具体型を入れると

The first argument of ‘Functor’ should have kind ‘* -> *’,
  but ‘Int’ has kind ‘*’
In the instance declaration for ‘Functor Int’

と怒られることになる。

  • fmapmap が同じなの、なるほどという感じ

  • 要するに、fmap は型クラスの中にある値に直接関数をどうこうしたいときに使うものみたいな感じですね

  • Either a は型コンストラクタ

    • こういうのを見ると左にエラー入れるってのもなるほど感ある
    • Either いみわからんとか言ってたけど tuple とはまた別の物ですね。片方しか入れられないし。

7.11

  • :k 便利

:k Num とすると Num :: * -> GHC.Prim.Constraint となった。

これは型クラス制約のことで、 Num a は型クラス制約となることの現れ。

:k FunctorFunctor :: (* -> *) -> GHC.Prim.Constraint となり、型コンストラクタを引数に取り型クラス制約になるということ。

感想

  • またまた久しぶりになってしまった...
  • 型クラス制約と型コンストラクタがごちゃごちゃになってたので 7.11 読んでよかった。
    • 段々難しくなってきた気もするけどしばらくブランク空いたからかもしれない

*1:今は Arch LinuxVM でやってます

Android Studioでのビルドをクラウドで行い開発を高速化する

こんにちは。学校も始まり最近は健康な時間に起きています*1

今回は 手元の Android Studio からビルドのみをクラウドで行う ことによって快適な生活を手に入れる話です。

概要

  • ビルドを移譲できる Android Sutudio のプラグインを書きました
  • これを使ってクラウドのリッチなマシンでビルドを行い高速化
  • ビルドのみが移譲されるので操作感は変わらない
  • 実装は割りと無理矢理

*1:ちなみに現在風邪を引いて寝込んでいます

続きを読む

Raspberry pi に GitWeb を入れた

昔 Raspberry Pi に GitLab を入れた記事を書きました。

nonylene.hatenablog.jp

この時、重い重い言いながら運用していました*1が、ニヶ月ほど前にSDカードが壊れる事件が起きて、再構築した時に入れるのがめんどくさくて*2入れてませんでした。そもそもSDカードが壊れたのが GitLab をアップデートして reconfigure 中に突然再起動した後だったのでちょっと怖いというのもあります((

しかし4月になり実験用のレポジトリを作る必要が出てきたため、今回は GitLab をやめて GitWeb を使うことにしました。

*1:Slack に投稿できたりして便利

*2:まあ Ansible コマンド打つだけなんですけど...

続きを読む

クラウドの Linux 上で Android Studio をリモート操作するネタ

※実用性はほぼありません。

Andorid のビルドが最近遅くて、ブラウザで動画流しながら StackOverflow 調べながら twitter 流しながら…とやっているとすぐに mac がファンファンなりだして音声は途切れるわ熱くなるわという状態になります😭

メモリ 8GB だし、数年前の mac だから仕方ないといえばそうなのですが新しい mac を買うのはまだ早い気もする。

結局いい感じの IaaS を借りてそこでビルドすると早いのではという結論にたどり着き、ここ三週間ほどいろいろ試行錯誤してる中で出てきた一つのネタです。

本題

Android Studioクラウドで動かしてリモート操作しよう

ビルドだけ Linux 側でやるのはコマンド打てばいい話なのですが、そうするとせっかくの IDE の機能を活かすことができません。どうやら ADB の remote port forward はできる*1という話を見たので、それなら向こう側で Android Studio ごと動かしちゃえばいいじゃんと考えました。

続きを読む

iOS / Android アプリ作成入門スライドを公開しました

自分の所属している京大マイコンクラブ (KMC) では毎年3月に春合宿を行っており、60分ほど講座を行います。

今年は iOSアプリ作成入門 を行いました。

speakerdeck.com

また、書いたけど没になった Android 編も公開しました。

speakerdeck.com

続きを読む

iOS で Slack に投稿するアプリを作り実機にインストール

iOS チュートリアルが一通り終わったので、Slack に投稿するアプリを作ってみることにしました。

レポジトリは以下。

元々 Android 版をシュッと作っていたので、iOS 版という位置づけでやってみます。

アプリの機能は非常に単純で、webhook の URL を入力し、ユーザー名、アイコン、文字列を指定して OK を押すと JSON を webhook サーバーに POST するというものです。

続きを読む

iOS 入門 3日目

iOSチュートリアル自体は今回で終わりです。

今回は画面遷移の実装、データの編集、データの永続化あたりです。

画面遷移

  • どうやら iOS における IntentSegue と言うらしい。
    • 段々マウスクリックして伸ばすのが面倒になってきた。
  • Segue にもいろんな種類の遷移があって、それぞれアニメーション等が微妙に違う。こういうのが apple っぽくて良いですね。
  • NavigationControllerActivity みたいなもので、 ViewControllerFragment みたいなものだというざっくりした認識を得た。
  • Push SegueModal Segue というのがある。
    • 前者はタップしたものの詳細を示すような画面で使い、後者は新しいものを登録するような画面で使うということでよい?
    • 後者の場合 NavigationController も入れ替わるが、前者ではそんなことない。
  • prepareForSegue は自分から離れるときに呼ばれる。
    • このとき相手先の ViewController が降ってくるので、そこのメンバ変数に入れたいものを突っ込む…らしい
    • Android だと Intent に一旦突っ込むので直接入れるのは意外だった
  • 遷移先からデータを受け取りたいときは、 StoryBoard から関数まで Ctrl + ドラッグ をしてイベントを発火する
    • この時も遷移先の ViewController が降ってくるのでそこからデータを受け取るとのこと。

データの編集

メソッド一つ設定するだけでいい感じの編集UIができあがる。

編集UI、横スクロールした時に View がはみ出していてつらい気持ちになった。

iPhone6S だったらならなかった。あまり横幅を広くするなということだろうか。

データの永続化

Android よりも楽にモデルごと保存できるようでよかった。この程度になると Android では SQLite 使わないといけなさそう?

こうして公式チュートリアルは終わりました。あとは自分で軽いアプリを作ってみたいと思います。

その他

  • iOS、 String でコールバック関数とかクラスとか指定するのはそういうものらしい。

一日目

nonylene.hatenablog.jp

二日目 nonylene.hatenablog.jp