OmniAICreator/Qiita-1.07M huggingface dataset:
PowerApps 1画面(1Screen)でデータ連続登録

PowerApps の1Screen（1画面）で、データを連続登録させたいと思ったコトはないでしょうか？そんな画面をどうやって構築するか、が本日のテーマです。

「飲食店などのお店をリスト化して保存する」というアプリで、実際の手順を説明します。

#データソース
SharePoint Onlie（以降、SPO）のカスタムリストを利用しました。

![List.PNG](https://qiita-image-store.s3.amazonaws.com/0/215892/85ff31e0-d576-bcda-b088-29d153fec2e4.png)

#アプリ画面
メニュー画面が別に用意してあり、そこから下記のような画面に遷移してくる、という2枚程度のアプリです。メニュー画面はボタンを設置して、OnSelect イベントに「NewForm(Form1);Navigate(下記画面,Fade)」だけなので割愛。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/215892/71b59703-0059-2cdc-e549-bd2fa7d0c0fc.png)

| 番号   | コントロール | 説明 |
|:-----------------|:------------------|:------------------|
| 1 | フォーム | 前述のListをデータソースに指定。[タイトル]のラベルを"店名"に変更しています。 |
| 2 | ボタン | フォームに登録された情報を登録。 |
| 3 | データテーブル | 前述のListをデータソースに指定。 |

#各コントロールの処理
ざっくり説明してしまうと、登録ボタンを押下した際にSubmitFromで確定し、フォームコントロールのOnSuccessでNewFormするだけですｗ

フォーム(①)の[OnSuccess]イベントに下記を設定。
```NewForm(フォーム)```

ボタン(②)の[OnSelect]イベントに下記を設定。
```SubmitForm(フォーム)```

【参考URL】EditForm 関数、NewForm 関数、SubmitForm 関数、ResetForm 関数、ViewForm 関数
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-form

#動作イメージ
フォームコントロールで作成した入力項目へ値をいれ、登録ボタンを押下すると、データテーブルが自動的に追加されていきます。（厳密にはデータソースのSPOカスタムリストへアイテム登録がされ、その追加されたアイテムをデータテーブルが表示している）

