Pragmatic ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

Jestで環境変数を設定する

JestでテストするときにwebpackのDefinePluginなどで環境変数をセットしている場合、テスト時にもセットしたいときがあります。 package.jsonのjestのところにglobalsを追加することで設定できます。 Configuring Jest · Jest EXAMPLE package.json "jest": …

ルートVueインスタンスのプロパティ

こんな感じにroot Vue instanceのpropsを使って初期値とかを与えたい場合があったりします。 html <div id='root' props='initial-value'> javascript const vm = new Vue({ el: '#root', props: ['initialValue'], data: { value: '', }, beforeMount: function() { this.value = this.initialVal</div>…

slackのbotでmentionが飛ばせなくなった対応

9/11からslackのusername指定が使えなくなりました。 A lingering farewell to the username | Slack これにより、botなどでユーザーにメンション飛ばしていた場合にusernameを使っているとmetionが飛ばなくなります。 対応方法 <@username>を<@userID>に変…

Markdown Night 2017 Summer 資料まとめ

Markdown Night 2017 Summerの発表資料のまとめです。 イベントページ connpass.com ハッシュタグ twitter.com 資料 なぜMarkdownは拡張されるのか Markdownはなぜ拡張され続けるのか | bitjourney Kibela esa Markdownの思想とデザイン esa-pages.io Markdo…

Vagrantでwebpackのwatchが動かない

Vagrant上でwebpackのwatchオプションを使ってファイルの変更を監視しても、変更を検知しないという現象に出くわしました。 こちらに(Webpack Watch in Vagrant/Docker )書いてあるように webpackのconfigファイルに以下のようにpollingするようにする必要が…

Ubuntu16.04にyarnを入れる

Ubuntu16.04にNode.jsの6系とyarnをインストール sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo bash - sudo apt-get install -y nodejs sudo curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 0.24.4

Ubuntu 16.04にDocker環境を作る

Ubuntu 16.04上でDocker動かすのにちょっと手こずったのでメモ。 とりあえずこれを実行すれば、Docker CEとdocker composeがインストールされるはず。 yes | sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-co…

Fetch APIを使ってRailsのAPIを叩く

JavaScript(es2015)でFetch APIを使ってRailsのAPIを呼ぶときの方法。 ポイントとしては、'credentials: same-origin'をつけることと、 CSRFを有効にしている場合はheaderにX-CSRF-Tokenをつける点です。 const getCsrfToken = () => { const metas = docume…

iOSのFrameworkのVersionについて

iOS

Frameworkにはversionがいくつかあってそれらの違いの雑な説明です。 その1 ひとつはお馴染みのinfo.plistに書くやつ これはちょっと省きます その2 Umbrella Headerに書いてあるやつ FOUNDATION_EXPORT double FwVersionNumber; FOUNDATION_EXPORT const un…

AutolayoutでレイアウトしたViewを外して元に戻す

InterfaceBuilderやStoryboardでAutolayoutを使って配置したViewをremoveFromSuperviewしてから、 再度addSubviewしたい!ということがたまにあります。 普通にremoveFromSuperviewしてaddSubviewすると元には戻りません。 なぜならremoveFromSuperviewした…

独自のNotification名を追加

独自のNotification名を追加する場合はこんな書き方がよいような気がします。 extension Notification.Name { struct AppName { public static let DidLogin = Notification.Name(rawValue: "com.example.appname.didLogin") } } 通知名の文字列には通知名の…

CircleCIでipaファイルを作ろうとするとExport Failedする

ローカルではarchiveからipaにexportできるのにCircleCIだとExport Failedになる場合の対処法です。 原因としてはCircleCIの環境変数が悪さをしているようで、以下のをunsetすればなおりました unset BUNDLE_BIN_PATH unset BUNDLE_GEMFILE unset BUNDLE_ORI…

Visual Studio Codeをemacs keybindingにする

Visual Studio Codeを使うときにEmacs Keybindingにする方法です。 Emacs Keymap(Emacs Keymap - Visual Studio Marketplace)というのが存在するので、これを使ってみます。 Shift + Command + Xを押して拡張機能を開きます 検索窓でemacsといれるとEmacs Ke…

SwiftでKVOするときはObjective-Cのプロパティ名を使う

当たり前といえば当たり前なんですが、 iOSのKVO(addObserver(_:forKeyPath:options:context:))はObjective-CのNSObjectのメソッドなので、指定するkeyPathはObjective-Cのプロパティ名じゃないとだめです。 例えばUIViewのisHiddenをKVOしたい場合は↓のよう…

TwitterKitを使ってログインするときの注意点

TwitterKitを使ってログインするときの注意点を2点 1. Twitterアカウントを登録しているかで挙動が変わる TwitterKitを使ってTwitterログインするときに、TwitterのアカウントをiOSに設定しているかどうかで挙動が変わります。 (2017年1月時点) iOSの設定…

2016振り返り

2016も残りわずかとなったところで急いで今年を振り返ります! 仕事 1月にLIMIAのiPhoneアプリをリリースしました。 フルSwiftで開発しました。 LIMIA (リミア) - DIYやインテリアなどの住まい・暮らしの情報アプリ -Limia, Inc.カタログ無料 2月にはAppStor…

Swiftでの複数にデリゲート multicast delegate

Swiftにはweak reference arrayがないので、NSHashTableを利用します protocol SampleDelegate : class { func sampleDelegateDidFinish() } class SampleClass { let delegates = NSHashTable<AnyObject>() // AnyObjectをSampleDelegateにするとSwift3時点ではコンパ</anyobject>…

Xcode8.2からコマンドラインでシミュレータの動画が撮れる

Xcode8.2でコマンドラインでシミュレータの動画が撮れるようになって便利に スクリーンショット xcrun simctl io booted screenshot. To take a video, run the command 動画 xcrun simctl io booted recordVideo <filename>.<file extension> 実行すると Recording... (Press CTL+C to</file></filename>…

popToRootViewControllerで画面を消すとviewWillDisappearでnavigationControllerがnilになる

現象が伝えにくいので、図に表すと以下のような感じで、 TabbarController内にNavigationControllerをもたせた状態で、いくつかViewControllerをPushViewControllerします。 そして、2つ以上PushViewControllerした状態で一番上のViewControllerのナビバーを…

Swift3.0.1で若干変わったIntなどの数値型⇔AnyObjectのcast

Xcode8(Swift3.0.0)だと↓のテストは通るんですが、 import XCTest @testable import TypeTest class TypeTests: XCTestCase { func testType_WhenIntToAnyObject() { let intValue = ["hoge": Int(1) as AnyObject] XCTAssertTrue(intValue["hoge"] is Int) …

CGRectの新旧書き方対応表

古 新 CGRectGetWidth( rect ) rect.width CGRectGetHeight( rect ) rect.height CGRectGetMinX( rect ) rect.minX CGRectGetMidX( rect ) rect.midX CGRectGetMaxX( rect ) rect.maxX CGRectGetMinY( rect ) rect.minY CGRectGetMidY( rect ) rect.midY CGR…

Xcode8にしたときのプッシュ通知対応

Project SettingsのCapabilitiesのタブを開き、PushNotificationsをONにします production.entitlements <plist version="1.0"> <dict> <key>aps-environment</key> <string>productio…</string></dict></plist>

Xcode8のxcodebuildでarchive時にsignining周りでエラーがでたときの対処法

Xcode8でxcodebuildを使ってコマンドラインでarchiveしようとすると以下のようなエラーがでて失敗するようになりました。 Check dependencies XXX has conflicting provisioning settings.XXX is automatically signed, but provisioning profile XXX_Adhoc …

Xcode8でテストが実行できない Could not determine bundle identifier for TEST_HOST

Xcode8でxcodebuildでtestを走らせると以下のようなエラーがでてテストが実行できなくなりました xcodebuild: error: Failed to build workspace XXX with scheme XXX. Reason: Could not determine bundle identifier for XXXTests's TEST_HOST: どうもTEST…

動画のフォトアルバムへの保存

動画のフォトアルバムへの保存 iOS8まで import AssetsLibrary ... ALAssetsLibrary().writeVideoAtPathToSavedPhotosAlbum(filePathURL) { _ in // 完了後の処理 } iOS9以降 import Photos ... PHPhotoLibrary.sharedPhotoLibrary().performChanges( { PHAs…

Android Studioをインストールしてプロジェクトをビルドするときに躓いたところ

Androidの既存のプロジェクトをビルドしようとしてAndroid Studioのインストールからはじめると 毎回同じようなところで躓いている気がするのでメモ エラーで Unsupported major.minor version 52.0 が出た時 原因 これはAndroidStudioが使っているJDKが古い…

既存のプロジェクトでSwift2.3のままXcode8でビルドを通す

Xcode8でビルドするとデフォルトではSwift3でコンパイルされてしまいます。 とりあえずXcode8にあげるけどSwift2.3のままにしておいて、Swift3対応は後でという場合の対処方法です。 Build Settings Build Settingsの"Use Legacy Swift Language Version"を"…

AnsibleでUbuntu16.04使った時にでたエラー

Ansibleで使うUbuntuを16.04にしてみたところいくつかエラーが発生した config.vm.box = "ubuntu/xenial64" エラーその1 vagrant upしてTASK [setup]で止まる TASK [setup] ******************************************************************* fatal: [d…

UITableViewCellのセパレーターを消す

セルのセパレーター消すやつ override func awakeFromNib() { separatorInset = UIEdgeInsets(top: 0, left: bounds.width, bottom: 0, right: 0) }

RxSwiftでTableView その3

RxTableViewSectionedReloadDataSourceでは複数Sectionに対応できましたが、 Section単位でreloadData()がされてしまっていました。 今回はRxTableViewSectionedAnimatedDataSourceを使ってみます RxTableViewSectionedAnimatedDataSource ViewControllerはR…