2017年、印象に残ったアイドルソングベスト20 (1位〜10位)

メジャーインディーズ問わず印象に残った20曲

去年2016年はこちら

2016年、印象に残ったアイドルソングベスト20 (1位〜10位) - 猪突猛進にっき

1位 『エキセントリック』欅坂46

作詞:秋元康 作曲:ナスカ

最も勢いのある欅坂46のファーストアルバムから。

サイレントマジョリティー」池田一真が監督、振付も同じTAKAHIROによるMV

来年もアイドル音楽を引っ張るのは欅坂と平手か

www.youtube.com

2位 『ミュージック 3、4分で終わっちまうよね』ゆるめるモ!

作詞:小林愛  作曲:田家大知・M87  編曲:M87

ゆるめるモ!の最高傑作アルバム 「ディスコサイケデリカ」から。 ジャケットはPrimal Screamオマージュっぽい

f:id:aminaura:20171231204407j:plain

ダークな詩でディスコティックな「モイモイ」、ミニマルテクノっぽい「我が名とは」もよかったけど圧倒的なこの曲。

Aメロが全てメンバーが実際に言われた罵倒のセリフで構成されてる

そこから、「そうかも僕らのミュージック気休めなんだ」「僕らに出来ることがあるとか思っちゃうちょこっとだけ思っちゃう」と続く。

4人になって、間違いなく今がいちばん良いゆるめるモ!に来年も期待

www.youtube.com

3位 『風船は生きている』乃木坂46(アンダー)

作詞:秋元康 作曲:泉佳伸/三好翔太

インフルエンサー」のカップリング、乃木坂のアンダー曲。 名曲を出しまくった今年の乃木坂の中でも一番好き

www.youtube.com

4位 『逃げない!!』ゆるめるモ!

作詞:小林愛  作曲・編曲:M87

ゆるめるモ!の最高傑作アルバム 「YOUTOPIA」から。

代表曲「逃げろ!!」のアンサーソング的に出された新曲、これからのゆるめるモ!のイメージソング。 PVの衣装は全てWEGOで買えるらしいから同じものを買おう

www.youtube.com

5位 「なないろ」私立恵比寿中学

作詞・作曲:池田貴史

松井りななんの誕生日7/16からとって「なないろ」

エビ中の再出発の曲、ずっと応援しよう

www.youtube.com

6位 『君だけじゃないさ...friends』 アンジュルム

作詞・作曲:星部ショウ  編曲:平田祥一郎

cuteの解散、カントリーは新体制、こぶしファクトリーは脱退など転換の年だったハロー、 その中で唯一絶好調のアンジュルムから。

2000年に一人の美少女こと、上國料かみこのメイン曲。

www.youtube.com

7位 『最上級ぱらどっくす』 わーすた

作詞:鈴木 まなか・渡邉 シェフ 作曲:安藤 啓希・須藤 隼太

圧倒的メジャー感。kawaiiの秘密は努力です。 来年こそはわーすたの年、、!

www.youtube.com

8位『ribbonsora tob sakana

作詞・作曲: 照井順政

ハイスイノナサ照井順政プロデュース、sora tob sakana

ファーストアルバムではやりすぎ気味のバックが4人の歌と合ってきて、完成度高く盛り上がる曲に。 これはライブで聞きたい。

www.youtube.com

9位『=LOVE=LOVE

最高!

www.youtube.com

10位 『前髪』 アイドルネッサンス

作詞・作曲:小出祐介

www.youtube.com

2016年、印象に残ったアイドルソングベスト20 (11位〜20位)

11位 『RUN and RUN』 lyrical school

スマホジャックMV。

vimeo.com

花火シンクロMVもよかった。

サマーファンデーション/lyrical school【Sync with fireworks MV】#SummerFoundation - YouTube

12位 『次々続々アンジュルム

作詞:児玉雨子 作曲・編曲:平田祥一郎

www.youtube.com

13位『ゼッテーアナーキー私立恵比寿中学

名盤「穴空」から。

www.youtube.com

14位 「君の知らない物語」アイドルネッサンス

次のアルバムが楽しみ。

www.youtube.com

15位 『夢幻クライマックス』℃-ute

作詞・作曲:大森靖子 編曲:大久保薫

www.youtube.com

解散発表した℃-ute大森靖子の初提供曲。

