flyingbirdのiPhoneアプリ開発記録

- PolyRhythmの中の人がiPhoneアプリ開発中に思ったことを記録するブログです -

【Swift4】iOS11でUIBarButtonItemのサイズがおかしくなった

サイズの指定が効かない

  • UIBarButtonItemにcustomViewを使って画像を貼り付けているところのサイズが、iOS11で表示がおかしくなった。
    どうもサイズの指定が効かなくなったようだ


今までのソース

  • UIButtonを作成して、barButtonItemのcustomViewに設定していた。
    今まではこれで動いていたのだが、iOS11からはこれだけでは駄目になったようだ
let button = UIButton(frame: CGRect(x: 0.0, y: 0.0, width: 24.0, height: 24.0))
button.setBackgroundImage(UIImage(named: "hoge.png"), for: .normal)
barButtonItem.customView = button


以下を追加すれば良いとのこと

  • へぇへぇへぇ〜知らんがな
barButtonItem.customView?.widthAnchor.constraint(equalToConstant: 24.0).isActive = true
barButtonItem.customView?.heightAnchor.constraint(equalToConstant: 24.0).isActive = true


こんな感じ?

let button = UIButton(frame: CGRect(x: 0.0, y: 0.0, width: 24.0, height: 24.0))
button.setBackgroundImage(UIImage(named: "hoge.png"), for: .normal)
barButtonItem.customView = button
barButtonItem.customView?.widthAnchor.constraint(equalToConstant: 24.0).isActive = true
barButtonItem.customView?.heightAnchor.constraint(equalToConstant: 24.0).isActive = true


参考サイト

skyebook.net

【Swift4】Stringのイニシャライズでエラー

Swift4にしたらStringの初期化でコンパイルエラーが発生

  • Swift4にしたら以下のようなエラーが出始めた。
'init' is unavailable: String.init(_:String) is no longer failable
'init' was obsoleted in Swift 4 (Swift.String)


原因は・・・

  • 原因はStringのイニシャライズ時に「!」マークがくっついていた事。
    へぇ〜。だそうです。
String("")!

↓↓↓↓↓

String("")

【swift4】substring(to:)がdeprecated!!

使いにくかったsubstringが・・・

  • swiftというと、substringが非常に使いづらかったんですが、

xcode9にバージョンアップすると以下の注意が表示されました。

'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range upto' operator.


で、なにこれ・・・

  • 文字列の最後の1文字を削りたい場合、以下のようにsubstringで文字列の最後の1文字を削ってたのですが、次のように書き換えないと、そのうちコンパイルが通らなくなるっぽいですね。swift5?
    ムムム・・・
"hoge!".substring(to: "hoge!".index("hoge!".endIndex, offsetBy: -1))

↓↓↓

String("hoge!"[..<"hoge!".index("hoge!".endIndex, offsetBy: -1)])


ちがう・・

  • 上のじゃなんだかわからない。
    indexはおいといて、substringは下の様に書き換えよ・・・とのことか。
    使いやすくなるのかと思いきや、シンタックスシュガー的なノリなのか?
let index = "hoge!".index("hoge!".endIndex, offsetBy: -1)

"hoge!".substring(to: index)
↓↓↓↓↓
"hoge!"[..<index]


  • ちなみにsubstringの場合はString型が返ってくるが、[]の場合は、String.SubSequence型が返ってくる
    String型にしたい場合は、Stringで作り直せば良い
Cannot convert value of type 'String.SubSequence' (aka 'Substring') to expected argument type 'String'
Cannot convert return expression of type 'Character' to return type 'String'
Cannot subscript a value of type 'String'
Cannot assign value of type 'String.SubSequence' (aka 'Substring') to type 'String'
↑↑↑↑↑ こんなエラーが出た場合
↓↓↓↓↓ こんな感じで作り直す
String("hoge!"[..<index])


他は?

  • substring(from:)の場合
'substring(from:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator.
let index = "!hoge".index(after: "!hoge".startIndex)

