「kotlin & Android Studio3.0」に参加してきました!

参加してきました。

https://japan-android-group.connpass.com/event/61779/

発表テーマで個人的に気になったとこを書いていきます。

広く浅く語るkolinの魅力

Extension

kotlinでは既存のクラスを変更せずにメソッドや、プロパティを追加するExtensionという機能があります。

package com.mrstar.android_with_kotlin
// 略
import com.mrstar.extensions.findById // <- 注目

public class MainActivity() : FragmentActivity() {
    protected override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val imageView: ImageView = findById (R.id.image_view) // <- 注目
        // 略
    }
}

Qiitaで同じことをまとめていたのでそのまま転用します。

詳しくは下記をごらんください。 http://qiita.com/RyotaMurohoshi/items/4b958af1d23da6d91a61

これは個人的に知らなかったです。 Javaでは書けない機能で便利だなあと思いました。

kotlin界隈の未来

「kotlinに対する過度な期待から導入を試みる企業が増えるかもしれないが、Javaとの互換が聞かなかったりして失敗することもあるかもしれない」

とのことおっしゃっていました。

確かに現在(2017/07/24)はGoogleがkotlinを発表し、世の中kotlinブームが巻き起こっていますが結局の新しいコードの書き方に対応できず読みづらいコードになる可能性もあります。

ですが、

「ブームから、定番になっていくと思う」

ともおっしゃっていました。

これからJavaがkotlinに置き代わり、基幹システムにも採用されたりする定番の言語になる日もそう遠くないかも???

Android Studio 3.0 と kotlinについて

Android Studio 3.0 から繋いでる端末内部のデータがみれるようになる

これは正直驚きました、、、、 SharedPreferencesに保存されているデータをれるようになるのはデバックしやすいな〜と思いました。

SQLiteで保存したデータも覗くことができるのですかね〜

kotlinのit文について

newArticle.setOnClickListener { it -> print("kotlin") }
        

暗黙すぎるので分からなくなる可能性がありそうですが、慣れればいい感じですね

kotlinのコンパイルについて

kotlinのコンパイルはそれなりにはやいみたいです。 そもそもSwiftがとても遅いようです、、、 自分はiOSAndroid両方書くのでこれからkotlin導入したらコンパイルはええーーーってなるのですかね?

kotlinの良くないところ

kotlinのよくないところも紹介されていました - 暗黙が多すぎること - Javaは型を書くことが必須なので型情報があるので便利

プラットホーム型について ~Kotlinだって間違えるとnullでハマるよ!~

基本的には Javaの変数や、メソッドをkotlinから呼ぶとNullPointerExceptionになる可能性があるよ!! とのことでした。

public String javaMethod(){
    if(isValid()){
          return //なんか返す
      }else{
          return null;
     }
}
            

上記のメソッドをkotlinで読んだ時

var javaClass = JavaClass()

//普通だったら「?」をつけなければいけない箇所だが、つけなくてもコンパイルエラーにならない
var javaMethod = javaClass.javaMethod
            

FRESH! Kotlin Style Guideline

社内でkotlinを使う際のコード規約などの紹介でした。

個人的に印象に残ったのは

!!は使わない

Swift書いている時に!でアンラップしたりとかしていしまっていてこれももうやらないようにしよう、、、って思いました。

総括

kotlinについて少し理解が深まったきがします。 これからもkotlinの勉強会に積極的に参加しようと思います。

個人的によく使うツール

普段使っているツールを棚卸ししたいなと思い、個人的なメモとして残しておきます

自己紹介

マシン

バイス

  • マウス Apple純正のマウス

  • キーボード Apple純正のキーボード もしくは、 HHKB Lite 2

IMG_1068.jpg

Macのキーボードが打ちづらくて嫌になってときにHHKB使います US配列が使いたくなったときにAppleのキーボード使います

外部ディスプレイ

ヤフオクで落とした安いやつ

IDE

  • AndroidStudio

https://developer.android.com/studio/index.html?hl=ja

これは今の仕事をする上で必須です。個人的にInteliJのIDEは使いやすくて好きです。

https://developer.apple.com/jp/xcode/

プライベートではiOSアプリを開発しているのでxcodeも必須です。

  • RubyMine

https://www.jetbrains.com/ruby/

これも無料トライアル期間のときだけRailsでWebアプリケーションを開発していました。

エディタ

エラーメッセージが出た時とかにここにコピーして読んだりしています(Xcodeはログが読みづらいので、、)

スクリーンショット 2017-07-18 22.40.49.png

自分はVim派です。慣れればめっちゃ使いやすい

ソース管理

よかったらフォローお願いします https://github.com/yshogo

メモ

  • wri.pe

https://wri.pe/

増井雄一郎さんが開発したメモアプリ。個人的にこれが一番使い安くて気に入っています

https://evernote.com/intl/jp/

保存しておきたい記事や、メモなどは全てここに同期しています (最近Evernoteへの不満が溜まってきたのでメモアプリ開発)

スクリーンショット 2017-07-18 22.35.54.png

  • Pocket

https://getpocket.com/login?e=4

気になった記事はあとで読みたい系の記事はとりあえずここに置いておくようにしています

ターミナル

  • iTerm2

https://www.iterm2.com/

Macのデフォルトのものを使ってもいいんですが、こっちの方がウインドウの分割ができて便利なのでこちらを使用しています

スクリーンショット 2017-07-18 22.39.13.png

タスク管理

  • Trello

https://trello.com/

個人でアプリはこれでタスク管理しています スクリーンショット 2017-07-18 22.20.06.png

なにか便利なツールがあれば教えてください

お願いします

Railsチュートリアルを第1章から進めています

Railsチュートリアル日本語翻訳版をはじめています。 https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.0#cha-rails_flavored_ruby