![メディア1.gif](https://qiita-image-store.s3.amazonaws.com/0/215892/1f18c9ef-24ba-3229-fd6c-20d55d94140b.gif)

#まとめ
- 画面（Screen）を遷移しなくても、連続登録が可能
- フォームコントロールがSubmitFormされ、登録成功した際に発動するイベントが[OnSuccess]
- 一覧表示はデータテーブルなど一覧表示系のコントロールにおまかせ

SPOのカスタムリストから自動生成するPowerApps アプリが、新規登録画面でデータ登録成功すると一覧画面に戻ってしまうようになっています。それをサンプルとしてアプリを作成していく方が多いので「1枚の画面で連続してデータを登録できない」と思ってしまうようです。当記事のようなアイディアで実現できますので、是非ご活用くださいませ。
SORACOMの特許をみてみよう

# はじめに
[SORACOM Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/soracom2)
の２０日目の記事です。

# [特許情報プラットフォーム｜J-PlatPat](https://www.j-platpat.inpit.go.jp/web/all/top/BTmTopPage)
にアクセス。

# **ソラコム**で検索
※SORACOMではできませんでした。

12件検索できると思います。

# **特許593849**をみてみる。
[知られざるLTEのネットワーク構成](http://www.atmarkit.co.jp/ait/articles/1001/13/news105_2.html)

ユーザーデータを取り扱うU-plane（User plane）
プロトコルスタック（プロトコル階層）
制御を行うC-plane（Control plane）

ここらへんのワードをざっと調べても知識がないため難解でした。（個人的に）

# **再表2016/199874**
ここの図５とかなんとなくわかるぐらい。

# まとめ
特許は難しいけど、知ってるものがあるので何となくわかるかなと思います。
インターネットの検索ではあまりひっかからないので
もし通信に詳しい方はご覧になるといいでしょう。
間違いだらけの機種判定／画面判定

最近仕事もプライベートも忙しい lovee です。お久しぶりです。

この記事は業務などでよく見かける機種判定／画面判定のアンチパターンについてお話ししたいと思います。

## 機種ごとの特殊処理を画面サイズ判定で行う

昔ゲーム業界にいた時に割とよく目にするやり方、言うまでも間違いです。

ゲームでは良く綺麗な画面を作るために複雑な演算が必要になりがちですが、古い機種でそのままやると間違いなくフレーム落ちするので、代わりにちょっと雑だけど早い演算が必要だったりします。そしてその切り替えを機種ごとで切り替えたりする必要があります。ところがそれを画面サイズで判断し、例えば 568 x 320 なら古い機種と判定して雑だけど早い演算に切り替えたりすることがあります。ところが iPhone SE が出た時、画面サイズこそ古いですがなかのスペックはかなり速く、普通に複雑な演算を使ってもいいです；逆に現在はまだ逆のパターンが出ていませんが、いつかアップルが急に「これこそ廉価版」とか言って画面サイズだけ最新のものにするけどスペックを古いものにしてもさほどおかしくないです。

機種ごとの処理を切り分ける際はきちんと `UIDevice.current.model` で切り分けましょう。画面判定はやめましょう。

## レイアウト処理の切り分けを機種判定で行う

これは上の逆のアンチパターンになります。

例えば、もし機種が iPhone X（Xs や XR 含む） なら Status Bar の高さを 44、それ以外なら 20 にしたレイアウトを行う、と言う処理をした時、今後 iPhone が更に違う機種出た時に全てハードコーディングするしかないので非常に不便です。

また、iPhone 専用アプリとして iPad で動作された時に 480 x 320 の画面サイズでレイアウトさせる、と言うのも非常にまずいです。これは仕様変更でいつでも表示サイズが変わってしまう可能性があります。実際今年の iOS 12 では仕様変更で 568 x 320 のサイズで動くようになりましたし。

レイアウト処理を切り分ける際はきちんと `UIScreen.main.bounds` で切り分けましょう。機種判定はやめましょう。

以上、簡単ですが、[iOS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ios) 21 日目の記事でした。
オープンソースカンファレンス(OSC)と自転車

この記事はオープンソースカンファレンス Advent Calendar 2018の21日目の記事です。

21日担当の木下と申します。

本日はOSCと自転車という、ちょっと変わった視点でオープンソースカンファレンス（OSC）を語ってみたいと思います。

# はじめに

さて「OSCはIT系のイベントなのに何故に自転車？」と思われた方も多いと思いますが
私自身が色々あって自転車と諸々関わることが多く、その傍らで最初期からOSCにも関わってきて、一見違うように見えて実は何となく共通点のようなものがあり今回このテーマで書いておこうと思った次第です。

さて、OSCと自転車の関わりについてまず多くの人が思いつくのは参加者の交通手段というのが多いかと思います。

実際、OSC Tokyoでは日本電子専門学校で行なっていた最初期から自転車で来場されている方は必ずおり、自転車も普通の自転車からロードバイクやMTB、折りたたみ自転車と多彩で、会場内でも自転車競技で目にするサイクルジャージとサイクルタイツというスタイルだったり自転車用のヘルメットを手に会場内を歩いている人は必ず目にします。

興味深いのは、懇親会に参加して自転車の話をすると「自転車に乗っている」という方が何人か来ていろいろと話を聞かせていただくのですが、それがオープンソースに対するこだわりと同じくらいの情熱で語っていただく場合があり、この情熱はどこからくるのかなと考えたところ次のような部分でオープンソースと自転車に共通点があるのではというところに行き着きました。

# 1. あるものは共通だが、自らの好きなようにカスタマイズが可能なところ

オープンソースソフトウェアはLinuxを始めDBやオフィススイート・サーバー多々ありますが、同じものを使っていても自分の使いたい用途に合わせて特化するために自由にカスタマイズが可能なのが魅力です。自転車も同じくフレームやパーツは共通ですが自分の使う用途やこだわり（乗り心地や走る場所等）によってほぼ自分専用といっていいものが出来てきます。ここはまず共通しているのではないでしょうか？

# 2. いろいろ育てていく楽しみがある

オープンソースソフトは作って公開しただけでも勿論素晴らしいことなのですが、そこにユーザーが加わり、またそのユーザー同士がコミュニティを形成してそれらを発展させていくというというところにも楽しみがあります。自転車もだいたい始めの状態で乗る人もいるかもしれませんが大体は自分が使いやすいように手を加えていく方が多いかと思います。そして自転車関係の知り合いが増えると他の人のを見てそれを自分の自転車にフィードバックしていく過程がオープンソースソフトやコミュニティのあり方によく似ているように思います。

# 3. 自分のペースで進められる

先の二つに相反するように思われるかもしれませんがこれも重要で、オープンソースのコミュニティはやもすると組織ともみなされることがありますが、一方でよほど深刻な事態でもない限りメンバーに何かを強制するということもなく自分のペースで活動ができます。自転車も競技指向の方もあれば、自分の健康のために自分のペースで走ることもできます。中には心拍や体の状態を計測しながら走るという方もおり、自転車という一見ITとは縁遠いと思われる分野ですが先に挙げた心拍もそうですがパワーメーター（自分がどれくらいの出力を出しているのかを計測する機器）やGPSナビゲーション機器など意外にIT機器が入ってきてたりします。（実はその部分にはGPSマップにオープンストリートマップが使われる場合がある程度で、あまりオープンソースは入ってきてはいないのですが・・・・）

# しかし一方で

他にもいろいろあるのですが、大きなものとしてはこの先に挙げた3つが挙げられるかと思います。しかし一方でそれらの特徴は、裏を返せばこのようなことになってしまうことにもなります。

- 何も知らない人は何を始めればいいのかわからない

- 自分は何をするのが続けていけるのかが分からない
- 自分にあったコミュニティはどこなのか。

というところで、余りにも多くのものがあるので初めての人は自分が最初に何を始めればいいのかが分からないというところも、共通した課題なのかと思います。

しかし、オープンソースコミュニティについてはOSCはその回答の一つなのではないかと思います。OSCは一つのオープンソースだけではなく、様々なコミュニティやそれを支援する企業が集う場所であり、OSCに来てそのようなコミュニティや企業にに関わることにより、自分が何を始めればいいのか最初の一歩を踏み出すキッカケを提供できる場所としてOSCの役目があるのではないかと思います。ここが自転車と大きく違う点であり自転車でOSCのようなものというと、メーカー主催のイベントというのが通例で様々なコミュニティが集うコミュニティ主体のイベントはあるかと思いますが「日本のオープンソースコミュニティでは東京で年2回、そして北海道・九州・四国・沖縄や主要都市等の各地域でほぼ月一で異なるコミュニティが一堂に介して開催しているイベントがある」というところは自転車とは大きく違うところではと思います。

# 最後に

さて長々と書いてきましたが、そろそろここで終わりとしたいと思います。OSCと自転車についてがテーマでしたが、内容としてはほぼ自分の独断と偏見でしかもOSCとあまり絡んでいない話も多いため、色々と異論・反論等はあるかと思いますが、その場合は私に直接話していただければ大変ありがたいです。

最後に自転車ということでこの有名な言葉で締めくくりたいと思います。最後まで読んでいただきありがとうございました <(_ _)>

"Computers are like a bicycle for our minds."  Steve Jobs
Bashでの時間比較（指定した時刻を過ぎているかどうか判定する）

# はじめに

現在の時刻と、指定した時刻を比較して、指定した時刻を過ぎているかどうかを、bashで判定するスクリプトです。

# Linuxでの時間比較

現在の時間をUNIX時間で表示（2018/12/20 22:38頃実行）

```console
$ date +%s
1545313137
```

--dateオプションで、指定した時間をUNIX時間で表示

```console
$ date --date "12/21 00:00" +%s
1545318000
```

この２つの値を比較する。

```bash

#!/bin/bash

now=`date +%s`
cmp=`date --date "12/21 00:00" +%s`

if [ $now -lt $cmp ]; then # -lt : '<'
        echo "まだ12/21日より前"
else
        echo "12/21を過ぎた"
fi
```

```console:実行結果
まだ12/21日より前
```

# 終わりに

bash勉強しよう……。
寿司ビール問題①　初心者→中級者へのSTEP20/25

#寿司ビール問題

##はじめに
今回ご紹介するのは寿司ビール問題についてです。

##寿司ビール問題とは
二つの絵文字、これが同じ文字扱いされてしまうこと。
つまり
🍣=🍺
別に他の絵文字でも同じです。
🐶=🐱
このように文字コードが原因でMySQLにて絵文字が同じ文字列扱いを受ける問題を寿司ビール問題と言います。（なんで寿司とビールになったかは不明）


##そもそも文字コードってなんだっけ
**「とりあえずutf-8使えばいんじゃね？」**
って考えてました。でもその`とりあえず`を払拭しなければ中級者にはなれないと思い、一度文字コードを振りかえってみる。

文字コード、調べていたら混乱したのでここではっきりさせておく。
まず**文字コードとは文字集合、文字符号化方式の二つの要素のことを指す。**（誰だこんな混乱するような言い回し作ったの）
**文字集合**
用いる文字の集合のこと、またその文字の対応する識別子のこと。Unicode,JIS X 0213などのこと。

**文字符号化方式**
上記の文字集合で得た識別子を符号化するときに用いる方式のこと。つまりエンコード。


[こちらの記事](https://blog.shibayu36.org/entry/2015/09/14/102100)がわかりやすいかも

んで、今回、🍣と🍺が同じ扱いを受ける原因なのは**charset**のutf8。
あ？**charset**?
またごちゃごちゃしそうですが、**charset**とは「文字集合」と「エンコード」の両方を含んだ意味あいです。
MySQLの**charset**をutf8にすると、その場合Unicodeによって対応づけられた🍣と🍺の識別子を符号化して保存しようとすると、１文字1~3バイトしか対応しておらず、4バイト文字である絵文字は上手く保存できず文字化けして結局同じ文字扱いになってしまうのである。




##対応
まずは**charset**を`utf8mb4`にする。
`utf8mb4`は1~4バイトなので絵文字もOK。MySQLの**charset**を`utf8mb4`にすればいいわけだが、ここで注意するのが、MySQLでは、サーバー、クライアント、サーバー/クライアント間、データベースごと、テーブルごと、カラムごとに指定できる。もちろん全て統一した方が良い。

次に**collation**の設定です。
**collation**とはどの文字とどの文字を同値と扱うかという設定で、例えば大文字小文字は区別するのか、
以下のようになっている。

|   collation  |      A:a |  🍣:🍺  |　は:ば、ぱ:ハ| や:ゃ　|
|:-------------|----------|---------|----------|--------:|
| general_ci        |       = |    =  |  ≠ |    ≠   |
| bin        |       ≠ |    ≠  |  ≠ |    ≠   |
| unicode_ci        |       = |    =  |  = |    =   |
| unicode_520_ci        |       = |   ≠ |  = |    =   |

...理想的なのがない...(MySQL8では日本語に対応したcollationがあるがそれも微妙)
結局ここでトレードオフ的な感じになってしまう。


##まとめ
そもそも絵文字を同値と扱わないで欲しいケースってなんなのだろう。気になる。
実は今回実装して試したかったのですが、RailsのDBをMySQLに移行しようとしたらハマってしまい。結局できませんでした...時間がないのでとりあえず概論的な感じです。明日までにできたら試してみます。

今回の内容はこちらのスライドがおすすめです。
→https://www.slideshare.net/tmtm/mysql-2017-76154739?ref=http://tmtms.hatenablog.com/entry/2017/05/21/myna_nagano


##参考にしたの

MySQLのencodingをutf8からutfmb4に変更して寿司ビール問題に対応する
https://techracho.bpsinc.jp/hachi8833/2016_08_25/25044#mysqlutf8mb4

[MySQL] 文字コード問題 -みんな大好き寿司ビール🍣🍺-
https://qiita.com/mamy1326/items/f516a3b7819a6a788dc3

ActiveRecordでデフォルトの照合順序を変更する
https://qiita.com/kamipo/items/d7863f0df24916005657
ベイブレードバーストの自作レイヤー開発用CADモデル作った

#ベイブレードバーストが熱い！
ベイブレードバースト，知ってますか？
私はYoutubeで[LEOTOY / レオトイ](https://www.youtube.com/user/leonanmt)さんの動画がたまたまオススメ動画として表示されたとことがきっかけでベイブレードバーストの面白さを知りました．しかもLEOTOYさんはなんと，自作ベイなるものを作って遊んでいたのです！
「なにそれ，超楽しそう！」
ということで，自作ベイ開発をした畔たまらなくなった私は，ベイスタジアムとベイを迷わず購入し，CADモデルの作成に取り組みました．

#CADモデル
![omote.png](https://qiita-image-store.s3.amazonaws.com/0/67153/b3d41b44-e249-dd37-03a4-c0ad5318fb39.png)
![ura.png](https://qiita-image-store.s3.amazonaws.com/0/67153/7ca68efb-3a45-46e1-04df-e306ee4ac096.png)

#印刷したもの
![omote_real.jpg](https://qiita-image-store.s3.amazonaws.com/0/67153/7d1074cb-01dc-287b-32f2-c4eede0055e0.jpeg)
![ura_real.jpg](https://qiita-image-store.s3.amazonaws.com/0/67153/cab0f9bd-874a-f6b0-506b-f99f140afa09.jpeg)
![soutyaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/67153/9c5301f3-ace3-28c5-7199-1e7bcca2e02f.jpeg)

#配布
０からやんのはだるいぜっていう皆様のために，ベースとなるCADモデル（Fusion360向け）を配布いたします．
皆様も自作ベイでゴーシュ〜！しましょう！
[Download: DropBoxリンク](https://www.dropbox.com/s/b42zj7jlst7fwei/layer_base.f3d?dl=0)

#印刷のコツ
印刷に使うフィラメントはABSがいいです．PLAだとすぐ壊れます．しかし，ABSは反りやすいので，モデルを加工する際は印刷のことまで考慮する必要があります．
Markdownスクリプト言語インタプリタ actual-code

erukitiです。ごきげんよう。

[個人開発 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/private-development)の20日目の記事です。もうほぼ21日ですが、まだギリギリ20日です！！！！

先日 [Markdown を実行できるツールを作ってみた - Qiita](https://qiita.com/erukiti/items/f590eba4b91ef7960a37) という記事を書いたところですが、それから色々とバージョンアップをしました。

## 何をするものか？

<img width="510" alt="hello-world.png" src="https://qiita-image-store.s3.amazonaws.com/0/3134/353f5a64-2fc0-ab8e-5c1e-c595d558b885.png">

Markdownのコードブロックをそのままそれぞれの言語として動かすものです。たとえば、JavaScrpitのコードブロックであれば、JavaScript Sandbox （Node.js の VM API）を使って動かします。

現時点ではJavaScript/TypeScript/shell scriptが動きます。

ここまでは、12/10の記事の時点ですでに実装されていたものです。

そのあとGUIモードを追加しました。

デモ動画があるんですが、Qiitaにはそのままだと貼り付けられないようなので https://github.com/erukiti/actual-code の先頭にあるアニメーションGIFをご覧ください。Markdownのコードブロックに記述したコードがリアルタイム動作しています。

## モチベーション

大きくわけて2つのモチベーションがあります。

### Jupyterの記法が Not for me だったこと

Jupyter Notebookはいいツールだと思いますが、ライン指向だったり、マジックコメントだったり、そういうやり方が好みでは無いこと、僕はVSCodeで開発がしたいことなどがあります。

VSCodeで Markdown を書いて、それが実行出来る方が望ましいと考えこと。これが1つめのモチベーションです。

### 技術書や技術記事で「実際に動作させたい」

技術書や技術記事を書くときにサンプルコードの取り扱いは得てして面倒なものです。いったん動かしたコードをコピペで原稿のファイルに書く、あるいはプリプロセッサで取り込む。これらはどうしても面倒だし事故が起こりやすいものです。

そこで、原稿に書かれたコードがそのまま動かしたかったこと、これが2つめのモチベーションです。

現代によみがえる文芸的プログラミングのようなものではあります。

## 過程

元々考えていたこととしては、アプリとかのプロジェクトディレクトリに、記事用のMarkdownファイルを置いて、Markdownにコードの断片を貼り付けることと、それをアップロードできる仕組みを考えていました。

ただ、その考え方だとピンと来ない部分があったんですが、12/10の朝目覚めた時に、今回のアイデアである「Markdownのコードブロックをスクリプトと見なして走らせたらええやん！」というのを思いついたのです。

## 目指しているもの

今のところまだ始めたばかりでバギーな挙動も多いことと、言語対応がJS/TS/shだけしかできていないので、任意の拡張が出来る仕組みを作るなどを考えています。

それ以外の部分でいうと、新しいブログサービスの立ち上げと、電子書籍を進化させたいと思っています。

### 新しいブログサービス

actual-code のコマンド一発でアップロードできるサービスを作りたいと思っています。出来れば年内をめどに。

### 電子書籍を進化させる

既存の電子書籍はどれも不便です。せいぜい検索できたり、ペンでマーキング出来たりする程度のしょうもない機能しか持っていません。

どうせ電子書籍なのだから「コードを実際に走らせられる」電子書籍が理想じゃないですか？
ArrowでTryCatchFinally的なことがしたい！！！！

Kotlin Advent Calendar 17日目の代打です。

Bracketとかが良いんじゃね？！というお話です。

そもそもArrowってなんぞや…という人は、[別のAdventCalenderでそれとなく書いている](https://adventar.org/calendars/3448)のでそちらをどうぞ。


https://github.com/arrow-kt/arrow/blob/38576f5ccee2b966eecf8ed36ddb5f4474190072/modules/effects/arrow-effects/src/main/kotlin/arrow/effects/typeclasses/Bracket.kt#L44-L74

サンプルコード書こうかな…って思ったんですけど、見ればわかるのでリンク貼って終わります（おい


なお、現行Versionの0.8.1にBracketはまだありません！！！！
[#1043がMergeされているので次のリリースに期待しましょう](https://github.com/arrow-kt/arrow/pull/1043)


## 元ネタ

[KotlinSlackの#arrowのここ](https://kotlinlang.slack.com/archives/C5UPMM0A0/p1545146827143100)

## reference

https://github.com/arrow-kt/arrow/pull/1043
https://arrow-kt.io/docs/apidocs/arrow-effects/arrow.effects/-i-o/bracket-case.html
(ドキュメント側はまだだけどそのうちできると思うのでリンクだけ)

## おまけ

この記事公開後10分で、コミッターのJorge Castillo さんからリプライ来ましたので、試したい人は0.8.2のSnapshotを試そう！

https://twitter.com/JorgeCastilloPr/status/1075748447096135680
PHPで正規表現を使って特定の配列を抜き出す

## やりたいこと

たとえば

```php
$array = ['apple1','apple2','orange1','orange2',];
```
という配列から

```php
 $apple = ['apple1','apple2'];
```
という配列を抜き取りたい。(例が単純すぎてすいません)

## preg_grep()について

そんなときに使える関数に [preg_grep](http://php.net/manual/en/function.preg-grep.php) があります。

### 文法
```php
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
```
- $pattern = 正規表現のパターン
- $input = 検索対象となる配列
- $flags = `PREG_GREP_INVERT`と入れると正規表現にマッチ__しない__要素が返されます

### 返り値
正規表現とマッチする値を持つ要素で構成された配列を返します。

## 正規表現にマッチする配列の「値」を抜き出す場合

```php
$array = ['apple1','apple2','orange1','orange2',];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
```
```
//結果
array(2) {
  [0]=>
  string(6) "apple1"
  [1]=>
  string(6) "apple2"
}
```
`!apple[0-9]!` の両脇の `!` は[「デリミタ」](http://php.net/manual/ja/regexp.reference.delimiters.php)です。
`!`以外にも`英数字、バックスラッシュ、空白文字以外の任意の文字` なら何でもいいみたいですが、入れないとエラーが出ます。

連想配列で使うとこんな感じです。

```php
$array = [
    'A' => 'apple1',
    'B' => 'apple2',
    'C' => 'orange1',
    'D' => 'orange2',
    ];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
```
```
//結果
array(2) {
  ["A"]=>
  string(6) "apple1"
  ["B"]=>
  string(6) "apple2"
}
```

## 正規表現にマッチする配列の「鍵」を抜き出す場合
`preg_grep（）`はあくまで「値」を検索する関数で、「鍵」を検索するオプションはありません。無理やり使うとこうなります。

```php

$array = [
    'apple1' => 'A',
    'apple2' => 'B',
    'orange1' => 'C',
    'orange2' => 'D',
    ];
$apple = preg_grep('!apple[0-9]!',$array);
var_dump($apple);
```
```
//結果
array(0) {
}

```

いろいろとやり方があると思いますが、今回は [array_flip()](http://php.net/manual/en/function.array-flip.php) を使って鍵と値の位置を逆転させる　→　`preg_grep()`する → もう一回 `array_flip()` でもとに戻すという方法を紹介します。

```php
$array = [
    'apple1' => 'A',
    'apple2' => 'B',
    'orange1' => 'C',
    'orange2' => 'D',
    ];
$flipped_array = array_flip($array);
$flipped_apple = preg_grep('!apple[0-9]!',$flipped_array);
$apple = array_flip($flipped_apple);
var_dump($apple);
```
```
//結果
array(2) {
  ["apple1"]=>
  string(1) "A"
  ["apple2"]=>
  string(1) "B"
}
```
一行バージョン

```php
$array = [
    'apple1' => 'A',
    'apple2' => 'B',
    'orange1' => 'C',
    'orange2' => 'D',
    ];
$apple = array_flip(preg_grep('!apple[0-9]!',array_flip($array)));
var_dump($apple);
```
```
//結果
array(2) {
  ["apple1"]=>
  string(1) "A"
  ["apple2"]=>
  string(1) "B"
}
```
## 使った関数
- [preg_grep](http://php.net/manual/en/function.preg-grep.php)
- [array_flip()](http://php.net/manual/en/function.array-flip.php)
ProSurfaceSnap 完全に理解した

![7bb71f75-6514-4ff2-87bb-3832e245a13d.jpg](https://qiita-image-store.s3.amazonaws.com/0/6047/64be82f3-ceef-0dd3-376c-129d0fb3e738.jpeg)

https://assetstore.unity.com/packages/tools/level-design/prosurfacesnap-72229

3Dシーンで、いい感じにオブジェクトを配置しやすくするツールないかと探してて&試して、いい感じに完全に理解したので、メモっておく。

### 初期化

Assetをインポート => 使いたいシーンで Tools => ProSurfaceSnap => Initialize

### 操作方法

Sceme Viewでの利用になる。

- Snapさせたいオブジェクトの属性をSettingPanelで事前に設定（TerrianかMeshいれたらいいともう、Layer分けしてるならそれも適当に指定）
- オブジェクトを普通に左クリックで選択状態にする
- "C"キーを押すと、SnapSurfaceProが有効になった状態となる（もういっかいCで解除。ちょいちょい判定ガバなので、適宜リトライが必要なことも）

### 有効状態（ProSurfaceSnap Mode）での基本操作

- マウス移動でSurfaceSnapした状態で移動
- Shift押しながらマウス移動で回転
- Ctrl押しながらマウス移動で拡大縮小
- Q押しながらマウス移動で上下移動（移動後C解除しないと、すぐSnapされるので注意）

> Cキーを押したときの座標がPivotになり一部操作に関係してくるので、注意

### MISC

3DObjectはもちろん、2D Spriteに対しても有効なので、AnyPortraitやSpriteStudioのアバターを3Dシーンに配置するときにも使える！

### そもそも標準のSnapとか

- Commandキーを押しながら選択=>移動で、グリッド単位にスナップ
- Vキー押しながら選択=>移動で、隣接頂点にスナップ

というのが標準の挙動としてある。タイリングとかは、これで。
自作ISUCON問題の作り方

## はじめに

ISUCONでは決勝に出たことがないけど、ISUCONが好きな [@showwin](https://twitter.com/showwin) です。
ISUCONは5から出場し始めて、毎回出場しているので合計4回参加しています。特に今年のISUCON8は社内の優秀なメンバーと組めたので、決勝行けるだろうと思っていたのですが、残念ながらまたしても予選落ちでした。。
来年は絶対決勝行きます…！！

ぼくはISUCONが好きすぎて、ISHOCONという個人ISUCON問題を作成しています。

* [ISHOCON1](https://github.com/showwin/ishocon1)
* [ISHOCON2](https://github.com/showwin/ishocon2)

ISHOCONのコンセプトは "一人でできる簡単なISUCON" で、ISUCON出場する前に練習したい。でもISUCONだとボリューミーなのでもうちょっと気軽にISUCON練習したい！という人向けに問題を作成しています。
[去年](https://scouty.connpass.com/event/65322/)、[今年](https://scouty.connpass.com/event/92185/)とISHOCON問題を皆で解いてISUCONの素振りをするというイベントをやっているのですが、今年も30人弱が参加していただいて、一人でゆるく参加できるISUCONイベントは意外と需要があるのでは！？と思っているところです。
(ISUCON8も一人参加枠はすぐに埋まっていましたからね…)

と、前置きが長くなってしまったのですが、個人ISUCON問題を作る上での流れとTipsを紹介したいと思います。


## 1. 問題のコンセプト決め

個人ISUCON問題に興味を持ってもらうには、コンセプトの面白さが大事なんじゃないかな？と思って、ぼくは結構力を入れて考えています。
ISUCON1を作成した当時2015年は中国人観光客が日本にガンガン来始めた年で、"爆買い"という言葉が流行っていました。中国の方が日本のECサイトで爆買いを始めても大丈夫なように、ISUしましょう！という思いを込めて問題を作成しました。

ISUCON2では、まだ日本では実現していませんが、そのうち実現するだろうと思っているネット選挙をテーマにしたものでした。将来ネット選挙のプラットフォームを自分が実装することになった時に、高速化することがどれほど大変なんだろう…と気づける**かも**知れませんね。笑

実は [ISHOCON3](https://github.com/showwin/ishocon3) も作りかけていて、「今後の高齢化社会で遺言書のバージョン管理が必要になるが、バックエンドのログ管理部分をgitで実装してしまってスケールしない…」というクソ実装にする予定だったのですが、作り始めたら意外とうまく問題が作れなくて一旦開発が止まってしまっています…w

ここのコンセプトを決める段階で、ある程度時間を書けないと解消できないような一番大きなボトルネックのアイデアを持っておくと良いと思います。細かなボトルネックはアプリケーションを実装し始めてからでも仕込めるのですが、勝負を決める大きめのギミックはあとから決めるとうまくできなかったり、面白いギミックが作れなくなりがちです。

## 2. アプリケーションを実装して、ボトルネックを作る
コンセプトが決まったら、アプリケーションの実装に入ります。
ISHOCONの場合は1人で取り組んで8時間でやりたいことの8割ぐらいができる分量を目指しているので、(ページ数が全てではありませんが)2~3ページぐらいの軽量なアプリケーションに収まるように意識して仕様を決めながら実装をしていきます。

その過程で、この辺にN+1を入れていくかーとか、ネットワークがボトルネックになるようにこの辺いじっておくか〜とか考えながら実装していきます。
いきなり100%完成した問題を作ろうとするより、80%ぐらいの出来のもので止めておくのがよいです。ベンチマーカーができて実際に問題を解いてみるといろいろと調整したくなるのが世の常なので…

## 3. ベンチマーカーの実装
並列でリクエストをガンガン投げられるベンチマーカーを作成していきます。
個人的には goroutine を使ってGoで書くのが一番楽じゃないかなと思っています。
リクエストパターンはいくつか典型的なユーザ行動パターンを作って、そのパターンを繰り返し実行していくのがよくある方針だと思います。
レスポンスのバリデーションの厳密さや、リクエスト負荷増加の手動/自動など、手を抜こうと思えば抜ける部分がベンチマーカーには多くあります。サッと自作ISUCON問題を作りたい場合にはここで手を抜くのが良いと思います。
(本番のISUCONではそうはいかないと思いますが…)

ある特徴的なリクエストパターンに気づけるとスコアアップにつながる。みたいな要素があると面白いかもしれないですね。

## 4. アプリケーションチューニングとスコア調整
このフェーズは意外と時間が取られます。
特にスコア調整は難しく、手順1で作った大きめのギミックが分かるとドンと点数があがるようなスコアリングにしたいな〜と思うのですが、地道な改善を続けていっても結構な点数が出てしまったりと、いきなりうまくいくことは少ないです。

ISHOCONなんかは入門者向けに作っていることもあり、DBのインデックスを貼ったり、だれでも気づくようなN+1を修正すると初期の10倍ぐらいのスコアになって良い気分になれるようなスコアリング設計になっています。笑
UXに関わってくる部分なので、どうしたら飽きずに8時間遊んでもらえるか。8時間終わったあとも、あ〜もうちょっと触りたい！！と思って遊び続けてもらえるか、といったところを考えながらチューニングしていきます。ゲームづくりの感覚に近いのかも知れませんね。

チューニングをしすぎると問題に慣れてしまって、初見でこの問題やるとどれぐらい時間がかかるのだろう🤔と分からなくなってくると思います。
そのような時には1,2ヶ月ぐらい放置すると、何を作ったか忘れて新鮮な気持ちで問題に取り組めるので一回クールダウンするのも大事です！

## 5. イベントを開催して皆に解いてもらおう
せっかく問題を作ったのに誰も解いてくれないのでは面白くありません。ISUCONが近くなって皆のISUCON意欲が高まってきた頃に同じチームメンバーの人に解いてもらうとか、僕のようにイベントを開催するとかすると多くの人に遊んでもらえるのかなと思います。

その際にはドキュメントの整備も必要になってきます。テストユーザーにこの情報で過不足がないか確認してもらいましょう。(作った本人はドキュメントがなくても理解できていますからね。。)

## 最後に

最初は自己満足でつくっていた自作ISUCONの問題でしたが、全然知らない人がISUCON勉強会イベントで使ってくれたり、他社の社内ISUCONでも使われたり、他言語実装のPullReqが飛んできたりと、思いもよらぬ広がりをみせています。
皆さんも自作ISUCON問題を作ってみると意外と面白いつながりができるかもしれません、ぜひ一度作ってみてください！
RxJavaとCoroutineが混じったときのRetrofitで困ったあなたへ

Kotlin Advent Calendar 12日目の代打です。

最近Coroutineの話題が多いですね。
でもRxJavaもよく使いますね。
さてそうなってくると、「ここはCoroutineとして使いたい…あっちはRxのStreamとして使いたい…」というのがあると思います。

## 個人的な結論

ArrowのRetrofitAdapter使いましょう。

Arrowってなんやねん、という人は[別のAdventCalendarにいくつか記事を投稿している](https://adventar.org/calendars/3448)ので、そちらを参考にしてください。

## 雑サンプルコード

```kotlin
// コンパイルすら通してないから、もしかしたらミスっているかもだが、雰囲気で察してくれ

interface Service {
  @GET("/path/to/api")
  fun get() : CallK<MyResponse>
}

// 中略

val res = retrofit.create(Service::class.java).get()

val useDeferred: DeferredK<Response<MyResponse>> = res.async(DeferredK.async()).fix()

val useSingleK: SingleK<Response<MyResponse>> = res.async(SingleK.async()).fix()

```

DeferredKはDeferredをDelegateしているので、そのままDeferredとして使えます。
SingleKはそうはなっていないので、他のStreamと混ぜたり、Subscribeする必要があるときは`useSingleK.single`のように利用すればOKです。

これで、RxとCoroutineがいりじまった場合にRetrofitの定義に困ることはありませんね、やったぜ！


## reference 

https://arrow-kt.io/docs/integrations/retrofit/
https://github.com/arrow-kt/arrow/tree/0.8.1/modules/integrations/arrow-integrations-retrofit-adapter
UIGestureRecognizer

タップ動作への理解を深めるために作成。

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/44258b16-8a65-1728-82a0-bd8cb77ece72.gif">

#ソースコード
タップ動作はカウントされ
ロングタップは「LongPress」となるよう処理。

```swift:ViewController.swift

import UIKit

//タップを認識するためのメソッド
class ViewController: UIViewController,UIGestureRecognizerDelegate {
    
    
    @IBOutlet var label: UILabel!
    
    
    var count = 0
    

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //タップを認識するためのインスタンスを生成
        let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapped(_:)))
        
        //デリゲートをセット
        tapGesture.delegate = self
        
        self.view.addGestureRecognizer(tapGesture) //viewにインスタンスを追加
        
        //ロングプレス
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:)))
        
        longPressGesture.delegate = self
        //Viewに追加
        self.view.addGestureRecognizer(longPressGesture)
    }
    
    //tapイベント
    @objc func tapped(_ sender: UITapGestureRecognizer) {
        //送信者の状態が　タッチして指を離した時に呼ばれる
        if sender.state == .ended {
            label.text = "Tapped!\(count)"
            count += 1
        }
        else if sender.state == .began {
            print("Tap began")
        }
    }
    
    //longpressイベント
    @objc func longPress(_ sender: UILongPressGestureRecognizer) {
        //送信者の状態が　タッチ開始時にlongが認識される
        if sender.state == .began{
            //開始は認知される
            print("Long Press began")
        }
        else if sender.state == .ended {
            label.text = "Long Pressd !"
        }
    }
}
```
#ロングプレス
`UILongPressGestureRecognizer`

#タップの認識
`UITapGestureRecognizer`
SoundEffect

サウンドへの理解を深めるために作成。

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/71c7033f-8f7c-7f06-82c8-371ec2b8d7c3.gif">




#ソースコード
画像の特定の箇所をクリックすると効果音が流れるよう処理を行う。

```swift:ViewController.swift
import UIKit
import AVFoundation //効果音を流すときに使う

class ViewController: UIViewController {
    var audioPlayerInstamce : AVAudioPlayer! = nil //再生するサウンドのインスタンス
    var image1 = UIImage(named:"Image")!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //サウンドファイルのパスを生成（今回のファイルに導入した画像ファイルを書く）
        
        image2.image = image1 //imageをviewに追加
        let soundFilePath = Bundle.main.path(forResource: "cat1a", ofType: "mp3")! //プロジェクト内のファイルを取得する
        let sound:URL = URL(fileURLWithPath: soundFilePath)
        //AVAoudioPlayerのインスタンスを作成、ファイルの読み込み
        do {
            audioPlayerInstamce = try AVAudioPlayer(contentsOf: sound, fileTypeHint: nil)
        } catch {
            print("エラー")
        }
        
        //生成準備
        audioPlayerInstamce.prepareToPlay()
    }
    
    @IBAction func sound(_ sender: UIButton) {
        //連打したときに音がなるようにする
        audioPlayerInstamce.currentTime = 0 //再生箇所を頭にする
        audioPlayerInstamce.play() //再生する
    }
    
    @IBOutlet weak var image2: UIImageView!

}
文系非エンジニアがPython触ってみた(基礎演算編)

この記事は [ハンズラボAdvent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 
 21日目の記事です。

ハンズラボの非エンジニア、マーケ&採用担当の @yuka_jyotei です。
この記事では、「文系非エンジニア（プログラミング経験なし）が、Pythonをやってみた」内容を紹介します。
超、基礎演算編です。

###事前にやったこと

・Pythonインストール
・ターミナル起動

###Pythonのバージョン確認

` python -V` 
↓
` Python 2.7.10` 

とりあえず

` print('Hello World!')` 
↓
Hello World!

無事できました。

###変数の定義
変数を定義する。
”変数名=値”
これだけでできました。

` x=1` 
これだけで、xと打つと「1」と出てきます。
とてもわかりやすいです。

` y=2` 
として
` x,y` 
と入れると
` 1,2` 
と出てきました。

###四則演算
| 演算子 | 演算の内容 | 演算の例 |
|:--|:--|:--|
| * | 乗算(掛け算) | 3 * 4 |
| / | 除算(割り算) | 9 / 3 |
| + | 加算(足し算) | 2 + 5 |
| - | 減算(引き算) | 6 - 1 |

Excelと同じ感じですね。

###演算、もう少し複雑なもの

| 演算子 | 演算の内容 | 演算の例 |
|:--|:--|:--|
| // | 除算(割り算) | 9.0 // 3 = 3.0 |
| % | 余剰（割り算の余り） | 7 % 2 |
| ** | べき乗 | 5 ** 2 |

「//」 の演算子の場合は、
` 13 // 3` 
= 4
となり、
` 13.0 // 3` 
= 4.0
となります。小数点以下は切り捨てられています。

なお、「 / 」を使った場合
` 13.0 / 3` 
= 4.333333333333333
となりました。


「%」の余剰は、左側の数字を、右側の数字で割った余りが表記されます。
` 7 % 2` 
= 1
7÷2=3余り1です。

「 ** 」のべき乗は、左側の数字を、右側の数字で累乗したものが表記されます。
` 6  **  2` 
= 36
6の2乗は、36です。


基礎中の基礎ですが、ここで力尽きたので、また続きは次回やります。
ありがとうございました。


###参考にさせていただいた記事です（ありがとうございました）

【Python入門】Pythonの基本操作 – Python初心者勉強記001
http://bb-biz.com/python-001/

【Python入門】Pythonの基本操作 – Python初心者勉強記002
http://bb-biz.com/python-002/

四則演算 - 数値 - Python入門 - Java Drive
https://www.javadrive.jp/python/num/index2.html


[ハンズラボAdvent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) の22日目は、 [@zizi4n5](https://qiita.com/zizi4n5)さんです！
SlidePage

UIpageViewで画面遷移する方法への理解を深めるために作成。

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/9566fced-98ac-c5eb-67fc-5b2cdc729476.gif">
#ソースコード

```swift:ViewController.swift

import UIKit

class PageViewController: UIPageViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //最初のViewControllerを設定　direction=方向　進む
        self.setViewControllers([getFirst()], direction: .forward, animated: true, completion: nil)
        self.dataSource = self

        // Do any additional setup after loading the view.
    }
    
     func getFirst() -> FirstViewController {
        //遷移先のID名を書く
        return storyboard!.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
    }
    
    func getSecond() -> SecondViewController {
        return storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
    }
    
    func getThird() -> ThirdViewController {
        return storyboard!.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController
    }
}

extension PageViewController: UIPageViewControllerDataSource {
    // 逆方向にページ送りした時に呼ばれるメソッド
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        if viewController.isKind(of: ThirdViewController.self) {
            //3から２
            return getSecond()
        }else if viewController.isKind(of: SecondViewController.self) {
            //2から１
            return getFirst()
        }else{
            return nil
        }
    }
    // 順方向にページ送りした時に呼ばれるメソッド
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        
        if viewController.isKind(of: FirstViewController.self) {
            return getSecond()
        }else if viewController.isKind(of: SecondViewController.self) {
            return getThird()
        }else{
            return nil
        }
    }
}
```
#ソースコード

```swift:FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
```
#ソースコード

```swift:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
```
#ソースコード

```swift:ThirdViewController.swift
import UIKit

class ThirdViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
```
【Docker】Windows10homeでDocker tools使えば出来るの知ってたけど以前出来なかったので再チャレンジ

##ことの顛末
2017年に一度Dockerで遊ぼうと思ったのですが、まずvagrantがわけわからない状態になってしまい諦めていました。
この度部下から質問を受け、参考URLもあったので再チャレンジしてみました。
homeにはHyper-vがないからと諦めていましたが、出来ました！

##PC環境
lenovo Y700（ゲーミングPC）
Windows10 home


##手順
1）Docker Toolsをダウンロードしに行きます。
https://docs.docker.com/toolbox/overview/
ページ右側のやや下にある
Toolbox for Windows
をクリックして、exeファイルをダウンロードします。

ダウンロードできたら、インストーラを起動してインストールします。
最初にhelpなんとかってチェックボックスがあったのですが、チェックは付けませんでした。
git for windowsやvirtualboxも一緒にダウンロードするか聞かれますが、自分はvirtualboxだけ既に持っていたのでそれ以外をインストールしました。


2）virtualboxを起動します。
起動するだけで、特に何もしなくて大丈夫です。


3）Docker Quickstart Terminalを起動します。
初期設定があるので放置しておきます。その間に4をしましょう。


4）アプリケーションの許可
windowsマーク左クリック→設定アイコン→更新とセキュリティ→ファイアウォールとネットワーク保護→ファイアウォールによるアプリケーションの許可→許可されたアプリが開くので設定の変更をクリックしてVirtualBox Managerのプライベートにチェックをつけます。


5）Dockerが動かせる状態になりましたら、以下コマンドを入力してnginxのコンテナを引っ張ってきます。

```
docker pull nginx
docker run -d --name nginx-container -p 8080:80 nginx
```

ポートは慣例では8000番だと思いますが、他との重複を避けるため8080にしています。8080も慣例なんですけどねｗ
基本的には4桁番以降、5桁ならほぼ間違いなく重複しないと思います。
5432番だとポスグレ、3306番だとmysqlと被りそうですね。


6）Chrome辺りを開いて192.168.99.100:8080へアクセス
![dockerをwin10homeで.png](https://qiita-image-store.s3.amazonaws.com/0/193056/f2de9cfc-c93a-1923-f298-045adcd96b6b.png)
こうなりませんか？


##おわりに
自分はさくらvps契約しているのでLinuxでも出来るのですが、色々な現場があるのでその環境に合わせた環境構築が必要になります。
あとはwindowsがあれば気軽にDockerを試せるというのも強みなのかなと思っています。
自分もこれでDockerコンテナを作っていきたいですね！
ProgressBar

UIProgressViewへの理解を深めるために作成。

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/8e083f89-9fff-1ad2-8c5b-599e7d4fbc78.gif">

#ソースコード
ゲージが溜まるとラベルがcompleteになる
リセットボタンを押すと元に戻る

```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    var label: UILabel! //ラベルのインスタンスを生成
    var progressView: UIProgressView! //プログレスビューのインスタンスを生成
    var progress: Float = 0.0 // 時間計測用の変数　//起動してからMaxになるまでの時間
    var timer: Timer! //タイマー
    var restartButton: UIButton! //ボタンのインスタンス生成
    
    @objc func restart(_ s:UIButton) {
        
        timer.invalidate() //タイマーを破棄する
        progress = 0
        label.text = "prease wait・・・"
        //タイマーを作る 0.01秒ごとにtimerUpdate)()を呼び出す
        timer = Timer.scheduledTimer(timeInterval: 0.01,target: self,selector: #selector(ViewController.timerUpdate),userInfo: nil,repeats: true)
        // リセット時にアニメーションしたくないときはコメントアウトを解除
        //progressView.setProgress(progress, animated: false)
    }
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //ラベル UISCrrenでサイズを取得する
        label = UILabel(frame: CGRect(x: 0, y: 0, width:UIScreen.main.bounds.width - 50, height: 20))
        var labelCenterPos = view.center
        labelCenterPos.y = labelCenterPos.y + 30
        label.center = labelCenterPos
        label.text  = "prease wait・・・"
        //テキストの位置
        label.textAlignment = .center
        view.addSubview(label)
        
        //プログレスバー
        progressView = UIProgressView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width - 60, height: 20))
        progressView.center = view.center
        //スケール行列を生成
        progressView.transform = CGAffineTransform(scaleX: 1.0, y: 6.0)
        // 色合い
        progressView.progressTintColor = .blue
        // アニメーションを付ける.
        progressView.setProgress(progress, animated: true)
        view.addSubview(progressView)//ビューに表示
        
        //再開ボタン
        restartButton = UIButton(frame: CGRect(x: 0, y: 0, width: 80, height: 40))
        var buttonCenterPos = view.center
        buttonCenterPos.y = UIScreen.main.bounds.height - 100
        restartButton.center = buttonCenterPos
        restartButton.setTitle("restart", for: .normal) //ボタンのタイトル
        restartButton.setTitleColor(.blue, for: .normal)//通常時の色
        restartButton.setTitleColor(.red, for: .highlighted)//選択時の色
        restartButton.addTarget(self, action: #selector(ViewController.restart(_:)), for: .touchUpInside) ////ボタンをタップした際に反応するメソッドを用意
        view.addSubview(restartButton) //ビューに表示
        
        //タイマー
        timer = Timer.scheduledTimer(timeInterval: 0.01,target:self,selector:#selector(ViewController.timerUpdate), userInfo: nil, repeats: true)
        
    }
    
    @objc func timerUpdate() {
        progress = progress + 0.001
        if progress < 1.1 {
            progressView.setProgress(progress, animated: true)
        }else{
            timer.invalidate() //タイマーを破棄する
            label.text = "Complete!"
        }
    }


}
インサイト発想で作るプロダクト

#はじめに

こんにちは！
Life is Tech ! Advent Calender もついに20投稿目を迎えましたね:rocket:
Webやデザイン、映像のメンターをしてますえんぽうです☺️:thought_balloon:

大学でUXデザインを専攻をしており、デザインと企画をすることが三度の飯より好きです:rice: 普段は広告系の会社でアルバイトをしていて、週末はアイデアコンペに出たりしています！

> ▶︎ここ半年で作った企画達、ボツ案も含めれば半年で150企画は作ったんじゃないでしょうか…
![advent2.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/22401e04-19c0-c09e-29f5-1a1297246837.jpeg)


Qiita初投稿で緊張していますが、この記事がこれから開発していく際に参考になれば幸いです！わっしょい！

#この記事で伝えていきたいこと

**アプリケーションやサービス、Webサイトを作っていく際に最初に考える部分について。**

一般的に、オリジナル作品を作るとなると以下のようなフローが想定されると思います😶Qiitaを参照すると開発からリリースまでのフローに関する技術系の記事が多いと思うんですが、今回言及するのは企画の部分とリリースのその後のユーザー体験を想像しようという話です。

![advent1.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/a405719c-1a69-8e40-e9a3-8b7efbdd40bb.jpeg)



##なにつくる？

**みなさんは新しい作品を作る時、何から発想しますか？**

純粋に作りたいものがあったり、
使ってみたいコードがあるからそれを使えるアイデアを考えたり。

**じゃあ作りたいものが見つからない人や中高生にどうアドバイスしますか？**

好きなものから発想してみよう！って言いますか？

正直、ある程度作りたい物を既に作ってしまっていたり、思いつかない時ってあると思うんです。そんな時にお勧めしたいのが、共感してもらえるもの（＝他人に使ってもらえるもの）を作ろうっていう考え方です。

**[ 自分が使いたい物 ]**  　ではなく　**[ 他人が使いたい物 ]**　をつくる

というのも、開発のモチベーションを維持する方法の１つとして友達や他人に使ってもらうって大きいと思うんです。想像してみてください、中学のクラスメートのiPhoneに自分が作った単語帳のアプリが入ってたら超嬉しいし、次も頑張ろうって思えるでしょ？

**[ リリースすることを目標にするだけじゃなく、リリース後はどうありたいか？という視点を持ってみる ]**


でも自分以外の人がどんなものが欲しいかって考えるのすっごく難しいですよね、、、、！:thermometer_face:

**それを解決するのがインサイト発想です！**


![advent.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/aa8a21e5-1b61-e5d4-79f3-fab7bb3a328a.jpeg)


#インサイト発想とは？

インサイト発想とは、もともとは広告業界でコピーやコンセプトを作る時に使われている考え方です。

> インサイト
　：　洞察、眼識、識見、見抜く力

「表面的な事象から、その奥底にある本質を見抜く（＝洞察する）」という発想法。


![advent3.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/8b485b52-1b06-92e4-c9ad-4f187fcdaffa.jpeg)

>例えば…

>ある時、300円くらいする高級アイスをコンビニで売りたいと思ったとします。この時に広告を出すとしたら、高級感たっぷりのCMで上品に見せるのがパッと思いつくアイデアなのではないでしょうか？

> **しかし時代は不況...その高級感に共感するユーザーはいるのでしょうか？**

>そこで**高級アイス**を**コンビニ**で買う人のインサイトを考えていきます。
なんで節約したいのに買うの？
なんでコンビニ？

>**ここのなんでを繰り返すと答えに着地します。**

>この場合の正解は、高級アイスをコンビニで買う人は、普段高級な物は買えないけど、手が届く範囲で贅沢したいということになります。
不況で節約してるけど、たまには良いもの食べたいというインサイトです。

>ここまでたどり着くとどういうコンセプトが必要かわかってきます。
>高級感たっぷりのCMより**週末のご褒美、たまには贅沢**など親近感があるコンセプトのほうが共感を得られる。


>これがインサイト発想です。

![ad5.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/2607fd52-07ac-36d3-dd83-3180589946f6.jpeg)

世の中で言われている当たり前を疑い、それってなんでだろう？本当かな？を無限に繰り返すことで、あ！この人ってこうだからこれを本当は求めているのかもしれない！と気付く瞬間が最後にでてきます！


**ではこれを開発でも応用していきましょう！**






#使っていきましょう！

**ポイントは１つ発見するたびに、
なんで？本当に？と客観視して奥底まで何度も繰り返すことです！**

![advent4.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/318128/0f56efeb-25a6-1740-6e00-82838a381167.jpeg)


**表面的な顕在ニーズを意識するより、インサイトという本人すら自覚していないだろう行動の理由を探る。そうするとより共感を得られる（＝使ってもらえる）プロダクトができるだけでなく、他のプロダクトとの差別化にも繋がるのではないでしょうか？**




##最後に

プロダクトを評価する基準には、技術力、企画力、デザイン力などなど色んな要素があると思います。特に技術力って時間に比例してついていくものだと思うので、すぐ伸ばすことは難しいですよね。
でも企画に着目してみることで、勉強したての頃でも他の人に使ってもらえる作品を生める可能性だってあると思います。

開発のゴールを完成・リリースに設定するのではなくユーザー体験やユーザーの拡散に着目してみるのも面白いのではないでしょうか？

明日は、「歩く技術力」 とうようさんの投稿ですね！
デザインも、コーディングもできるとうようさんの「○○でもわかるレスポンシブ時代の画像処理入門」。初心者にも優しそうなタイトルとなってるので、私も画像処理入門やってみたいです！笑

最後まで読んでくれてありがとうございます:heartbeat:
8946 Take#３０


# 問題

http://www.hackerschool.jp/hack/take30.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d7dcafa9-b8fc-9557-2c10-08777fe61964.png)

# 解いてみた

- これはもはやCTF関係あるのか？
- 大変そうなのでGoogle検索。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/adbcb8e8-21b6-0ef6-8dda-333b2dd169e6.png)

- ナニコレすごすぎ。
- てか、この人も同じ問題解いてるのかな？
- ということで92639が答えらしいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/82a997d7-ade6-4c7d-b249-903b6e016482.png)

- あー、なるほど、本来は競プロみたいな感じで解かせたかったのね。
8946 Take#１７


# 問題

http://www.hackerschool.jp/hack/take17.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/66b771e9-94ba-ad42-8059-4e01242f62a3.png)

# 解いてみた

- ソースを見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/887f8b94-be49-1162-2841-74a625825d62.png)

- 突破するボタンが押されたときに動くfnFormSubmit()を見てみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/cf246bea-c13b-ffa0-a54a-458ee5077034.png)

- 入力した数値を2進数に直したものが100110100100になればいい。
- https://hogehoge.tk/tool/number.html　使いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f413065d-b255-aa03-8cc8-a4ca11d41fd2.png)

- 2468ということが分かりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b615ffd6-ebb9-9063-b5e7-6cb1831326a4.png)

- 違いました。
- 再度ソースを見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/100ef009-4a43-878f-0c47-cd59677a91c4.png)

- 下の方にいいものを見つけました。
- javascriptの仕組みで同じ関数があるときは下に書かれたものが優先されるようですね。
	- 上書きされるイメージですかね。
- 今回の条件は以下です。
	- リファラがhttp://www.hackerschool.jp/hack/take17_dummy_referrer/ であること。
	- 入力した数値を2進数に変換したときに11010100001011であること。
- リファラ変換に関してはいろいろアドオンとか使ってみたんですが、どうもうまくいきませんでした。
	- たぶんjavascriptの処理をした後、HTTP送信する前に書き換えてるんだと思います。
- デベロッパーツールではHTMLは編集できるもののjavascriptは編集できないようです。
	- Firefoxも同様でした。
- ということで、困ってしまったんですが、ふと考えると上記条件を満たしたときにどうなるかというと、document.form1.input_id.value + '.html';に遷移するということなんです。
- まさかのHTML！
- 「入力値.html」を直接入力すればいいではないか という話です。
- 11010100001011を10進数に変換します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fda7d78b-a7f6-47d5-360b-7459231be528.png)

- 13579です。
- http://www.hackerschool.jp/hack/13579.html に直接アクセスです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7c152e76-9360-532a-c1af-e3e3d120ecf0.png)

- まだゴールではないんですね。。。
- さっぱりわからないのでとりあえずOK押してみましたが、画面はそのままです。
- 次はxを入力してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9cb2336b-42c7-551b-3c72-386ee155c904.png)

- 最初の画面に戻ってきてしまいました。
- でも少しURLが違う。
	- http://www.hackerschool.jp/hack/take17.php?mode=ng
- あと画面遷移が遅くて、一面灰色の時間が長かった。
- ということで短い時間ですが、頑張ってソースを表示してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e4a92ad0-6f62-3467-92b8-e3297c8e033a.png)

- もう一度13579.htmlを開いて987654321を入力。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b4601516-654a-857a-830f-fb7fbc67a0d8.png)

- なんとこれも違う！
- さっきのソースよく考えると1行しか書いてなかったのに行数は2,3と続いている。
- ということで下の方を見てみると。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a1f7ddf8-67aa-788b-dad5-663bd14ea354.png)

- parseInt( unescape("%36%33%32") )が何なのかよくわからなかったので出力してみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/61c98bab-833b-15bb-cdfc-71b44a767f7f.png)

- 632。
- 632を16進数に変換した数値を入力すればいい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b81cbd93-3188-1148-3795-78be04117006.png)

- 278が答え。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d12789e0-b9f5-8798-0f3f-2220a7cae8ec.png)
ひどうきでじっこうする

### これはなあに？

ふたつのことを、いっしょにする やり方を勉強（べんきょう）するよ


### サッカーをしながら...

例題（れいだい）としてサッカーをしながら、うんこをするやり方を勉強するよ。

まずは、サッカーをするよ

```swift
func サッカーをする() {
    
    for i in 0..<10000 {
        
        guard i % 231 == 0 else { continue }
        Array(repeating: "ドリブル", count: 10)
            .forEach { print($0) }
        
        print("シュート！")
    }
}
```

ドリブルとシュートをするよ。

つぎは、うんこをするよ

```swift
func うんこする() {
    
    print("ぶりぶりーーー！！！")
}
```

ぶりぶりーー！！！


#### やってみよう！

じゃあさっそくやってみよう

```swift

サッカーをする()
うんこする()
```

実行（じっこう）例（れい）

```sh
（しょうりゃく）
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
シュート！
ぶりぶりーーー！！！
```

あれーー？？？
これだとサッカーの後（あと）でうんこするだぞ？？？

### 非同期（ひどうき）実行（じっこう）

こういう時に使うのが非同期（ひどうき）実行（じっこう）だよ。
難（むずか）しい漢字（かんじ）だけど、おぼえようね。

さっそく作ってみよう。

```swift
let dispatchQueue = DispatchQueue(label: "queue", attributes: .concurrent)

func 非同期で(_ f: @escaping () -> Void) {
    
    dispatchQueue.async(execute: f)
    
}
```

これでふたつのことが一緒（いっしょ）にできるよ。

#### やってみよう

さっそうくやってみよう。

```swift
非同期で(サッカーをする)
うんこする()
```

実行（じっこう）例（れい）


```sh
ドリブル
ぶりぶりーーー！！！
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
シュート！
（しょうりゃく）
```

やったー！
サッカーしながらうんこできたよ！

### 遅延（ちえん）実行（じっこう）

サッカーしながらうんこできたけど、すぐにうんこするのじゃなくて、すこしたってからうんこするようにしたい。
これを遅延（ちえん）実行（じっこう）というよ。
非同期（ひどうき）実行（じっこう）のおともだちだよ。

ちょっとだけトリッキーにするよ。

```swift
struct ちえん {
    
    let びょう: Int
    
    func 後で(_ f: @escaping () -> Void) {
        
        DispatchQueue.global().asyncAfter(deadline: .now() + Double(びょう), execute: f)
    }
}

extension Int {
    
    var びょう: ちえん {
        
        return ちえん(びょう: self)
    }
}
```

#### やってみよう

さっそく、使ってみよう！

```swift
非同期で(サッカーをする)
1.びょう.後で(うんこする)
```

実行（じっこう）例（れい）

```sh
（しょうりゃく）
ドリブル
ドリブル
ドリブル
ドリブル
シュート！
ドリブル
ぶりぶりーーー！！！
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
ドリブル
シュート！
（しょうりゃく）
```

サッカーを始（はじ）めて1秒（びょう）後（あと）でうんこできたよ！
やったね！



### おしまい

おわりだよ！

ぶりぶりーーー！！！
Pugの連想配列の値にHTMLタグを入れる。

```
-
    var data = [
        'first_name': '山田',
        'last_name': '太郎',
        'address': '<span class="prefecture">東京都</span><span class="city">港区</span>'
    ]
```
のように値にHTMLタグを入れた時、普通に#{address}とするとタグがエスケープされて表示されてしまう。

!{address}のように#ではなく!を使うと、HTMLタグとして出力される。
Kotlinでpreferences

AndoridStudio3.0以降は画面から確認ができる。

メニューから　View > Tool Windows > Device File Explorer
目当てのパッケージの箇所を拡げる /data/data/[package-name]

preferencesで作成されるファイルの場所
/data/data/jp.co.hoge.hoge/shared_prefs/jp.co.hoge.hoge_preferences.xml

参照
https://qiita.com/ochim/items/dc4d77d478e87c1449ad
8946 Take#10


# 問題

http://www.hackerschool.jp/hack/take10.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/accd9471-ca1f-4f77-059f-77f2bba23ab5.png)

# 解いてみた

- むむむ。
- 問題が出る前にこの画面。
- いきなり最初に何かしないといけないということですよね。
- 何をすればいいのか全く分からないのでとりあえずパケット見てみますか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f46e0289-76d5-b2e0-c1f4-6a45d7a0a661.png)

- んー全く怪しげなところはありませんね。
- ページのソースを見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8f27fde0-1ea1-beeb-e86a-0c68039e1ac8.png)

- 何もないですねぇ。
- 念のため、Firefoxでも同じことをやってみましたが、同じでした。。。
- 何か勘でパラメータ追加しておくんでしょうか。
	- それは無理がありますよね。
- 同じフォルダ内に何かほかのファイルがあるんでしょうか。
	- 何個かやってみましたが、当たりませんでした。。。
- ということでまさかのこの問題は保留ということで。
8946 Take#１４


# 問題

http://www.hackerschool.jp/hack/take14.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/cf1bd709-d5e4-8cfb-f2ae-6d22ecc730bf.png)

# 解いてみた

- ひとまず、8946を入力してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5e289988-4dfc-d0ab-f4be-57334afbd290.png)

- なぜか入力した数値が消えてしまいました。
- 勝手に消される仕組みでしょうか。
- ソースを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/647cc476-49e1-25f5-160a-7adf62b42e6f.png)

- え！ソースが表示できない！
- よく意味が分かりませんが、Firefoxでやってみます。（↑はchromeです）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f7390e2e-cf85-766c-272f-7ebc4aae49c8.png)

- ソースが開けました。こんな経験初めてです。
- 突破するボタンを押下したときにfnFormSubmit()が呼ばれることがわかったので、fnFormSubmit()を調べてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f239996c-d18f-0b27-120d-ae49370b5105.png)

- 8946と入力されたときに空にしてから、送信する仕組みになっていました。
- ということで、突破するボタンを押したときにいきなりsubmitするように書き換えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0dc881b3-3930-999a-2ad0-dbb37b2d045e.png)

- これをやったうえでIDに8946を入力してボタン押下。
	- ちなみにchromeだとだめでした。
CellMultipleSelection

セルを複数選択する方法を残すべく作成

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/9e0ad724-57f7-a1af-41f6-42eef28b4f9e.gif">

#ソースコード
複数選択するには
`tableView.allowsMultipleSelectionDuringEditing = true`

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        navigationItem.rightBarButtonItem = editButtonItem //ナビゲーションバー右側にeditボタンを追加
        
        //複数選択を可能にする
        tableView.allowsMultipleSelectionDuringEditing = true
    }
    
    //editボタンが押されると呼ばれる処理
    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
        tableView.isEditing = editing //この処理でUitabeleviewを編集モードにする
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell() //セルを生成
        cell.textLabel?.text = "Item\(indexPath.row)"//セルに表示させる内容　ここでいうindexpath.rowは行番号
        return cell
    }
}


//セルが選択された場合
extension ViewController:UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("select - \(indexPath.row)")
    }
    
    //セルが解除された場合
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        print("deselect - \(indexPath.row)")
    }
}
ネットワークストレージについて

ストレージとは？
----
ストレージとは、デジタル情報を記憶/保存する装置（ハードディスク、MO、CD-R、磁気テープ等）のことです。
ストレージの接続形態には`DAS（Direct Attached Storage）`、`NAS（Network Attached Storage）`、`SAN（Storage Area Network）`の大きく3種類があります。
`DAS`はストレージをサーバなどに直接接続する形態、`NAS`と`SAN`はストレージをネットワーク上に接続する形態でネットワークストレージといいます。

DAS ( Direct Attached Storage ) 
-----
`DAS`は、1台のサーバなどに直接接続する形態のことです。
ストレージの接続には`ATA`、`SATA`、`SCSI`、`SAS`がプロトコルとして用いられます。
`DAS`の構成では、接続に専門知識の必要がなく増設も容易なところがメリットですが、複数のサーバでストレージを共有することができないデメリットがあります。

NAS ( Network Attached Storage ) 
-----
`NAS`は、ネットワークを介して接続する形態のことです。
または、ネットワークを介し利用するストレージそのものを指します。
`NAS`は「ハードディスク、LANインターフェース、簡易OS」などで構成されるファイルサーバ専用機なので、LAN接続型ハードディスクとも呼ばれています。
`NAS`は、`Windows`、`MAC`、`Linux`などの各OSのファイル共有プロトコルをサポートしています。
`NAS`に関しては、みなさん馴染みがあるストレージだと思います
※ `NAS`は外付け型ハードディスクとは違います。外付け型ハードディスクの場合はLANではなく`USB`や`IEEE1394`経由でファイルアクセスを行います。

SAN ( Storage Area Network ) 
----
`SAN`は、ストレージとサーバ間をファイバチャネルで接続したストレージ専用のネットワークのことでサーバなどのコンピュータと周辺機器を接続し、高速伝送を可能にする方式です。
ファイバチャネルには光ファイバーを使用して、LANとは独立したストレージ専用のネットワークが構築されます。
`NAS`は、`CIFS`、`NFS`、`AFP`等のファイル共有プロトコルは問題なく使用できるのですが、一部のデータベースアプリには適していないところがデメリットです。
`SAN`では幅広いアプリに対応しているところがメリットになる一方、`DAS`や`NAS`に比べて導入コストが高いこと、導入に際しても高度な専門知識が必要となるデメリットがあります。
※ `NAS`ではファイルシステムを介しストレージ装置を利用しますが、`SAN`ではハードディスク等のストレージ装置そのものを共有します。

図がないとわかりづらいですね。。。
時間があるときにでも、図を挿入したいと思います。。。
5SecoundTimer

タイマーへの理解を深めるために作成

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/1c8b7640-2eba-2abb-5aa6-2c5af9b27984.gif">


#ソースコード
Start押してから５秒経過後、ポップアップ表示

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    //タイマークラスのインスタンス
    var timer = Timer()
    //スタートボタンを押した時刻
    var startTime:Double = 0.0
    
    @IBOutlet weak var labelTimer: UILabel!
    @IBOutlet weak var startButton: UIButton!
    
    
    @IBAction func buttonStart() {
        //開始した時刻を記録
        startTime = Date().timeIntervalSince1970 //現在時刻の取得
        //ラベルを更新（残り５秒にする）
        labelTimer.text = "00:05"
        //0.01秒ごとにupdetaLabel()を呼び出すこのクラスではタスクのスケジュールを管理し何かしらのメソッドを実行したり停止したり、設定した時間ごとに繰り返したい場合に使う。タイマーが起動したときにupdetalabelを実行
        timer = Timer.scheduledTimer(timeInterval: 0.01,target:self,selector:#selector(updetaLabel), userInfo: nil,repeats: true)
        //タイマーが完了するまでボタンを非活性にする
        startButton.isEnabled = false
    }
    
    @objc func updetaLabel() {
        //経過した時刻を、現在の時刻ー開始時刻で算出（秒）
        let elapsedTime = Date().timeIntervalSince1970 - startTime
        //小数点以下は切り捨てる
        let flooredErapsedTime = Int(floor(elapsedTime))
        //残り時間
        let leftTime = 5 - flooredErapsedTime
        //ラベルに表示する時間
        let displayString = String(format: "00:%02d", leftTime) as String
        //ラベルを更新
        labelTimer.text = displayString
        
        //残り０秒になった時の処理
        if leftTime == 0{
            //タイマーを止める
            timer.invalidate()
            //アラートを表示する
            let alert = UIAlertController(title: "完了", message: "5秒経ちました", preferredStyle: .alert)
            //OKアクションメソッド設定
            let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
            alert.addAction(okAction)
            //アプリに表示させる動作
            present(alert, animated: true, completion: nil)
            //ボタンを活性化させる
            startButton.isEnabled = true
        }
    }
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }


}
```
ボタンの非活性は
`isEnabled = false`
ボタンの活性化は
`isEnabled = true`
8946 Take#42


# 問題

http://www.hackerschool.jp/hack/take42.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6cedf0f2-0d03-2893-a020-04a01526cd53.png)

# 解いてみた

- UAを編集してボタンを押せばよさそうです。
- ChromeのF12で編集します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9598997a-9bd5-1c9b-11fa-10251a6a78cc.png)

- こんな感じでいいんじゃないでしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7e1ad933-707c-7b28-25d4-024ba983fcb6.png)