"!hoge".substring(from: index)
↓↓↓↓↓
"!hoge"[index...]


  • substring(with:)の場合
'substring(with:)' is deprecated: Please use String slicing subscript.
let hoge = "!hoge!"
let start = hoge.index(hoge.startIndex, offsetBy: 1)
let end = hoge.index(hoge.endIndex, offsetBy: -1)

hoge.substring(with: Range(start..<end))
↓↓↓↓↓
hoge[start..<end]


参考サイト

developer.apple.com

ubuntuにopenjdk9をインストール

ubuntu16.04にopenjdk9をインストールしてみた

  • 以下のコマンドでインストール
# sudo aptitude install openjdk-9-jdk


インストール時にエラー発生

  • なんだかヘッダファイルの上書きが出来ないっぽい
The following NEW packages will be installed:
  openjdk-9-jdk openjdk-9-jdk-headless{a} 
0 packages upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 0 B/345 kB of archives. After unpacking 831 kB will be used.
Do you want to continue? [Y/n/?] Y
Selecting previously unselected package openjdk-9-jdk-headless:amd64.
(Reading database ... 916479 files and directories currently installed.)
Preparing to unpack .../openjdk-9-jdk-headless_9~b114-0ubuntu1_amd64.deb ...
Unpacking openjdk-9-jdk-headless:amd64 (9~b114-0ubuntu1) ...
Selecting previously unselected package openjdk-9-jdk:amd64.
Preparing to unpack .../openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb ...
Unpacking openjdk-9-jdk:amd64 (9~b114-0ubuntu1) ...
dpkg: error processing archive /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h', which is also in package openjdk-9-jdk-headless:amd64 9~b114-0ubuntu1
Errors were encountered while processing:
 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Failed to perform requested operation on package.  Trying to recover:


強制上書きでインストール

  • 参考サイトを参考に以下のコマンドでインストール出来た。
    てか、aptitudeで強制上書きってどうやるんだろう・・・
# sudo apt -o Dpkg::Options::="--force-overwrite" install openjdk-9-jdk


デフォルトのjavaを変更

  • まずはインストールされてるjavaを確認
# update-java-alternatives -l
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
java-1.9.0-openjdk-amd64       1091       /usr/lib/jvm/java-1.9.0-openjdk-amd64


  • デフォルトのjavaを変更
# sudo update-java-alternatives --jre-headless --jre -s java-1.9.0-openjdk-amd64


参考サイト

askubuntu.com

ChinaPostの追跡

  • 最近Amazonで買い物をすると、中国から送られてくることがある。
    物も安くて配送料も無料・・・
    おいおい、スゲーな。
    でもね〜、ちょっと遅いんすよ。

    なかなか届かないので、心配になるわけですが、以下のサイトで追跡出来る。
    いろんな配送業者に対応してるとの事。
    便利じゃん

www.aftership.com

herokuコマンド

  • 時々しか触らないからすぐ忘れちゃうんですよね・・・

herokuへログインする

  • Terminalを開いてどこでも実行可
    メールアドレスとパスワードを入力
# heroku login
Enter your Heroku credentials:
Email: xxx@yyy.zzz
Password: ***


herokuからログアウトする

# heroku logout
Local credentials cleared


無料分の残時間?を表示する

# heroku ps
Free dyno hours quota remaining this month: xxxh yym (zz%)


修正したアプリをherokuへデプロイ

  • デプロイしたアプリのディレクトリで実行
    ビルドが成功すればOK
# git push heroku master
.
.
.
remote:        BUILD SUCCESSFUL
.
.


heroku上でコマンド実行

  • デプロイしたアプリのディレクトリで実行
    ダブルクォートの中に実行したいコマンドを打つ
    "ls -aFl"とか・・・
# git run "xxx"


アプリのログを見る

# heroku logs


herokuのヘルプを見る

# heroku help


【ラズパイ】Raspbian JessieからRaspbian Stretchへアップデートしてみた