はじめた理由

業務では主にAndroidアプリを開発しています。 そのアプリがDBとやりとりするためのAPIも自分で書いています。

なのでサーバーサイドの基本的な知識はあると思っています。

ですが、Javaでしかかけません。これではJavaが急になくなったときに仕事がなくなるのでRailsを始めました。(嘘)

きっかけ

youtubeでこの動画をみてはじめようと思いました。 https://www.youtube.com/watch?v=c4D2b5vZG2o

Junichi itoさんの記事がRailsを始めた時に一番最初にやったことらしいので真似して見ました。

詳しくは下記に http://blog.jnito.com/entry/2015/04/22/074055

進捗

現在第3章が終わったところです。

所感

内容はRailsだけでなくGitの使い方、herokuの使い方も 説明されていて本当に勉強になります。

Railsでサンプルコードをひたすら書くだけでなく、 テストコードも書きます。

ソースコードGithubに置いておきます。 https://github.com/yshogo

また、全部終了したら詳しく書きたいと思います。

CoreDataでNSPredicateを使ったらEXC_BAD_ACCESSが出た

ゴールデンウィークいかがおすごしでしょうか 私はだらだらしたり、コード書いたりしてました。(この二つしかしていない)

今日出たエラーを残しておきます。

CoreDataでPredicateを使ったらエラー出た

f:id:jesus9387:20170506150510p:plain

このエラーが出力されてハマりました、、、、

これってログとか出してくれないの、、、 (ここにログが出力されてるよーとかありましたら教えてください)

解決方法

f:id:jesus9387:20170506150704p:plain

NSNumberでラップすることです。

CoreDataのカラムの定義をInteeger16に設定したので比較する変数の型をIntにしていたのでそのまま比較できると思っていましたが、 どうやらNSNumberでラップする必要があるようです。

初心者殺しですね、、

Swift愛好会vol18に参加してきました!

Swift愛好会vol18に参加してきました!

https://love-swift.connpass.com/event/51614/

こういう勉強会的なものに参加するの自体が初めてで緊張しましたが、 ひとつの経験として参加してきました。

感想

発表内容としてはレベルが高すぎた、、、、 Swift初心者の自分としては内容についていけませんでした、、、

会場の雰囲気はすごく明るくわいわい楽しい雰囲気でした。(ビールも飲みながらなので)

f:id:jesus9387:20170429225219j:plain

MacBookProを使用している方が多くかなり羨ましかった、、、 (私はMacbookAir 13-inch, Early 2015 をカスタマイズなしで使用しています。)

内容

談義ということで発表者が前で発表し、聞いている側はTwitterハッシュタグ「#love_swift」をつけて呟く形式で進めていました。

発表資料

*自社コンテンツ配信 のためのWebView Tips https://speakerdeck.com/gentlesoft/zi-she-kontentupei-xin-falsetamefalsewebview-tips

*Swift4で何が変わりそうなのか(2) https://speakerdeck.com/d_date/swift4dehe-gabian-warufalseka-2

*Assertion https://speakerdeck.com/nhamada/assertion-at-swift

*Swiftと関数型プログラミングの遺産-他人のスライドで発表する- https://speakerdeck.com/bannzai/implementation-for-promise-using-nested-generics

こういうのももっと参加していきたいなー その前に自分のSwift力を上げなければ、、、、、

perhaps the designated entry point is not set?

ストーリーボードをいじっていたらこんなエラーが出たのでメモ。



エントリーポイントがないからどのViewControllerから呼べばいいかわからないよ!!

はい、題名のような理由でエラーになっています。 ストーリーボードにはどのViewControllerから呼ぶかを指定する必要があります。

なので設定しましょう。

  • アプリが起動したときに呼ばれるストーリーボード上Viewを選択する

f:id:jesus9387:20170419125046p:plain

  • 選択したら右ペインの下記を選択

f:id:jesus9387:20170419125103p:plain

  • is Initial View Controllerにチェックを入れる

f:id:jesus9387:20170419125112p:plain

これでエラーは消えるはずです。

キーボードでEnterを押すと画面をキーボードが閉じるようにする

Swiftではなにも実装しないとEnterを押してもキーボードが閉じません

そこで以下のように実装します

import UIKit

class ViewController: UIViewController , UITextFieldDelegate{

    @IBOutlet weak var textField: UITextField!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //デリゲートを設定
        textField.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    //このメソッドを書くとキーボードを閉じれるようにnarimasu
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }
}

しかしこの方法だと少し問題あり、、、、

UITextFieldを使うたびに毎回以下のメソッドを書くのはめんどくさいですね、、、

//このメソッドを書くとキーボードを閉じれるようにnarimasu
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }

同じことを繰り返させないようにすることに全力を出すのがプログラマーです。 そこで以下のように実装しましょう

自動生成されるViewControllerはお便利メソッドを置いておくクラスとする

ViewController

import UIKit

class ViewController: UIViewController , UITextFieldDelegate{
    
    var textFieldDelegate:UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
        // キーボードを閉じる
        textField.resignFirstResponder()
        return true
    }
}

これを作成し、Main.storyboardの画面ごとに新しくViewControllerクラスを作成し、先ほど作成したViewControllerに継承?させます

MainViewController

import UIKit

//先ほど作成したViewControllerクラスを継承させる
class MainViewController: ViewController{
    
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //アウトレット接続したUITextFieldにデリゲートをセットさせる
        textField.delegate = self
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

以上です。 これ同じメソッドを何回も書く必要はなくなりました。

私はこのViewControllerクラスに画面遷移するメソッドなどよく使う機能はここに書いて呼び出すようにしています。 ViewControllerが肥大化すると可読性がさがるので、、