CSS Grid Layout を使ってみよう!(基本編)


 
webページでレイアウトをするとき、今まではfloat、最近では、Frexboxを使ったりしているかと思いますが、「CSS Grid Layout」も今後導入を考えてもいいかもしれません。
まずは、簡単に3×3のマスを作ってみましょう!
 
.grid-containerにグリッドの要素を内包する要素として
「display: grid;」を記述します。

item1
item2
item3
item4
item5
item6
item7
item8
item9
.grid-container{
  display: grid;
  height: 300px;
}
.grid-item{
  background-color: #efefef;
  border: 1px solid #ddd;
}

このままだと、divタグが並んでるだけなので、.grid-itemにそれぞれ位置を追記します。

.item1 {
  grid-column: 1 / 2;
  grid-row: 1 / 2;
}
.item2 {
  grid-column: 2 / 3;
  grid-row: 1 / 2;
}
.item3 {
  grid-column: 3 / 4;
  grid-row: 1 / 2;
}
.item4 {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item5 {
  grid-column: 2 / 3;
  grid-row: 2 / 3;
}
.item6 {
  grid-column: 3 / 4;
  grid-row: 2 / 3;
}
.item7 {
  grid-column: 1 / 2;
  grid-row: 3 / 4;
}
.item8 {
  grid-column: 2 / 3;
  grid-row: 3 / 4;
}
.item9 {
  grid-column: 3 / 4;
  grid-row: 3 / 4;
}

これで、要素が3x3に並んだと思います。

CSSが長くなりましたが、内容はほとんど共通でシンプルです。
「.grid-item」に指定してある、
grid-columnは横の開始点と終了点、
grid-rowは縦の開始点と終了点を指定しています。


ちなみに分割する線のことを「グリッドライン(grid line)」と呼んでいます。

アイテム間に余白を入れるgrid-gap

アイテム間に余白を入れたい場合があると思います。
その場合、親要素「.grid-container」に「grid-gap」を追記しましょう。

.grid-container{
  display: grid;
  grid-gap: 5px;
}

アイテム間に5pxの余白が出来たと思います。

共通のアイテムの幅と高さの指定

ここまでで、「item1」〜「item9」まで個々にアイテムの幅と高さを指定していましたが、共通の幅と高さである場合「grid-template-columns」「grid-template-rows」で省略できます。
grid-template-columnsで横幅の指定、grid-template-rowsで縦幅の指定ができます。

次のように書くと、「横幅が150px 100px 50px」「縦幅は150px 100px 50px」の縦横共通のアイテムができます。

.grid-container{
  display: grid;
  height: 300px;
  grid-gap: 5px;
  grid-template-columns: 150px 100px 50px;
  grid-template-rows: 150px 100px 50px;
}

「fr」という値について

さらに「1fr」「2fr」などの様に指定すると残りの長さを分割出来ます。

.grid-container{
  display: grid;
  height: 300px;
  grid-gap: 5px;

/*幅150px 残りの1/3 残りの2/3 のグリッド*/
  grid-template-columns: 150px 1fr 2fr;

/*高さ150px 残りの1/3 残りの2/3 のグリッド*/
  grid-template-rows: 150px 1fr 2fr;
}

個別のアイテムの大きさの変更

これらを応用すれば下記のようなレイアウトが出来ます。
(item4,item5の大きさを変更しています。)

item1
item2
item3
item4
item5
item6
item7
.grid-container{
  display: grid;
  height: 300px;
  grid-gap: 5px;

/*幅150px 残りの1/3 残りの2/3 のグリッド*/
  grid-template-columns: 150px 1fr 2fr;

/*高さ150px 残りの1/3 残りの2/3 のグリッド*/
  grid-template-rows: 150px 1fr 2fr;
}
.grid-item{
  background-color: #efefef;
  border: 1px solid #ddd;
}

/*「grid-template-columns」「grid-template-rows」で指定した以外の大きさのレイアウト*/
.item4 {
  grid-column: 1 / 3;
  grid-row: 2 / 3;
}
.item5 {
  grid-column: 3 / 4;
  grid-row: 2 / 4;
}

グリッドラインに名前

ちなみにグリッドラインに名前をつけることができます。
最初や最後、キーポイントとなるグリッドに名前を付けることで管理がしやすくなるかと思います。

.grid-container{
  display: grid;
  grid-gap: 5px;
  grid-template-columns: [c1] 150px [c2] 1fr [c3] 2fr [c4];
  grid-template-rows: [r1] 150px [r2] 1fr [r3] 2fr [r4];
}
.item1 {
  grid-column: c1 / c2;
  grid-row: r1 / r2;
}

spanキーワードを使う

グリッドラインの代わりにいくつ先のラインに伸ばすか記述する方法もあります。
下記の「grid-row」だとグリッドライン2から2つ目までという意味です。

.item5 {
  grid-column: 3 / 4;
  grid-row: 2 / span 2;
}

ここまでのサンプルです。

簡単にですが、CSS Grid Layoutの基本的な使い方をお伝えすることができたでしょうか??

グリッドの指定が独特ですので、「GRID GARDEN」というゲームを触りつつ、慣れてみるものありかもしれません。

対応ブラウザについて

https://caniuse.com/#feat=css-grid
Edgeも対応され、これから徐々にグリッドレイアウトのサイトが増えてくるかもしれませんね。

次回は、具体的レイアウトを元に使い方をお伝えしようと思います。

今年も大阪の街を駆け抜けました

こんにちわ。
リエです。
 
11月26日は第7回大阪マラソンマラソンでした。
昨年大阪マラソンのチャレンジランを走ったというブログを書きましたが、

大阪マラソンエントリー~出場までの道のり


 
なんと今年もエントリーしたら運よく当選しました。
たくさんの方がエントリーする中で、2年連続当選するとはとてもラッキーなことだと思います。
神様ありがとう。
 
ただ、わたくし日常的に運動しない人間でして、走るのもそんなに得意ではないという。。
前回のチャレンジランからお恥ずかしいことに全く走っていませんでした。
 
練習しなきゃ〜と思っているうちに、月日は流れ、あれ?今日マラソン当日じゃない?となりました。
冗談抜きで全く練習していない(-_-;)
※ケガの元となるので、練習無しでのマラソン参加は大変危険です。
絶対にマネしないでください。(誰もマネしないか。。)
 
不安しかない中でマラソンはスタートしました。
 
さて、結論をいうと完走できました!
途中歩くこともなく1時間ぐらいで完走できたので、上出来じゃないかな〜と思ったり。
順位はちょうど真ん中ぐらいでした。(995位/1982人中)
 
昨年は1時間以内で走るというのが目標でしたが、今年は制限時間内に走りきるということが目標で、途中歩いても完走することが大事かなと思っていたので、本当によかったと思います。
楽しんで走りきれましたし(*´∀`)♪
 
たくさんの方が応援に来られていて、あたたかい声援をたくさんいただいたおかげで走りきれたと思います。
応援してくださった方、本当にありがとうございました。

感動のゴールの瞬間(下向いてる)
なんかモザイクが不自然ですいません\(^o^)/
 
現在は絶賛筋肉痛中です。
自分の足じゃないみたいです。
 
 
早くこの筋肉痛から開放されないかなと切に願っています。

Laravel 5.1でQueueを使って困ったこと

 

技術系のメモ書き程度のことですが、メール送信処理や時間のかかる処理等をLaravelのQueueを初めて使って困ったところを書いておきます。

結論を先に書くと
1. listenよりworkを使う
2. ドライバーにdatabaseを使う場合は複数立ち上げない

1. listenよりworkを使う

処理の優先順や別々の機能等があり何個かQueue処理を作ってそれぞれlistenで立ち上げていたのですが、複数立ち上げていくとCPU使用率がどんどん上昇してしまい最終的にはちょっと実用に耐えられないぐらい上がってしまいました。

もともとlistenで立ち上げるとCPUを食うことは知っていましたが、listen1つでここまでCPUを使うとは・・・

こちらはlistenからworkに変更することで問題は解決しました。
全然CPUにかかる負担が違う。

2. ドライバーにdatabaseを使う場合は複数立ち上げない

基本的にはSQS等を使えば問題ないとは思いますが、当面は処理量も少なくまたローカル開発環境で手軽に使える為、ドライバーにdatabaseを使用していました。

特に処理も滞りなさそうに動いていたのですが、複数のqueueを立ち上げているとログに不穏なものが・・・

 

Deadlock found when trying to get lock; try restarting transaction

 

調べてみると、どうやらドライバーにdatabaseを使用して複数立ち上げると発生するっぽい。
とりあえず基本的に量が少ないうちだけdatabaseを使用して、処理量が多くなったらSQS等にドライバーを切り替える予定なので、当面は同じQueueについては1つのみ立ち上げる形で運用しています。

 

以上、LaravelでQueueを使って困ったことでした!

 

あとがき
次のLTS出たのでそろそろバージョンを上げたい。
・・・でもそんな時間がまだ取れないorz
いつになるかわかりませんが、5.1から5.5に上げた時に困ったことを記事に書く予定です。

 

読みやすい文章を書く、ちょっとしたコツ

 

こんにちは。
デザイナーのヒロシです。

 

メールやプレゼン資料・オウンドメディア記事の作成など、文章作成は日々の業務に付いてまわるもの。少しでも分かりやすい文章を書きたいものですが、苦手意識を感じる方も多いのではないでしょうか。

 

日本語ってムズカシイ。
かくいう私もそのひとり。

苦手意識をなくすために、今回、このような本を手に取ってみました。

 

新装版 日本語の作文技術
新装版 日本語の作文技術 本多勝一(著)

 

文章作成やライティングなどのキーワードで本を探したりしていると「読まれるため」の方法はよく見受けられます。以下のような感じ。

 

・読み手を意識した主題や構成を考える
・語彙力を豊富にして表現方法を高める
・ブログ記事ならばキーワード選別(SEO対策)etc…

 

それはわかってるんですよね!
私が知りたいのは文をどう書くのか?
どう言葉を回したらいいのかが知りたいんです!

 

なんて時にこちらの本が参考になります。
厳密に言うと、文章の作り方ではなく分かりやすい文の作り方、いわゆる作文の技術になるみたいです。
本記事では、こちらの本から、すぐに使えて効果がありそうなトピックスをひとつご紹介しています。

 

多くの人に読まれる文章を書きたい!記事のPVを上げたい!という方は、他の記事をお探しくださいw

 

かかる言葉と受ける言葉をなるべく近づける

 

当たり前のことなんですけどね。でも、普段から意識してますか?

たったこれだけを意識するだけで見違えるように文章が分かりやすくなります!

例えばこちらの一文。

 

【1. 入れ子のケース】

 

私は小林が中村が鈴木が死んだ現場にいたと証言したのかと思った。(P.42)

 

極端な例です。一読しただけでは分かりませんね。はい。でも文法的には間違っていません。

「私は…思った」の間に、修飾語・被修飾関係にある言葉が何重もの入れ子になっています。

この文を、一切の言葉に変更を加えず、機械的に位置を変えるだけで分かりやすくすることができます。

 

 

このようにかかる言葉(修飾語)と受ける言葉(被修飾語)を近づけることでぐっとわかりやすくなります。

 

【2. かかる言葉があいまいのケース】

 

とても美人だとは言えない(P.40)

 

第一感としては特に問題のなさそうな文ですが。。。

 

これは「到底、美人であるとは言えたものではない」の意味と「非常に美人だ、とは言えない」の二つの意味に捉えることができてしまい、文法的にあいまいさが見受けられます。
もし文を直すなら、「非常に」の意味であると捉えて(普通に考えると、「到底」の意味であればこのような文にはなりにくい)…

 

美人だとはとても言えない(P.40)

 

「とても」を「言えない」と近づければ明瞭な文になります。

 

このように、文章を読んでいて一読しても分かりにくい、なんだか引っかかるという場合の多くは修飾語と被修飾語のいち関係が問題だったりします。

 

【3. 複合の場合】

 

二日未明、東京都三鷹市のマンションで、部屋に充満していたプロパンガスが爆発して四人が重傷、三十二人が飛び散ったガラスの破片などで一〜二週間のけがをした。(『朝日新聞』1974年10月2日 夕刊9ページ)| (P.45)

 

特別わかりにくい文ではありませんが、それでも「三十二人が飛び散った…」のところは一瞬引っかかりがあります。まるで人間が飛び散ったかのように捉えることもできる。「三十二人」が実は「一〜二週間のけがをした」にかかっていることを理解するのには、瞬間にせよ途中で読みかえす必要があります。

 

これを抵抗なく読めるようにするために修飾語の位置関係を調整してみます。

 

…四人が重傷、飛び散ったガラスの破片などで三十二人が一〜二週間のけがをした。 (P.45)

 

としてみました。しかし、「一〜二週間のけが」をした人はガラスの破片によるものですが、重傷の四人は何によるものかは明確になっていません。爆風とも考えられますが、「ガラスの破片など」というのだから、「ガラスの破片などで」は重傷者も修飾すべきと考えます。

 

…プロパンガスが爆発して、飛び散ったガラスの破片などで四人が重傷、三十二人が一〜二週間のけがをした。 (P.46)

 

いかがでしょうか?かかる言葉と受ける言葉の位置で読みやすさや受け取る意味の明瞭さが変わることが理解いただけたかと思います。

 

 

 

新聞の社会面トップ記事でもこのようなことがあります(文字制限の関係もあるかと思いますが。。)。ちょっとしたことで随分と分かりやすさが変わってくるので、文章を作成する際、読む際にも十分気をつけていきたいですね。

 

今回、紹介しました「日本語の作文技術」では、修飾語の位置以外にも「テニヲハ」の使い方など、明確な作文技法やルールが述べられていますので、文章作成に苦手意識のある方はご一読してみてはどうでしょうか。

 

また機会があれば、修飾する順番や句読点の打ち方など紹介したいと思います。

 

簡単!DockerでPHP環境構築

先日美容院にいったら小学校以来の短さになったノリフミです。

Dockerについてシリーズ物で記事を書こうとおもっていたのですが、まずは元になる記事をかかねば…
ということで、今回は簡単にPHP環境を構築していきます。

目次

今回の妄想


ア○パ○マ○みたいになってしまいました、、、

今回の妄想は、サーバーやローカルなどでDockerを使い、各プロセスを独立して構築し稼働させることです。
これはDockerの思想?理念?である「1コンテナ1プロセス」に乗っ取った構築図になります。「1コンテナ1プロセス」については色々と論争が絶えないようですが、見なかったことにして進めます。

「簡単」が目標のため、Dockerfileを弄って云々はしません!
コマンドのみで公式debian imageを使って進めますので悪しからず。

Dockerでブリッジネットワークを構築

Dockerで独立して構築したコンテナを相互接続できるようにブリッジネットワークを構築していきます。

既にインストール時に、3種類のネットワークが構築されていますが、分かり易いように独自ネットワークを使いたいと思います。

# dockerブリッジネットワーク構築
docker network create -d bridge --subnet 192.168.99.0/16 --gateway 192.168.99.1 example_nw

「example_nw」は構築するブリッジネットワークの名前になります。
任意で設定してください。

作成が終われば、作成したネットワークを確認しておきます。

# ネットワーク詳細確認
docker network inspect example_nw
[
  {
    "Name": "example_nw",
    "Id": "hashhogehoge",
    "Created": "2017-11-06T00:15:36.163888222Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "192.168.99.0/16",
          "Gateway": "192.168.99.1"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {},
    "Labels": {}
  }
]

※ ブリッジネットワーク内のコンテナは設定しているコンテナ名やIPアドレスでアクセスすることが可能です。

Dockerでmysqlを動かす

コンテナを再構築時にもデータを保持できるように、mysqlデータ用のディレクトリをホストに作成しておきます。

mkdir ~/example/mysql

Docker imageはDocker Hubより適当に拝借します。

# docker mysql構築
docker run -d --name mysql \
-v ~/example/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root_user_pass \
-e MYSQL_DATABASE=example_db \
-e MYSQL_USER=example_user \
-e MYSQL_PASSWORD=example_user_pass \
--net=example_nw \
--ip=192.168.99.100 \
mysql:latest
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
85b1f47fba49: Pull complete
5671503d4f93: Pull complete
3b43b3b913cb: Pull complete
4fbb803665d0: Pull complete
05808866e6f9: Pull complete
1d8c65d48cfa: Pull complete
e189e187b2b5: Pull complete
02d3e6011ee8: Pull complete
d43b32d5ce04: Pull complete
2a809168ab45: Pull complete
Digest: sha256:hashhogehoge
Status: Downloaded newer image for mysql:latest
hashhogehoge

※ 使用するimageがホストにない場合は初期構築に時間を要します。

mysqlデータ永続化確認

# mysql接続
docker exec -it mysql mysql -u example_user -p example_db
Enter password: 
# テーブル生成 
create table example_tb (id int); 
Query OK, 0 rows affected (0.04 sec) exit; 

# docker-mysql再構築 
docker stop mysql && docker rm mysql 
docker run -d --name mysql \ 
-v ~/example/mysql:/var/lib/mysql \ 
-e MYSQL_ROOT_PASSWORD=root_user_pass \ 
-e MYSQL_DATABASE=example_db \ 
-e MYSQL_USER=example_user \ 
-e MYSQL_PASSWORD=example_user_pass \ 
--net=example_nw \ 
--ip=192.168.99.100 \ 
mysql:latest

再度mysqlに接続し、テーブル確認。

docker exec -it mysql mysql -u example_user -p example_db
Enter password: 
show tables; 
+----------------------+
| Tables_in_example_db |
+----------------------+
| example_tb           |
+----------------------+
1 row in set (0.00 sec)  exit;

Dockerでphp-fpmを動かす

nginxもありますが、先にfpmを構築していきます。

プロジェクト用のディレクトリと簡単なindexファイルを作成しておきます。

mkdir ~/example/src
vi ~/example/src/index.php
<?php
// pdoインスタンス生成
$pdo = new PDO('mysql:host=mysql;dbname=example_db;charset=utf8', 'example_user', 'example_user_pass');
// テーブルリスト取得
$result = $pdo->query('SHOW TABLES')->fetch(PDO::FETCH_ASSOC);
// テーブルリスト表示
echo "example_db table list<br>";
foreach ($result as $row) { echo "{$row}<br>"; }

Docker imageはDocker Hubより適当に拝借します。

# docker php-fpm構築
docker run -d --name php-fpm \
-v ~/example/src:/var/www/html \
--net=example_nw \
--ip=192.168.99.111 \
php:fpm
Unable to find image 'php:fpm' locally
fpm: Pulling from library/php
85b1f47fba49: Already exists
d8204bc92725: Pull complete
92fc16bb18e4: Pull complete
9859644f2c58: Pull complete
eed3518188ca: Pull complete
33c8f7623948: Pull complete
3211acc287de: Pull complete
83bc6e66e57e: Pull complete
c15398ec94ed: Pull complete
Digest: sha256:hashhogehoge
Status: Downloaded newer image for php:fpm
hashhogehoge

※ 使用するimageがホストにない場合は初期構築に時間を要します。

公式imageにデフォルトでmysqlと連携可能なimageが見つからなかったため、手動でインストールしておきます。

# pdo pdo_mysqlインストール、再起動
docker exec php-fpm docker-php-ext-install pdo pdo_mysql
docker restart php-fpm

Dockerでnginxを動かす

nginxの設定ファイルを作成しておきます。

# 設定ファイル用ディレクトリ生成
mkdir ~/example/conf
# nginx設定ファイルを生成
# ドメインは適宜設定しなおしてください
vi ~/example/conf/nginx.conf
server {
 listen 80;
 root /var/www/html;
 server_name example.com;
 index index.php;
 location / {
  try_files $uri $uri/ /index.php?$query_string;
 }
 location ~ \.php$ {
  fastcgi_pass php-fpm:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
  fastcgi_read_timeout 300;
  include fastcgi_params;
 }
 sendfile off;
}

今回はホストの80ポートをポートフォワードさせて、ホストに飛んできたアクセスをdocker nginxに向くように構築します。

# docker nginx構築コマンド
docker run -d --name nginx \
-p 80:80 \
-v ~/example/src:/var/www/html \
-v ~/example/conf/nginx.conf:/etc/nginx/conf.d/example.conf \
--net=example_nw \
--ip=192.168.99.110 \
nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
bc95e04b23c0: Pull complete
f473e7d72364: Pull complete
82cca2490d0d: Pull complete
Digest: hashhogehoge
Status: Downloaded newer image for nginx:stable
hashhogehoge

接続確認

設定したドメインにアクセス可能か、mysql接続が問題ないかを確認します。

ブラウザからアクセス確認した画像
成功!

まとめ

1コンテナ1プロセス…
ローカルmysqlをrdsに変更する場合など、参照先を変更して対象コンテナを削除するだけで、なかったことになるので便利は便利です。

ただ、公開サービスで「リソース監視したい!」と思うだけで
→ munin導入する…?
 → 1コンテナ複数プロセスになる…
  → 実行管理がデフォルトで出来ない…?
   → …etcetc
壁がすごい…

マイクロサービスの運用などには非常に有用ですが、適切に管理するためにはそれなりに知識が必要です。
また機会があればdockerfileやcompose、複数プロセス対応など記事にしたいと思います。

それでは。