一畳のくつろぎタイム

このブログでは紹介する商品画像をAmazonアソシエイトより借りています。画像やリンクにはアフィリエイト広告が含まれる事があります

2018年12月13日木曜日

Windows10で自宅カラオケ構築

追記:
カラオケ@DAM for Windows 10はカラオケ@DAM for Windowsと名前をかえています。またAI歌声判定機能が組み込まれ、以前より高機能になっていますがスペックも上がっています。新しいスペックについてはこちらの記事を参照ください。
 
ここから以前の記事です。

カラオケ店と遜色ないレベルでカラオケができる環境を追加投資をできるだけ抑えて作りました。

最近カラオケにはまっています。
歌うことはあまり興味がなかったのですが、予想以上に気分転換になること。
ずっと趣味らしい趣味がなく、気分転換の方法も持ってなかったのでニーズに合いました。

歌は鍛錬によってうまく歌えるようになる成長があるところにはまっています。
スマホアプリにはカシレボなどカラオケができるものがあるし、歌詞もネットで検索できるし、うちのパソコンのサウンドカードにはオフボーカル機能もあったりするのでは、金をかけなくてもそれなりに楽しめるのです、でもやはりカラオケ店で歌うのとは違う。
スマホやタブレット以外でカラオケシステムを探したら、いろいろありました。

2018年11月28日水曜日

MacMiniについて調べたこと

この記事は2018/11時点で書かれたものです。
 
Appleは廉価なモデルにはあまり興味がないみたいで、
2014年から4年間新しいモデルが出ていなかったが、2018年にやっと出たが性能の割に値段は高い。

現存する使用可能なMacMiniは
2011年  メモリ増設が可能(USB2.0) 最新OSのMojaveにアップデート不可能、ぎりぎり
2012年  メモリ増設が可能
2014年  メモリ増設が不可能になる
2018年 メモリ増設が可能 価格がMiniじゃなくなる

2012年のMacMiniは中古がやたらに少ない。
2012年MacMiniにはi7のモデルがあることと、メモリ増設が可能だからかと思う。

MacMini自体中古が少なく2011年macですら3万ぐらいする(定価で6万程度)
MacMiniマスターは2012年のi7モデルに自分でメモリ増設とSSDへの交換をするという事となる。
ただしメモリが異常に高い時期のため、メモリ増設が意外と金がかかること。

あとはOSがSierraあたりからAppleはMacはSSDが標準搭載されてるつもりでOSを作っている気がする。HDDのモデルだと何かするたびに遅くストレスが酷い。
Xcodeのシミュレータ起動なんかは顕著でほんとに5-10分かかる、2011年、2014年のMacMiniでも起動時間はほとんど変わらないので根本的な問題があるように感じる。


MacMiniは本体しかないので、ディスプレイ、マウス、キーボードは別途準備する必要がある。

ディスプレイやマウスは、Windowsパソコンと何も違わないのでいくらでも選択肢があるのだが、キーボードだけは大きな問題がある。

MacのキーボードはWindowsのキーボードとは配置が違うので、ツールと組み合わせることで使えないことはないが、ストレスはある。なので可能ならばMac配列のキーボードが欲しい。

しかし、Appleが有線キーボードの販売をやめてしまい、Appleから買えるのはワイヤレスキーボードしかなくなってしまった。
1万円以上出してAppleの変哲もないキーボードを買うぐらいなら、RealForce買いたいと思う人なので、なんとか安く済まないか考えていくつか候補を

USB有線キーボードはAmazonのマーケットプレースなどで購入することは可能だが、転売屋の価格設定によって異常な値段になっている。

アップル Apple Keyboard (テンキー付き) -JIS MB110J/A

代替キーボード候補

LBR-BTK1

秋葉原で発見して、1000円なので買ってきた。
見た目はmacのワイヤレスキーボード!!


iOSデバイスやAndroidとつなぐには支障はないのだが、致命的な問題としてescキーがないのだ。escキーの位置にあるのはホームボタンのキー・・・・・

Xcodeを使う場合escがコード補完の呼び出しなので、escは欲しい。

Mac用途としてはおすすめはしないけど、一応Amazonリンク張っときます。ちょっと店頭より高いですね。

Libra LBR-BTK1(Blutoothキーボード・iPhoneにもiPadにもPS3にも対応) [エレクトロニクス]


buffalo


これが一番無難かと思われる。安いし。
ただし、やけにスペースキーが長いので、MacBookや標準キーボードの日本語ON/OFFの英数、かなキーの感覚で押すとスペースキーになる。それ以外は及第点。

Macモデル ホワイト BSKBM01WH