絶対無双の女子力で、最強で、セクシーで、女として誰も勝負する気にもならないような、 かっこいい℃-uteが大好きです。 なので、踊りも歌も香りもオーラも顔面も、全てのレベルアップしまくった武器をフル活用 できるような曲をつくりたいと思いました。 例えば女性として、何もかもを得ても感じてしまう渇望を楽曲で描ければ、まだみたことのない彼女達の顔がみれるのでは…!と奮闘したので、この曲が、最後まで貧欲に成長し続ける ℃-uteのガソリンになることができれば幸いです。 解散が楽曲完成後に決まったので、歌詞を描きなおしました。 隠しコマンド的に、メンバーの名前も入っているのでみつけてくださると嬉しいです。 別れの歌ですが、クライマックスに向けての加速装置です。 魂だけ側において、強く生きていこう!と、私は大好きなメンバーがハロプロを卒業しても なお、がんばるモチベーションをもらい続けています。 こんな風に、永遠に良き方向に未来を運んでくれる彼女たちの煌めきに感謝して。

大森靖子

16位 『KARATE』BABYMETAL

www.youtube.com

YUIMETALのちょこっとLOVEがおすすめ。

www.youtube.com

17位『そうじゃない』 モーニング娘。'16

作詞:つんく 作曲:つんく 編曲:平田祥一郎

つんくにしか書けないやつ。

www.youtube.com

18位 『Dream Road~心が躍り出してる~』Juice=Juice

作詞:つんく 作曲:つんく 編曲:江上浩太郎

アンジュルム次々続々』といい、EDMは終わってるけどアイドルEDMはこれから始まりそう。

www.youtube.com

19位 『雨と涙と乙女とたい焼き』乙女新党