現在のシステムを最新化

  • まずは今のとにかくアップデート。いつもはaptitudeだけど、今回はaptを使う
# sudo apt update
# sudo apt upgrade
  • 続いてこれ
# sudo apt dist-upgrade


Raspbianのチェック

  • 何か起きた時にどうしたらよいかわからないけど、参考サイトのようにやってみる。
    自分の環境では何も出力されなかったけど、されたらどうすんだろ・・・
# dpkg -C
# apt-mark showhold


リポジトリの向き先をJessieからStretchへ変更する

  • jessieをstretchに書き換えるだけ
# sed -i 's/jessie/stretch/g' /etc/apt/sources.list


新Raspbianで最新化

  • まずはいつものこれ
# sudo apt update
  • 次にシミュレートでアップグレードしてみる
    まあ、これで何か出たとろこでどうしたらよいかわからないんだけどね
# sudo apt --simulate upgrade
  • いよいよアップグレード・・・結構長いよ。いやほんとに
    いろいろ聞かれたりするし
# sudo apt upgrade
# sudo apt dist-upgrade


最後に

  • 再起動でしょうか
    • 再起動の前に、/etc/dhcpcd.conf の中とかは確認しておくと良い。
      設定を消しちゃってる場合があるので、ネットに繋がるように元に戻しておく。
# sudo reboot
  • これもやったほうが良いんですかね
# sudo apt autoremove


参考サイト

linuxconfig.org

結果

  • どうもロケールの設定がおかしくなっちゃいましたね・・・これが原因か? 前からなってたっけ。。。
  • やるときは自己責任で・・・

crontabをファイルから読み込む方法

やり方

  • crontabを特に引数無しでファイルを指定することで読み込めます。
    直接編集は危険なので、別ファイルで管理することをお薦めします。
crontab xxx.txt

RASPBERRY PI ZERO W でLチカ

用意した物

  • ピンヘッダを取り付けたラズパイは既にあります。 Amazonで購入。
    どれもこれもたくさん入っていて、単純なLチカだと余ります
    とは言え、Lチカセットみたいのを購入するより割安。皆で分けても良さそう
    • ブレッドボード
    • ジャンパワイア
    • LED
    • 抵抗


ラズパイ側

  • GPIOの手前側、左から3番目のピンがGND
  • 同じく手前の、左から8番目のピンがGPIO(23)


LED側

  • 以下の組み合わせで繋げていく
    1. GPIO(23) ⇔ LEDアノード(プラス極) ※足の長い方
    2. LEDカソード(マイナス極) ※足の短い方 ⇔ 抵抗(330Ω)
    3. 抵抗(330Ω) ⇔ GND


Lピカ

  • まず、お試しで、Lピカを・・・
    奥側の一番右のピンが3.3v(常時通電)のピンなので、GPIO(23)に繋げたジャンパワイアをそこに差し替えてLEDが発光するかお試し。
    うん、光りました。OKそう。



Lチカ

  • 差し替えたピンを元に戻して・・・

  • 以下のソースを記載したpyファイルを作成し、
    sudo python xxx.py で実行する
import RPi.GPIO as GPIO
import time

pin_no = 16
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin_no, GPIO.OUT)

try:
        while True:
                GPIO.output(pin_no, True)
                time.sleep(0.05)
                GPIO.output(pin_no, False)
                time.sleep(0.05)
                GPIO.output(pin_no, True)
                time.sleep(0.05)
                GPIO.output(pin_no, False)
                time.sleep(0.75)

except KeyboardInterrupt:
        pass

GPIO.cleanup()


結果

  • チカチカした〜〜!!
    はてブロは動画貼れないのか・・・


参考にしたサイト

  • ありがとうございました

deviceplus.jp
akimacho.hatenablog.com
developersnote.jp

Raspbianのsudo viでpiユーザーと同じ.vimrcを適用させる方法

次のコマンドを実行するだけ!

sudo ln -s /home/pi/.vimrc /root/
  • 当然piユーザーで.vimrcを作成しておく必要がありますが・・・