MacにLaravelをインストールする

概要

PHPで簡単なウェブサイトを開発中にやりたいことができずに詰まっていたので友人のススメでLaravelをインストールすることにした。

環境について

PHP Mac OS
7.1.16 Mac OS High Sierra (10.13.6)

composerインストール

brew install homebrew/core/composer

Laravelのinstall

composer global require "laravel/installer"

インストール中のログ (操作は不要)

Using version ^2.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 10 installs, 0 updates, 0 removals
  - Installing symfony/process (v4.1.4): Downloading (100%)         
  - Installing symfony/polyfill-ctype (v1.9.0): Downloading (100%)         
  - Installing symfony/filesystem (v4.1.4): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.9.0): Downloading (100%)         
  - Installing symfony/console (v4.1.4): Downloading (100%)         
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
  - Installing psr/http-message (1.0.1): Downloading (100%)         
  - Installing guzzlehttp/psr7 (1.4.2): Downloading (100%)         
  - Installing guzzlehttp/guzzle (6.3.3): Downloading (100%)         
  - Installing laravel/installer (v2.0.1): Downloading (100%)         
symfony/console suggests installing psr/log-implementation (For using the console logger)
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files

パスを通す

export PATH="$PATH:$HOME/.composer/vendor/bin"

一度読み込む

source ~/.bashrc

プロジェクト作成

laravel newコマンドで、プロジェクト。

laravel new {プロジェクト名}

{プロジェクト名}の部分を作成したプロジェクト名に書き換える

今回はSampleとする

具体例

laravel new Sample

インストール中

ローカル開発サーバ起動

インストールが終了後

cd Sample

にて、Sampleフォルダに移動してから、

php artisan serve

を叩くと

Laravel development server started: <http://127.0.0.1:8000>

とログが表示される。

http://127.0.0.1:8000にアクセスするとページが表示される

スクリーンショット 2018-09-22 21.35.14.png

インストール完成である。

バージョンの確認

php artisan -V

もしくは

php artisan --version

で確認できる

Laravel Framework 5.7.5

おそ松くんで学ぶSwift4.2での「うそ松」判別法

Swift4.2 でのAPIの変更点

Swift4.2 でのAPI変更点である、「New Sequence Methods」 によって、 うそ松の判別法の書き方が下記のように変わります。 (ネタです)

let osomatsuBrothers = ["おそ松", "カラ松", "チョロ松", "一松", "ウソ松", "十四松", "トド松"]

// Swift 4.1 first / index (where:) / index (of:)

if let usomatsu = osomatsuBrothers.first(where: {$0.hasPrefix("ウソ")}),
    let usomatsuIndex = osomatsuBrothers.index(where:{$0.hasPrefix("ウソ")}),
    let tyoromatsuIndex = osomatsuBrothers.index(of: "チョロ松") {
    print("osomatsuBrothersで \(usomatsuIndex + 1) 番目は \(usomatsu) くん.")
    print("チョロ松のindexは \(tyoromatsuIndex + 1)")
} else {
    print("ウソが付く兄弟がいなかった")
}

Swift4.1まではこうだったのが、Swift4.2からはこうなります。

let osomatsuBrothers = ["おそ松", "カラ松", "チョロ松", "一松", "ウソ松", "十四松", "トド松"]

// Swift 4.2 first / firstIndex (where:) / firstIndex(of:)

if let usomatsu = osomatsuBrothers.first(where: {$0.hasPrefix("ウソ")}),
    let usomatsuIndex = osomatsuBrothers.firstIndex(where: {$0.hasPrefix("ウソ")}),
    let tyoromatsuIndex = osomatsuBrothers.firstIndex(of: "チョロ松") {
    print("osomatsuBrothersで \(usomatsuIndex + 1) 番目は \(usomatsu) くん.")
    print("チョロ松のindexは \(tyoromatsuIndex + 1)")
} else {
    print("ウソが付く兄弟がいなかった")
}

ついでに lastIndexについても同じような操作で対応できます。

let osomatsuBrothers = ["おそ松", "カラ松", "チョロ松", "一松", "ウソ松", "十四松", "トド松"]