作詞:高橋久美子(ex.チャットモンチ―) 作曲:日高央(THE STARBEMS/ex.BEAT CRUSADERS) 編曲:ヤマモトショウ(ex.ふぇのたす

解散発表した乙女新党

www.youtube.com

思えば、中3の冬から 「乙女新党」としてアイドル活動をはじめて 4年になります。 私の青春そのもである乙女新党が解散しても 「乙女新党は私のなかでも不滅です!みんな大好きです!」 今まで応援してきてくれた党員の方々とともに この幕はひきますが、 次の高橋優里花もどうぞよろしくお願いいたします!

高橋優里花

20位 Peach sugar snow 私キミに恋してる

作詞・作曲 小林清美 編曲 長谷泰宏

山梨の桃をPRしながら全曲ウイスパーボイスで歌うグループ、Peach sugar snow

www.youtube.com

2016年、印象に残ったアイドルソングベスト20 (1位〜10位)

メジャーインディーズ問わず印象に残った20曲

1位 『チョット愚直に!猪突猛進こぶしファクトリー

作詞・作曲:前山田健一 編曲:鈴木俊介

1月発売、鈴木俊介アレンジ、ヒャダインハロプロつんくリスペクト、赤羽橋ファンク。

www.youtube.com

同時リリースシングルのダンス☆マンとの対談もかなり面白い。

www.youtube.com

2位 『サイレントマジョリティー』 欅坂46

作詞 秋元康 作曲 バグベア

曲、映像、制服、ダンス、アートワーク全て揃った名曲J-POP。 2020年に向けて再開発まっただ中の渋谷駅、東急東横線改札口跡でのMV、渋谷川での『ラブ&ポップ』オマージュぽいジャケットが特に良い。

www.youtube.com

3位 『KEEP ON 上昇志向!!』Juice=Juice

作詞・作曲:前山田健一 編曲:ダンス☆マン

ヒャダイン×ダンス☆マン。 チョット愚直に!と曲構成はかなり似てるけど良いので3位。 あからさまな元ネタもブラスアレンジも良い。

www.youtube.com

Juice=Juiceは全員歌えてレコーディングが面白い。

www.youtube.com

4位 『 参枚目のタフガキ』私立恵比寿中学

作詞・作曲:前山田健一 編曲:CMJK

エビ中の間違いなく過去最高アルバム「穴空」から。 「ゼッテーアナーキ」、まんま乃木坂46の「全力ランナー」も素晴らしいんだけど、あえてアルバムの最後に収録されたこの曲です。

タイトルはUnderworldの「弐番目のタフガキ(second toughest in the infants)」から。 イントロはBorn Slippyっぽい。 変な詞に本気の曲作り、お金をかけたガチアルバムの最後にこの曲を持ってこれるのがエビ中の良さだと思う。

www.youtube.com

vimeo.com

www.sonymusic.co.jp

5位 「Savior」Especia

「堀江系ガールズグルーブ」という肩書で、衣装は大阪のおばちゃん風。洗練されたネオソウル、80年代フュージョンを20歳前後の普通の子たちがやっていたEspecia。 今年から上京して発足当時10人いたのが2人になり、新人ブラジル人が加入して、完全別グループに。 そんなEspeciaのニューアルバム『Mirage』から。 PVはSuchmos、Yogee New Wavesも手がける、yahyel、dutch_tokyo(山田健人)。 とにかくかっこいい。

www.youtube.com

6位 『泡沫サタデーナイト!モーニング娘。'16

作詞・作曲:津野米咲  編曲:鈴木俊介

ハロオタ、津野米咲(赤い公園)の初提供曲。 良くも悪くもハロプロつんくに縛られまくってる、けど良い曲。

www.youtube.com

7位 Lil Tomte / 校庭カメラガールツヴァイ

名前は略してコウテカ、オウテカっぽい名前にしようと決められた。 2014年から(当時は校庭カメラガール)から始まったが、とにかくメンバーが辞める、グループ名が変わる。 そしてとうとう今年限りで解散を発表、ラストアルバム"Night on Verse"からこの曲「Lil Tomte」。 クラブミュージックベースとラップで曲はずっとかっこよかったので終わらないで欲しかった。

www.youtube.com

8位 夢みるアドレセンス 『おしえてシュレディンガー

作詞・作曲: 志磨 遼平(ドレズコーズ)

www.youtube.com

「ふわふわ!」で、『SEXY BOY~そよ風に寄り添って~』を思い出した。

www.youtube.com

9位 僕だけのハッピーエンド 3776

説明不要の富士山ご当地アイドル3776。

知らない方はとりあえず1stアルバム (3776を聴かない理由があるとすれば)を聴こう。

ototoy.jp

そんな3776が新宿LOFTで行ったワンマンライブで、1stアルバムの曲をほぼやらずに、もともと一人なのにソロデビュー発表をして、さらに3776新メンバー募集をした時に歌った曲。

www.youtube.com

10位 『ひゃくぱーせんと』 生ハムと焼うどん

作詞 東理紗 作曲 東理紗

www.youtube.com

aminaura.hatenablog.com

Functional Swift 4章 "Map Filter Reduce" まとめ

引数に関数を取る関数を高階関数と呼びます。本章ではSwiftの標準ライブラリに実装されている高階関数を紹介します。

Map, Generic

Int型の配列を受け取り、全ての要素に1を加えて返す関数はfor文を使って簡単に書くことができます。

func incrementArray(xs: [Int]) -> [Int] {
    var result: [Int] = []
    for x in xs {
        result.append(x + 1)
    }
    return result
}

全ての要素を2倍にする関数も同様に書くことができるでしょう。

しかし、これらの関数をより汎用性のあるものにするためには、配列の各要素をとって計算し、Int型を返す関数を第二引数として受けとる必要があります。

func computeIntArray(xs: [Int], transform: Int -> Int) -> [Int] {
    var result: [Int] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

しかし、このコードはまだ最も柔軟であるとは言えません。 例えば、配列の各要素を偶数であるか判定し、真偽値の値を配列に入れて返したい場合はどうすれば良いでしょうか。

この問題を解決してくれるのがジェネリクスです。

func genericComputeArray<T>(xs: [Int], transform: Int -> T) -> [T] {
    var result: [T] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

これで任意の型で動作する関数を書くことができました。

この関数はさらに抽象化することができます。入力される配列は[Int]である必要はありません。

func map<Element, T>(xs: [Element], transform: Element -> T) -> [T] {
    var result: [T] = []
    for x in xs {
        result.append(transform(x))
    }
    return result
}

グローバルレベルでmap関数を定義するのではなく、Arrayの拡張として定義することでSwiftにうまくフィットします。

extension Array {
    func map<T>(transform: Element -> T) -> [T] {
        var result: [T] = []
        for x in self {
            result.append(transform(x))
        }
        return result
    }
}

map関数はSwiftの標準ライブラリに含まれているので自分で実装する必要はありませんが、map関数はやろうと思えば簡単に実装できることは示したのです。

Filter

あるディレクトリにこんなファイルがあるとします。

let exampleFiles = ["README.md", "HelloWorld.swift", "FlappyBird.swift"]

この中からSwiftファイルだけを取り出したい場合、シンプルな配列で書くことができます。

func getSwiftFiles(files: [String]) -> [String] {
    var result: [String] = []
    for file in files {
        if file.hasSuffix(".swift") {
            result.append(file)
        }
    }
    return result
}

これを抽象化するとFilter関数ができます。

extension Array {
    func filter(includElement: Element -> Bool) -> [Element] {
        var result: [Element] = []
        for x in self where includElement(x) {
            result.append(x)
        }
        return result
    }
}

Reduce

配列内の合計を計算する関数を作るのは簡単です。

func sum(xs: [Int]) -> Int {
    var result: Int = 0
    for x in xs {
        result += x
    }
    return result
}

抽象化してReduce関数ができます。

extension Array {
    func reduce<T>(initial: T, combine: (T, Element) -> T) -> T {
        var result = initial
        for x in self {
            result = combine(result, x)
        }
        return result
    }
}

Putting It All Together

締めとして、map, filter, reduceを使ったささやかな例を紹介します。

都市名と人口を持つ構造体があります。

struct City {
    let name: String
    let population: Int
}

都市をいくつか定義します。

let paris = City(name: "Paris", population: 2241)
let madrid = City(name: "Madrid", population: 3165)
let amsterdam = City(name: "Amsterdam", population: 827)
let berlin = City(name: "Berlin", population: 3562)

let cities = [paris, madrid, amsterdam, berlin]

ここで、100万人以上の人口を持つ都市を人口と一緒に出力したいと思います。

まず、人口の単位を返還するヘルパー関数を定義します。

extension City {
    func cityByScalingPopulation() -> City {
        return City(name: name, population: population * 1000)
    }
}

ここで本章で紹介したすべてのパーツを使って、次のようなコードが書けます。

cities.filter { $0.population > 1000 }
    .map { $0.cityByScalingPopulation() }
    .reduce("") { result, c in
        result + "\n" + "\(c.name): \(c.population)"
    }
Paris: 2241000
Madrid: 3165000
Berlin: 3562000

Swift標準ライブラリの持つmap, filter, reduceをうまくチェーンできました。

Functional Swift 3章 "Wrapping Core Image" まとめ

この章ではCore ImageをfunctionalにラッピングするAPIを構築することで、より実戦的に高階関数と関数合成を利用する方法を学びます。

Filter型

typealias Filter = CIImage -> CIImage

オリジナルの let filter = CIFilter(name: "CIVignette") などのkey値で初期化するCIFilterをカプセル化するためにFilter型を関数として定義。

フィルタの構築

Filter型を定義したので、個別のFilterを定義していく

全て func myFilter("パラメータ") -> Filter の形

Blur

func blur(radius: Double) -> Filter {
        return { image in
            let parameters = [
                kCIInputRadiusKey: radius,
                kCIInputImageKey: image
            ]
            guard let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters) else { fatalError() }
            guard let outputImage = filter.outputImage else { fatalError() }
            return outputImage
        }
    }

引数はぼかしの半径のみです。 CIImage型のimageをとり、新しいCIImageを返す関数(先ほど定義したFilter(CIImage -> CIImage))を返します。 同じパターンで様々なフィルタ関数を定義できます。

Chrome

func chrome() -> Filter {
        return { image in
            let parameters = [
                kCIInputImageKey: image
            ]
            guard let filter = CIFilter(name: "CIPhotoEffectChrome", withInputParameters: parameters) else { fatalError() }
            guard let outputImage = filter.outputImage else { fatalError() }
            return outputImage
        }
    }

*1

フィルタを合成

ここまで作成したぼかしとクロームのフィルタ関数を合成していきます。

let url = NSURL(string: "http://www.objc.io/images/covers/16.jpg")
let image = CIImage(contentsOfURL: url!)!
        
let blurredImage = blur(5.0)(image)
let chromedImage = chrome()(blurredImage)

一度ブラーをかけたimageに新たにクロームフィルタをかけて画像を生成しています。 もちろん一つにまとめることもできますが、括弧が増え途端に読めなくなってしまいます。

let result = chrome()(blur(5.0)(image))

そこで、カスタムオペレーションを定義することで読みやすさを保つことができます。

infix operator >>> { associativity left }

func >>>(filter1: Filter, filter2: Filter) -> Filter {
    return { image in filter2(filter1(image)) }
}


let filter = chrome() >>> blur(5.0)
let result = filter(image)

高階関数、関数合成を使用することによって、安全性、モジュール性、明瞭性を保ったAPIをデザインすることができます。

*1:本書では別のフィルタ関数を使っていますが、複雑になるので引数なしのChromeに変更

SwiftBondでAPIからデータバインディング

データバインディングのライブラリとしてBondを初めてつかってみました。

github.com

いろいろやってみるうちに、MVVM風にViewModelからデータをバインディングする設計が良い感じで気に入りました

サンプルコードはgithubを参照

github.com

実装

iTuens search apiを使って、アーティストと曲名をTableViewに表示します

Model

import SwiftyJSON

struct List {

    let trackName: String
    let artistName: String
    
    init(json: JSON) {
        self.trackName = json["trackName"].stringValue
        self.artistName = json["artistName"].stringValue
    }

}

View Model

モデルをObservableArrayで保持し、apiコールで更新します。

import UIKit
import Bond
import Alamofire
import SwiftyJSON

class ListViewModel {

    internal let lists = ObservableArray<List>()
    
    private let urlString = "https://itunes.apple.com/search"
    private let parameters = ["term":"Swift",
                              "entity":"musicTrack",
                              "limit":"15"]

    internal func reload() {
        Alamofire.request(.GET, urlString, parameters: parameters).validate().responseJSON { response in
            switch response.result {
            case .Success:
                if let value = response.result.value {
                    let jsons = JSON(value)
                    for i in 0...jsons["results"].count {
                        let list = List(json: jsons["results"][i])
                        self.lists.append(list)
                    }
                }
            case .Failure(let error):
                print(error)
            }
        }
    }
    
}

View Controller

ObservableArray<List>をtableViewにBindします

import UIKit
import Bond

class ListViewController: UIViewController {
    
    @IBOutlet var tableView: UITableView!

    private let listViewModel = ListViewModel()
    private var list = ObservableArray<ObservableArray<List>>()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.list = [listViewModel.lists]
        listViewModel.reload()
        
        list.bindTo(tableView) { indexPath, dataSources, tableView in
            let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
            let dataSource = dataSources[indexPath.section][indexPath.row]
            cell.textLabel?.text = dataSource.trackName
            cell.detailTextLabel?.text = dataSource.artistName

            return cell
        }

    }

}

f:id:aminaura:20160604154910p:plain

Fabricでtwitter認証

Twitterが提供しているモバイルアプリの開発プラットフォームのFabricで簡単にtwitter認証してみた。

Fabric - Twitter's Mobile Development Platform

Fabricが提供している機能

Twitter Twitter へのサインイン, Twitter API の呼び出し, View の提供, SMS 認証

Crashlytics クラッシュ統計, リアルタイム分析, テスト配信

MoPub 広告配信による収益化

SDKインポート

SDKと今回はtwitter認証だけなのでその辺をサポートしているTwitter Kitをインポート。

pod 'TwitterKit'
pod 'Fabric'

セットアップ

application didFinishLaunchingWithOptions:Twitter Kitをイニシャライズします

import Fabric
import TwitterKit

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Twitter.sharedInstance().startWithConsumerKey("your_key", consumerSecret: "your_secret")
        Fabric.with([Twitter.self()])
        
        return true
    }

この際、Twitterデベロッパー登録をして、自分のアプリの ConsumerKeyconsumerSecretを取得しておく必要があります

TwitterのAPIを使用するために必要なキーを取得する手順 - Hello API

アカウント認証

デフォルトで用意されてるボタンを使いたい時

let logInButton = TWTRLogInButton(logInCompletion: { session, error in
    if (session != nil) {
        println("signed in as \(session.userName)");
    } else {
        println("error: \(error.localizedDescription)");
    }
})
logInButton.center = self.view.center
self.view.addSubview(logInButton)

カスタムでメソッドを使いたいとき

Twitter.sharedInstance().logInWithCompletion { session, error in
                    if let session = session {
                        print(session.userName)
                    } else {
                        print(error)
                    }
 }

これで完了。