高いのを我慢してApple


普通にAppleのワイヤレスキーボード買う感じかな。ぼったくりの価格よりも安いしおしゃれだし、長持ちすると思う。
Apple Magic Keyboard - 日本語(JIS)

2018年9月20日木曜日

UITabBarControllerでタブがありすぎる時の挙動

AppleのUITabBarControllerの説明に以下のようにある。

The tab bar has limited space for displaying your custom items. If you add six or more custom view controllers to a tab bar controller, the tab bar controller displays only the first four items plus the standard More item on the tab bar. Tapping the More item brings up a standard interface for selecting the remaining items.

かいつまんで日本語にすると、タブバーは6個目からは配置するスペースがないので、最初の4つだけ出て、他はMoreになるよ。
 ということである。もうちょっと書いてあるが、上3行ぐらいでとりあえず知りたいことはわかった。最後の行が何を言ってるのかよくわからなかったが試したらよくわかった。

 Moreをアクションシート的なものを想像していたら全然違ったので、記事にしています。

検証としてはタブを10個用意。
わかりやすいように背景色をランダムに生成し、ボタンを配置して画面の番号を表示しています。


 Moreを押すと、入りきらなかった画面4〜画面9タブの名前が入ったテーブルビューが登場。選ぶとその画面にいけるが、自動的にナビゲーションバーのようなものが付属する。
最初の4タブについては、余計なものはついてこない。しかもEdit機能があり最初の4タブとの入れ替えが可能だという。

使う機会はないと思うが、面白い挙動だった。

検証で使用したコードはこちら
https://github.com/snowfoxj/TabBarControllerTestCode

2018年9月5日水曜日

SwiftのOptionalがうざいところ

Swiftのオプショナルがうざい

なにがうざいかと言うと、なかったら作る処理が簡潔に書けない。

コードオンリーでUITableViewを作っていると、UITableViewCellを作るときにdequeueReusableCellメソッドがnilを返した場合に新しくインスタンスを作り、nilでなければメソッドより返された値を使う。
??演算子を使用すれば、それに近いことはできる。だがしかし、新たに作成したUITableViewCellの初期設定がしたいのだ。??の後ろが1行じゃ足りなくて、もう少し行が欲しい。
        let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "hoge") ?? UITableViewCell(style: .default, reuseIdentifier: "hoge")
Objective-Cの場合、至ってシンプルである。nilだったら作って設定すればいい。
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"hoge"];
    
    // 再利用セルがない場合は
    if( cell == nil ) {
        // 作成する
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"hoge"];
        // ここで作ったcellの共通設定
    }
    
    // ここで内容の更新処理
     
    return cell;
}



Swiftの場合、guard文だと処理の中断が必須なため。guard文の中と外で2回内容の更新処理を書かなくてはならなくなる
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "hoge") else {

            let cell = UITableViewCell(style: .default, reuseIdentifier: "hoge")
            
            // 初期設定

            // 内容の更新処理
            
            return cell
        }


        // 内容の更新処理
        

       return cell
    }

オプショナルバインディングだと大した処理がないのに、代入のためだけのif-else両方が必要になる
        let cell:UITableViewCell
        
        if let unwrappedCell = tableView.dequeueReusableCell(withIdentifier: "hoge") {
            cell = unwrappedCell
        } else {
            cell = UITableViewCell(style: .default, reuseIdentifier: "hoge")
            // 初期設定
        }

        // 内容の更新処理

        return cell
外のスコープに変数を用意するぐらいだったら、オプショナルバインディングなどいらぬ。
以下のようにオプショナル構文を使わないで書いたって同じことだ。
        // セルの再利用可能か取得して見る
        let optCell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "hoge")
        
        let cell:UITableViewCell
        
        if optCell == nil {
            cell = UITableViewCell(style: .default, reuseIdentifier: "hoge")
            
            // 初期設定をする
            
        } else {
            // アンラップする
            cell = optCell!
        }
        
        // 内容の更新処理をする
        
        return cell
わずかではあるが、変数を2個用意しないで済むオプショナルバインディングを使った方が簡潔なのがなんか腹立たしい。

内容の更新処理をメソッド化すれば2回同じことは書かないで済むし、UITableViewCellのサブクラスを作れば??演算子でいけますが、だがObjective-Cと同じことができないのがなんかうざい。
??演算子の後ろにすぐ実行するUITableViewCellを戻り値とするクロージャ書いたらなんかできそうな気がするも、邪道な感じがして試したくもない。

とりあえず外のスコープの変数用意しておいて、オプショナルバインディグが正攻法かなと思う。