// Swift 4.2 last / lastIndex (where:) / lastIndex(of:)

if let usomatsu = osomatsuBrothers.last(where: {$0.hasPrefix("ウソ")}),
    let usomatsuIndex = osomatsuBrothers.lastIndex(where: {$0.hasPrefix("ウソ")}),
    let lastMajorIndex = osomatsuBrothers.lastIndex(of: "チョロ松") {
    print("osomatsuBrothersで \(usomatsuIndex + 1) 番目は \(usomatsu) くん.")
    print("チョロ松のindexは \(lastMajorIndex + 1)")
} else {
    print("ウソが付く兄弟がいなかった")
}

元ネタはこちらの記事です。

What's new in Swift 4.2 - New Sequence Methods

let ages = ["ten", "tweleve", "thirteen", "nineteen", "eighteen", "seventeen", "fourteen", "eighteen", "fifteen", "sixteen", "eleven"]

// Swift 4.1

if let firstTeen = ages.first(where: {$0.hasSuffix("teen")}),
    let firstIndex = ages.index(where:{$0.hasSuffix("teen")}),
    let firstMajorIndex = ages.index(of: "eighteen") {
    print("Teenager number \(firstIndex + 1) is \(firstTeen) years old.")
    print("Teenager number \(firstMajorIndex + 1) isn't a minor anymore")
} else {
    print("No Teenagers around here")
}

// Swift 4.2

if let firstTeen = ages.first(where: {$0.hasSuffix("teen")}),
    let firstIndex = ages.firstIndex(where: {$0.hasSuffix("teen")}),
    let firstMajorIndex = ages.firstIndex(of: "eightenn") {
    print("Teenager number \(firstIndex + 1) is \(firstTeen) years old.")
    print("Teenager number \(firstMajorIndex + 1) isn't a minor anymore")
} else {
    print("No Teenagers around here")
}

if let lastTeen = ages.last(where: {$0.hasSuffix("teen")}),
    let lastIndex = ages.lastIndex(where: {$0.hasSuffix("teen")}),
    let lastMajorIndex = ages.lastIndex(of: "eighteen") {
    print("Teenager number \(lastIndex + 1) is \(lastTeen) years old.")
    print("Teenager number \(lastMajorIndex + 1) isn't a minor anymore")
} else {
    print("No Teenagers around here")
}

また、 allSatisfyが新しく加わりました。 これによってシーケンスの全ての要素が条件を満たすかどうかを取得したい場合の書き方が下記のように書けるようになります。

let values = [10, 8 ,12, 20] // [10, 8, 12, 20]
let allEven = values.allSatisfy{ $0 % 2 == 0}
allEven // true

AirbnbのReact Nativeからの撤退について

【翻訳】React Native at Airbnb: The Technology

翻訳記事があったのをみつけた。

他にも翻訳記事があった全部で5パートらしい

パート1

パート2

パート3

パート4

パート5

Google、Pixel 3シリーズを日本発売かどうか

Pixelが日本でも発売されたら私は多分今年はiPhoneではなくてAndroidを購入することになります。 ということになると、私にとってのベストなスマホの持ち方が iOS: iPhone8 Android: Pixel3 になりそうだと思う。

今のiOSがiPhone7なのですが、iPhone7が若干古くなってきたので買い替えたいと思っていたり。 そうなるとホームボタン+指紋認証の最後の救済処置として発売してくれたiPhone8しか選択肢がなくなる。 もうあと2,3年すればiPhoneXのような機種でも習慣的に問題ないかなと思うのですが、 どうもあの触り方に違和感を持ってしまう。

Pixelが日本で使えるようになったら私はもう正式にAndroidエンジニアを名乗ろうと思う。 これまで日本はiOS超大国であったがスティーブ・ジョブズが亡くなってからのAppleの落ちぶれをみていたらあと持っても2,3年だと思う。 なので、これから来るDapps時代の到来を考えるとアプリをリリースしやすいAndroidの方が期待値が高い。

エンジニアはプライペートの時間も犠牲にして勉強すべきかどうかについて

こんにちは、たまっぺです。

