でぐちやドットコム技術ブログ

でぐちやドットコムの技術系ブログです。

表示されているアラートビューを消す

アプリがバックグラウンドに入った時に、アラートビューを消す処理を行いたかったので実装しました。 Objective-CやSwiftのコードは結構ネット上にも転がっているが、Xamarinでのソースがあまり発見できなかった。

if (!UIApplication.SharedApplication.KeyWindow.IsMemberOfClass(new ObjCRuntime.Class("UIWindow")))
{
    var view = UIApplication.SharedApplication.KeyWindow.RootViewController;
    while (view.PresentedViewController != null)
    {
        view = view.PresentedViewController;
    }
    if (view.IsKindOfClass(new ObjCRuntime.Class("UIAlertController")))
    {
        view.DismissViewController(false, null);
    }
}

もっと簡単な方法があるかも。 本来は、アプリケーション側で勝手にアラートを消すのはよくない気はする。

[bash] ツェラーの公式で曜日を求めるスクリプト

bashで曜日を求めたい場合、ツェラーの公式を利用すれば求められます。

昨年末に作成したプログラムで必要だったのでスクリプトを書いていたのですが、今年に入ってからそのスクリプトが求めている曜日が間違っていることに気づきました。個人的に使っているスクリプトでまあ間違っていても大した影響はないのですが、原因を調べてみると、私のツェラーの公式の理解が間違っていました。

1月と2月の曜日を求めるときだけは、前年の13月、14月として扱って計算しなければならないそうです。
なので、2018年1月22日の曜日を求めたい場合は、2017年13月22日として計算する必要があります。
その処理を入れてやれば期待通りの動きができました。

以下は、前日の曜日を求めるためのスクリプトです。

#!/bin/sh

YESTERDAY=`env TZ=JST+15 date +%Y%m%d`
echo 日付:$YESTERDAY

h=`expr ${YESTERDAY:0:4} / 100`
y=`expr ${YESTERDAY:0:4} % 100`
m=${YESTERDAY:4:2}
d=${YESTERDAY:6:2}

# 1月、2月は前年の13月、14月として扱う
if [ "$m" = "01" ]; then
    m="13";
    y=`expr $y - 1`;
elif [ "$m" = "02" ]; then
    m="14";
    y=`expr $y - 1`;
fi

t1=`expr \( $m + 1 \) \* 13 / 5`
t2=`expr $y / 4`
t3=`expr $h / 4`

yobi=`expr \( $y + $t2 + $t3 - 2 \* $h + $t1 + $d \) % 7`

declare -a array=("SAT" "SUN" "MON" "TUE" "WED" "THU" "FRI")
echo ${array[${yobi}]};

1月2月の場合の処理だけ結構適当なので動かなくなるパターンもあるのですが、しばらくは大丈夫なのでこのまま使いたいと思います。

Wikiを参考にしました。 ツェラーの公式 - Wikipedia

LaravelでコマンドAPIを作成

Laravelの基本的な部分が少しわかったので、早速色々作っていきたいと思っています。環境は以下の通りです。

  • PHP 7.2.0
  • Laravel 5.5.28

最終的にはWebアプリを作っていきたいのですが、まずはCronで実行するスクリプトを作りたいと思っているのでその作り方をメモしておきます。

コマンドの作成

artisanでコマンドを作成します。

vagrant@homestead:~/code/laravel$ php artisan make:command TestCommands
Console command created successfully.

上記のコマンドで、app/Console/Commands/TestCommands.phpが作成されます。
作成されたファイルは以下のようになっています。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TestCommands extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

コマンド名の変更

TestCommands.phpの$signatureに名前が定義されています。デフォルトではcommand:nameとなっていますので、任意の名前に変更します。

protected $signature = 'testcommand';

デフォルト設定のようにcommand:nameの形にすると、commandと言う名前空間(グループ?)のnameと言うコマンドで登録されます。

コマンドの登録

作成したコマンドをartisanのコマンドとして登録します。app/Console/Kernel.phpに記述することで登録可能です。

$commandsに、コマンドを追加します。

    protected $commands = [
        Commands\TestCommands::class
    ];

コマンドの確認

コマンドとして登録されているか、artisan list コマンドで確認します。
testcommandが登録されていればOKです。

処理の記述

実際のコマンドの処理は、handleメソッドに追加していきます。慣例に習って、hello worldでいきます。 app/Console/Commands/TestCommands.phpのhandleを以下のようにします。

