プログラミング指南メモ

f:id:yoneapp:20170502164157j:plain

久しぶりにプログラミング学習をお手伝いする事になったので、その過程などをメモしていきたいと思います。なお、リモートでお手伝いしています。

まずは、Ruby on Rails 5 超入門をオススメしました。

しかし、環境構築でハマってしまいそうだったので、環境構築をサポートすることにしました。環境構築は初学者には難しいため、学習断念ポイントの山場でもあります。

続きを読む

Railsで日本語系バリデーション

全角文字制限

全角文字変換サポート

ひらがな toカタカナ

電話ハイフン除去バリデーション

数字のみにフィルタしてから桁数バリデーションでいいかな

JIS水準バリデーション

文字コード系メソッド

実際に文字コード変換してみて、欠けた文字が非対応文字って感じが楽ですかね。

vue.jsでimgの:srcを変更した際にローディングを表示したい

GitHub - hilongjw/vue-lazyload は初回ロードは出せてるように思う

javascript - Vuejs get image from remote source - Stack Overflow
のようにBackgroundだとうまくいくか?ただ、本当にやりたいことではない。

先行きが見えなかったので質問させて頂いた
vue.jsでimgの:srcを変更した際にローディングを表示したい(30974)|teratail

vue.jsの層ではなくて純粋にimgのload eventを参考にバインドをうまいことすればいいのかもしれない?
pxt | 画像のロード完了イベントを取得してみる

GitHub - hilongjw/vue-lazyloadを実際に動かして実験してみる。

Railsからvue-lazyloadを読み込むにはES6のimportが使えないと難しそうだ。
http://d.hatena.ne.jp/kitokitoki/20140906/p2
https://github.com/maccman/sprockets-commonjs
WebPackを使ってRailsからJavaScriptを楽に良い感じに分離する - Qiita
Bring CommonJS to your asset pipeline - Arkency Blog

JS周りが結構変わっててnpmとか使う感じが強くなってる感じがする。
RailsでCoffeeScriptを共存させつつES6やJSXを使う方法 - Aqutras Members' Blog

時間的制約から、:srcの値をnullにしてその裏にz-indexでローディング画像を固定、その上で画像をローディングするように変更。これは上手く行かなかった。理由はnull突っ込んだ後にsrcに値を突っ込んでも、バインディングの性質上?後の値しかDOMに反映されなかった。

画像を複数枚並べておき、DIVからはみ出るようにしておいてoverflow: hiddenで何とかうまくいかないかな。結論めっちゃうまくいった。

CircleCI + Fastlane "ベータ版エンタイトルメントがありません"

ベータ版エンタイトルメントがありませんとiTunesConnectで表示されている場合、Testflightで使用することが出来ません。

Provisioning Profileをリセットすればいいという情報もありますが、おそらく要因が複数あるようで、本件では上手く行きませんでした。

この問題が起きる場合は、ビルドログに次のような警告が表示されている場合が多いです。

WARNING ITMS-90191: "Missing beta entitlement. Your app does not include the beta-reports-active entitlement. If you intend to distribute this build via TestFlight for beta testing, please re-build this app with a newly generated provisioning profile."

私のケースは、ローカル環境だと上手くいくが、CircleCIだと失敗していました。

結論としては、何故かCircleCIでビルドするとuse_legacy_build_apiがtrueになっていました。ローカルではuse_legacy_build_apiはfalseでした。Fastfileでは特に設定していませんでした。*1

ENV['GYM_USE_LEGACY_BUILD_API'] = "false"のように明示的に指定することでCircleCIで本問題が起きることはなくなりました。*2

*1:use_legacy_build_apiをfalseにすると成功する説や、trueにすると成功する説もあります

*2:CircleCIは何らかの理由でtrueで初期設定にしているのかもしれません

iOSでアプリのアップデートを依頼考察+スクリーンショット付き

[iOS]アプリに強制アップデート機能を導入すべき理由と、簡単に実装する方法 - Qiita はOSSのコードが少し古いけど、良い手の一つかも。

強制的にアプリをアップデートさせたい - 未処分利益 のまとめを読んだ。

参考になりそうなスクリーンショット 

続きを読む

Swiftで線とか円グラフを書く

この辺読むと出来そうメモ

Libraryとか

iOSアプリの共通機能をライブラリを使って逃がす

はじめに

同じ機能があるアプリを2〜3も作ってると結構メンテナンスが辛い。共通機能を小まめにライブラリ化して、ライブラリを更新するだけで両方が更新される状況を作りたい。

ただ、両方のコードを全て共通化させて楽をするというのは上手く行かなさそうなので、あくまで小さいパーツに切り分けて、操作は各アプリで違ってくるという考え方良いと思っています。

CocoaPodsによる、外部ライブラリの利用と作成 | Developers.IO を読んでライブラリを作ってみます。

結構簡単にできました。今回は複数のアプリで使っていたTableViewControllerをライブラリに逃がしてみました。

try! Swift 文化を調和させる で学んだDataSourceの外出しを試してみました。ちょうど、最後の方のスライドの上に外出しした部分をライブラリにした具合ですね。

ライブラリを更新して、複数のアプリでpod updateすれば修正が全てに適応されます。ライブラリコードを固めることで良くも悪くも、自由度が下がり保守コストが下がります。

何はともあれCocoapodsの設定ファイルを作る

ライブラリは作成済み前提です。以下の様なコマンドを実行します。

$ pod spec create XXX

作成されたXXX.podspecを適切に編集する。

プライベートなCocoaPodsのSpecsを作成してデプロイ

githubで空っぽのCocoaPodsSpecsを作成してから作業する。

$ pod repo add yoneapp https://github.com/yoneapp/CocoaPodsSpecs
$ pod repo push yoneapp --allow-warnings --verbose

Podfileを書き換える

source 'git@github.com:yoneapp/CocoaPodsSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

use_frameworks!
platform :ios, '8.0'

target 'YYY' do
  pod 'XXX'
end

自分のライブラリ内で外部ライブラリを使う

Pod::Spec.new do |s|
  ...
  s.dependency 'PullToRefreshSwift', "= 2.0.0"
end

ios - How to import Alamofire/AFNetworking in my custom cocoapod - Stack Overflow

まとめ

今回作ったライブラリは公開できなさそうなんだけど、自前コードをライブラリ化する癖をつけておけば Motivation based library abstraction のようにライブラリを公開出来る日が来るんじゃないかなと思いました。