IT業界では(と言うより、ブログ業界では)、ウェブ系やモバイル系の会社で働くエンジニアは業務時間外にも技術のトレンドを追いかけたり勉強会に参加したりと「プライベート時間中に特に己を磨くために鍛錬すべき」かどうかのトピックが流れてきます。

axia.co.jp

www.yutorism.jp

ネットサーファーによっては「もう何十回議論してんねん」って言うような話しですが恐縮ですが私自身もよくわかっていないこのタイミングで文章として残して置きたいと思ってブログをせっせと書いています。

プライベートでもエンジニアが勉強すべきかどうか

まずエンジニアがプライベートにも勉強すべきかどうかの前に、エンジニアが業務時間外にも勉強していようが文系のサラリーマンやマネジメント層たちは業務時間外に女のネーチャンの尻を追っかけている事実が変わらないと言うことです。 また、事務職や営業のネーチャンは日頃の仕事に対するストレスの鬱憤を解放するためにアフターは居酒屋にいい男を探すために合コンに出かけたり、歳をとるにつれて衰えていく肌のメンテのためにエステサロンに足を出向けるのである。 真面目なエンジニアは勉強会に参加したり登壇者が前日か二日前に「面倒くせー」と思いながらささっと作った資料を元にして発表するLT(ライトニングトーク)を聞いて非常にありがたがっている間、サラリーマンの方は新しい出会いを求めて合コンに参加したはいいが目の前にいるちょいブスのネーチャンを見て「あー、今日もハズレだわ」と哀れます。女のネーチャン側はというとネーチャン側で「今日の合コン、全然冴えないおっさんばっかで完全にハズレだわ」と思いながらテーブルに置かれているハイボールをガバガバ飲んで時が過ぎるのも待つのだ。

そう言う両面の現実を見てしまうと「エンジニアってそんな頑張って技術を学んだり、トレンドを追っかける必要はないんじゃない」と思ってしまうのだ。

だから今回は業務時間外も勉強すべきかどうかは脇にとりあえず置いといて、業務時間外に勉強することのメリット・デメリットを私なりにまとめてみることにした。 だからあなたがすべきことはそのメリット・デメリットを考慮して自分に有利な方を選択すればいいだけだ。 そうすれば、あなたは有利な選択をしているのだからメリットしかないはずである。

業務時間外にも勉強するメリット

  • 最新の技術を学ぶことができる
  • 業務中に読書できない技術本を読むことができて業務中に変なコードを買いたり変な設計をして周りのメンバーに迷惑を書ける確率が減らせる
  • 周りのライバル(隣で働いているエンジニア)を出し抜いて自分が出征して面白い案件に携われる確率が上がる?
  • 勉強会に参加すればエンジニアの友達が増える
  • 友達が増えればそれはもう人脈だからそこから面白い話が飛んできて仕事が増える
  • もしかすると副業の発端となって年収が上がる
  • 新しい技術が自分に身につけば業務の内容をスマートにできる
  • 勉強し続けると臨界点が見えて勉強するコツを見つけると学びが楽しくなる
  • 頑張れば上のステージに進めるのである意味RPGをプレイしている感覚で楽しくなる時がくる

業務時間外にも勉強するデメリット

  • プライベート(遊ぶ)の時間がなくなる
  • 結果として自分のストレスが溜まって寝不足になる確率が上がる
  • 新しい出会いができる確率が下がる
  • 仕事の後にさらに負荷のかかる作業が入ることになる
  • 下手したらライトニングトークの登壇者になる確率が上がるので緊張する機会が増える
  • 周りがほぼ男性のライフスタイルになってしまう。
  • 寝不足になる恐れが増える。
  • ウェブ・モバイルに関わらずフロントエンドの技術のライフスタイルはかなり短いので学んだ技術が枯れやすいのでトレンドを追い続けなければならない
  • 20代での勉強は楽しいがそれを30代でも持ち越すと一気に重くなる
  • 勉強が趣味になる
  • なんか俺充実してない感が半端ない

余談