<?php
/**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo "hello world \n";
    }

コマンド実行

artisan testcommandを実行すると、無事にhello worldが実行されました。

vagrant@homestead:~/code/laravel$ php artisan testcommand
hello world 

LaravelでViewを使ってHello world

前回、Controllerから直接Hello Worldの文字列を出力しました。

kouji1110.hatenablog.com

次はControllerからViewを呼び出して表示させてみたいと思います。

Viewファイルの作成

Viewはresources/views/にファイルを作成します。Controllerはartisanコマンドで作成しましたが、Viewは直接ファイルを作るようです。いまいち違いがわかりませんがそういうものだと思って進めたいと思います。

今回はhello.blade.phpを作成しました。

記述は下記のようにします。

<h2>Hello world From View</h2>

Controllerから呼び出し

前回作成したgetIndex()メソッドを下記のように変更します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class helloController extends Controller
{
    public function getIndex() {
//        echo 'Hello World';   # ←前回やった直接表示
        return view('hello');
    } 
}

view('hello')で作成したhello.blade.phpが読み込まれます。

ブラウザで確認

ブラウザでhttp://homestead.test/helloworld/indexにアクセスして確認すると、hello worldが表示されていることが確認できました。
実際は、Controllerで色々と処理を行って、その結果をViewに渡して画面を表示すると言う流れになるのかな。

Homesteadのデータベース接続についてのメモ

Laravelのデータベース設定は、デフォルトでHomesteadで利用するための設定になっているらしいので、開発で使用する場合はそのままでOKです。

データベースはSequel Proでアクセスしたいので、その設定値をメモしておきます。

Host:127.0.0.1
UserName : homestead
Password:secret
Port : 33060

f:id:skouji1110:20180121144832p:plain

上記の設定でSequel ProでMySQLにアクセス可能です。当然、Vagrant upで起動しておかないとアクセスできないので注意。

LaravelでHello world

Laravelの開発環境構築が無事に終わりましたので、次はHello worldにチャレンジです。(実際にやりながら記事も書いているので支離滅裂になっているかもしれません)

kouji1110.hatenablog.com

web routeの確認

最初にインストールした状態ではwelcomeページが表示されるように設定されています。 web routeの設定は、routesディレクトリのweb.phpファイルに書かれています。

Route::get('/', function () {
    return view('welcome');
});

ここを直接hello worldに書き換えても問題なく動作します。

Route::get('/', function () {
    return 'hello world';
}

これでwebブラウザを確認してみると、きちんと出力されているはずです。 ただし、これだとMVCモデルだとかその辺りが全く意識されていないし拡張性もゼロなので、コントローラーを呼び出すようにしてみたいと思います。

コントローラーの作成

vagrantコマンドプロンプト上でコントローラーを作成します。

$ php artisan make:controller helloContoroller
Controller created successfully.

作成すると、app/Http/ControllershelloController.phpというファイルが作成されます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class helloController extends Controller
{
    //
}

デフォルトで上記のファイルができています。そこに処理を追加します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class helloController extends Controller
{
    public function getIndex() {
        echo 'Hello World';
    } 
}

Hello Worldと出力するだけのgetIndex()というメソッドを追加しました。

これをweb.phpに設定します。

Route::get('/helloworld/index', 'helloController@getIndex');

上記の設定を追加することで、helloworld/indexにアクセスされた時に、helloControllerのgetIndexメソッドが呼ばれます。

http://homestead.test/helloworld/index にアクセスすると、期待通りの結果が得られることを確認できました。

本来はviewも用意して、コントローラーからビューを呼び出すのが正しいと思いますので、次はviewを作成するところにチャレンジしてみたいと思います。

Mac+VagrantでLaravelの開発環境を構築する

PHPでサイトを作りたく、いままではPHPフレームワークとしてFuelPHPを使用していくつか簡単なサイトを作りましたが、FuelPHPってあまり流行っていないみたいなのでLaravelを使ってみることにしました。

まずは、開発環境の構築を行うのですがMac + Vagrantで構築したのでそのメモです。

基本的には、以下の公式(?)ページの手順にしたがって構築していきます。 Laravel Homestead

boxの追加

まずはVagrantのboxの追加です。

$ vagrant box add laravel/homestead

どの仮想環境か聞かれるので、virtualboxを選択します。

This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice: 3

結構時間がかかりますので気長に待ちます。私の環境では15〜20分程度かかりました。

Hometeadのインストール

ホームディレクトリにHomesteadをインストールします。

$ cd ~
$ git clone https://github.com/laravel/homestead.git Homestead

githubのリリースページを確認し、最新の安定版をチェックアウトします。(今回はv7.0.1が最新)

$ cd Homestead
$ git checkout v7.0.1

初期化用のスクリプトを実行します。Homestead.yamlが作成されます。(古い記事だと、.homesteadと言うフォルダが作成されることになっていて少し変わっていますので注意です。)

bash init.sh

Homesteadの設定

作成されたHomestead.yamlを編集します。

foldersの部分を編集します。

map:のところにローカル環境のプロジェクトのパスを設定します。今回は~/Projects/laravelとしました。

sites:のto:のパスも変更しています。

ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Projects/laravel
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/laravel/public

databases:
    - homestead

Hostsファイルの設定

/etc/hostsファイルを編集して以下の設定を追加します。

192.168.10.10   homestead.test

この設定でhttp://homestead.testにアクセスして動作確認できるようになります。

以上でHomesteadの設定は完了です。

プロジェクトのインストール

vagrant upで起動して、vagrant sshでアクセスしてプロジェクトを作成していきます。初回はvagrant upで時間かかります。

$ vagrant up
$ vagrant ssh

/home/vagrant/code/と言うディレクトリができているので、そこにcomposerでインストールします。

$ cd /home/vagrant/code
$ composer create-project laravel/laravel --prefer-dist

以上で完了です。 ローカルのwebブラウザでhttp://homestead.testにアクセスしてページが表示されるはずです。

Laravelのバージョン確認

インストールしたLaravelのバージョンを確認するには、プロジェクトをインストールしたディレクトリに移動して、php artisan -versionコマンドで確認できます。

$ ~/code$ cd laravel/
$ ~/code/laravel$ php artisan -version
Laravel Framework 5.5.28