日本しか知らないのですが、日本のエンジニアの年収って400 ~ 800万円が期待するレンジですので業務時間外に勉強するメリットを享受できるのは800万円がMAXでそれ以上は上がりにくいので800万円を越えるとメリットが極端に下がります。 (もちろん、800万円からさらに上げる方法はあるとは思いますが) その時にもう一度「業務時間外にも勉強する価値があるかどうか」を考え直してはいかがでしょうか。

ただ、海外も含めたとしてもMAX2000万円が限界だと思うので限界幅は意外と狭いな。

iPhoneの新型機の登場

iPhoneの新型機について

今日、例のごとくAppleのiOS12のリリース日だったのでそれと同時に新型iPhoneの発売が確定しました。 今回の発表でAppleiPhoneのデザインが完全にあっちの方向に行くと言う未来が見えた。 それだけで十分な発表だった。

そりゃあiOSの開発言語のSwiftの作者が逃げたり、 共同創業者のウォズが逃げたりするわ。 だって発表中革新的なことがなかったし新型iPhoneを手に入れてまずやることがゲームって話なんだから。

どのiPhoneを購入すれば良いのか

今回のリリース内容をみて一発で今年は「iPhone8」が買いだと思いました。 私はM字のあのデザインは好きではないのです。 iPhoneXシリーズにはまだ手を出しません。

あのM字のデザインが好きな人ならシンプルにiPhoneXsじゃないでしょうか。

スペック重視ならiPhoneXRってやつじゃないでしょうか。

Objective-CからSwiftへの書き換え作業, enum, NS_OPTION, ビットフィールド

Swiftが登場して以来、 Objective-cenumをSwiftに書き直すといった作業は少なくない。 そんなenumをSwiftでかくとどうなるだろうか。

それを一度まとめてみようと思う。

基本系

Objective-c

enum Sample {
     SampleA = 1, SampleB, SampleC
};

Swift

enum Sample : Int {
    case a = 1
    case b 
    case c
}

NS_ENUMで定義された列挙型

Objective-c

typedef NS_ENUM (NSInteger, SampleType) {
    SampleTypeObjc,
    SampleTypeSwift,
    SampleTypeJava,
    SampleTypeKotlin,
};

Swift

enum SampleType : Int {
    case objc
    case swift
    case java
    case kotlin
}

これが大体の仕事場でObjective-Cファイルでよく見られるコードだと思う。 今まで散々Swiftに書き直してきたよ。

NS_OPTIONで定義された列挙型

Objective-c

typedef NS_OPTIONS(NSUInteger, SampleType) {
    SampleTypeObjc  = 1 << 0,
    SampleTypeSwift  = 1 << 1,
    CategoryJava = 1 << 2,
    CategoryKotlin = 1 << 3,
};

Swift

struct SampleType : OptionSet {
    let rawValue: Int

    static let objc = SampleType(rawValue: 1 << 0)
    static let swift = SampleType(rawValue: 1 << 1)
    static let categoryJava = SampleType(rawValue: 1 << 2)
    static let categoryKotlin = SampleType(rawValue: 1 << 3)
}

let singleOption = SampleType.objc
let multipleOptions: SampleType = [.objc, .swift]
if multipleOptions.contains(.swift) {
    print("multipleOptions has swift")
}

マクロ定義

マクロ

#define pi = 3.14
let Pi = 3.14

CまたはObjCで定義された、定数値を表す単純なマクロは、 Swiftではグローバルな定数として表現される。

共用体とビットフィールド

実務で全然見かけないが共用体の定義

objc

typedef union IntChars {
    int swift;
    unsigned char list[4];
};

swift

struct IntChars {
    var swift: Int = 0
    var list = [UInt8](repeating: 0, count: 4)
}

objc

typedef union IntChars {
    int swift;
    unsigned char list[4];
};

struct WNumber {
    unsigned int flag:1;
    unsigned int pad:7;
    IntChars data;
};

swift

struct IntChars {
    var swift: Int = 0
    var list = [UInt8](repeating: 0, count: 4)
}
struct WNumber {
    var: unsigned int flag?
    var: unsigned int pad?
    var data = IntChars()
}

このあたりを網羅しておけばenumのSwiftへの書き換えで いちいち考える必要がなくなると思います。