OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング初心者のjQuery備忘録

・jQueryとは
-JavaScriptを便利に扱うためのライブラリ

・jQueryの型
$(function(){
})

・セレクタとは
-処理対象となるDOM要素を指定するための記法
・メソッドとは
-処理

・セレクタとメソッドの書き方
-$('セレクタ').メソッド();

#メソッドの種類
・hide：要素を隠す

・fadeOut：要素を隠す際に徐々に消えていくアニメーションを追加
⇒fadeIn

・slideUp：要素を隠す際に下から消えていくスライドアニメーションを追加
⇒slideDown

・attr：HTMLの属性の値を取得や変更ができる

・data：data属性を操作できる

・text：テキストを変更する

・html：HTMLを取得する

・val：value属性を取得する

・remove/empty:要素を削除する

・before/after：要素内の前/後にHTMLを挿入

・insertBefore/insertAfter：他の要素の前/後に要素を移動する

・prepend/append：要素内の先頭/最後にHTMLを挿入

・prependTo/appendTo：他の要素内に先頭/最後に要素を移動する

#id
jQueryではタグに名前を付ける方法としてidを使用します。
HTMLでのclassと同じような使い方ですが、idは一度しか使えません。
使用例

```index.html
<ul id="list">
```
classとidをセレクタにする場合「#」と「.」を使用します。
使用例

```script.js
$(#'id名').メソッド名
$(.'class名').メソッド名
```

#イベント
イベントを用いると、処理を行うタイミングを指定できる。
構文は

```
$('セレクタ').イベント名(function(){  })
```

・clickイベント
clickイベントを用いると、セレクタがクリックされたタイミングで処理を実行する。

・mouseover
マウスが被ったときに処理を実行

・mouseout
マウスが離れた時に処理を実行

・mousemove
マウスが移動したときに処理を実行

#CSSメソッド
CSSを変更できるメソッド
構文

```
$('セレクタ').css('プロパティ名','値');
```
#フィルタ
取得した要素を要素の順序や属性の値などによって絞り込むもの。
**$('element:filter')**のように記述する
・種類
1.eq()
要素から、～番目指定で単一エレメントを取得できる。
eq(2)なら0から数えて3番目の要素を取得

2.gt(),lt();
要素から～番目より後を全て取得,ltはその逆で前を全て取得

3.even,odd
要素から（0から数えて）偶数行のみ取得できる。oddは奇数行。

4.contains()
引数で渡された文字列を含む要素を取得できる

5.first,last
要素の最初だけ取得。lastは最後だけ取得

#メソッドを使ったDOM要素の指定方法
**$('要素').next(セレクタ)**のような書き方が基本
・parent(),children()
指定した要素が持つ親要素（perent）、子要素（chidren）を取得する

・next(),prev()
指定した要素の次(next)と前(prev)の要素を取得する

・siblings()
指定した要素と同階層の要素を全て取得できる
Wordpressで画像とかのURLのドメイン一括変更

Velvet Blues Update URLs
を使えば一発なのか、、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/a63dd6ed-580f-f19f-718f-ef58a2cd7628.png)


https://www.wpbeginner.com/plugins/how-to-update-urls-when-moving-your-wordpress-site/
privateメソッドをテストする時メモ


#プロダクトコード

```java:GoodsCreateHelper.java
@Slf4j
@Service
@RequiredArgsConstructor
public class GoodsCreateHelper {

    private final GoodsService gService;

    private void create(final GoodsTbl entity) {
        gService.insert(entity);
    }
}
```

#テストコード

```java:GoodsCreateHelperTest.java
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(profiles = {"test"})
@TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
})
public class GoodsCreateHelperTest {

    @LocalServerPort
    private int port;

    @Autowired
    private GoodsCreateHelper create;

    @Nested
    @DisplayName("createTest")
    class createTest {

        @Test
        void createFail() throws Exception {
            Class<GoodsCreateHelper> clazz = GoodsCreateHelper.class;
            Method method = clazz.getDeclaredMethod("create", GoodsTbl.class);
            method.setAccessible(true);

            GoodsTbl entity = new GoodsTbl();
            InvocationTargetException e = Assertions.assertThrows(InvocationTargetException.class, () -> method.invoke(create, entity));
            Assertions.assertTrue(e.getCause().toString().contains("DataIntegrityViolationException"));
        }
    }
}
```

#肝心なところ

```java

Class<GoodsCreateHelper> clazz = GoodsCreateHelper.class;
Method method = clazz.getDeclaredMethod("create", GoodsTbl.class);
method.setAccessible(true);

GoodsTbl entity = new GoodsTbl();
InvocationTargetException e = Assertions.assertThrows(InvocationTargetException.class, () -> method.invoke(create, entity));
            
```

1.リフレクションでメソッド名をハードコーディングで指定している。
2.メソッドへのアクセスを許可する。
Phalconのドキュメントを翻訳する 2018年版

翻訳の状況を一覧にしました。
https://docs.google.com/spreadsheets/d/1HkwoRl9zfpNfZxT8-x6B136evSQ88XA-k172m2fqjKc/

翻訳が全体の25%、承認が20%完了


Volt https://docs.phalconphp.com/ja/3.4/volt

Phalconのファンのみなさん、翻訳のご協力お願いします！

#概要
Phalconのドキュメント翻訳にはCrowdinというサービスが使われています。
https://crowdin.com

ひとまず翻訳するPhalconのドキュメントは2つ
- LP的なページ（Phalcon Website）https://phalconphp.com/ja/
- マニュアル（Phalcon Documentation）https://docs.phalconphp.com/ja/3.4

#crowdinで翻訳

##アカウント発行と権限付与の依頼
翻訳を始めるには、まずcrowdinにアカウントを作成する必要があります。
https://crowdin.com/join

その後、crowdinのメッセージ機能を使って、メンテナーのnidenに連絡して「translator」として承認してもらいましょう。
https://crowdin.com/profile/niden

##Phalcon Website
Phalcon Websiteの方はen.jsonを翻訳すると、
Crowdinから自動的にGithubにPull Requestが送られます。
ひとまず翻訳を100%にしました。(私は残ってたのを埋めただけ）
https://phalconphp.com/ja/

##Phalcon Documentation
Phalcon Documentationの方は、
まず「Translator」や「Proofreader」の方が翻訳してくれたものを、
「Proofreader」が「Approve」していく必要があります。[^3]

Crowdinの仕組みとして、
まずは「Approve」されたMarkdown形式のファイルが、
CrowdinからGithubの方にPull Requestとして送らます。
それを、nidenたちがweb上に反映してくれます。[^1]

[^3]: 最近、proofreaderに任命されたので、翻訳後はCrowdinのメッセージ機能で私にApproveの依頼をしてください。
[^1]: 最初この仕組みがわからずに、forkしたプロジェクトに対して、Crowinの翻訳結果を自分でmdファイルに埋め込んで、Pull Requestを送ったら、nidenから「それ違うよ」ってメールが来た。そんでCrowdinで翻訳を続けてたのだが、一向にgithubに反映されないので、nidenに連絡して「いつになったらgithubに反映されるの？日本の友人たちにPhalcon使って欲しいから、チュートリアルだけでも反映してくれよ」ってゴネたら、「じゃあ」って「Phalcon Documentarion」の「proofreader」にしてくれた。


先日「tutorial-base.md」の残りを全て翻訳して、他の人が翻訳してくれたものも含めて、一通り「Approve」してみました。

その結果、Githubにこんな感じで反映されます。
https://github.com/phalcon/docs/blob/l10n_3.3/ja/tutorial-base.md

しばらくするとWeb上に反映してくれます。（たまにnidenをつつきます）
https://docs.phalconphp.com/ja/3.3/tutorial-base


#翻訳作業のコツ
3.1、3.2、3.3、3.4、4.0、と5バージョンのドキュメントがあります。
まずは3.1から翻訳していくのがコツです。
よく見ると、色が薄い文と濃い文があるので、濃い文を優先的に翻訳していきます。
そうすると、他のバージョンでも同じ部分が翻訳されたことになっています。
濃い文だけ翻訳しきると、一覧表示で100%表示されます。
（とにかく量が多いので100%を目指すとモチベーションが維持できる）

#まとめ
とにかくGoogle翻訳ですね。
で、Google翻訳上で編集して、Crowdinにコピペ。
MVVMとは?　勉強結果と参考資料の共有

<br>
この記事は一部情報が抜けているので注意!
最新の情報は[訂正記事](https://qiita.com/FORTE/items/8bbbe732489f0e2e457d)を参照してください。
<br>
<br>
<br>
<br>
<br>
<br>


# 前提
MVVMについて調べてみるといろんな表現(解説)があったので、
門外漢(Webプログラマ)の自分が一番腹落ちした表現を(雑に)アウトプットしてみます。

詳細は参考にさせて頂いた資料を[御覧ください](#参考)。


# 結論
MVVMは**M**odel、**V**iew、**V**iew **M**odelの略称。
_**PDSを実現しつつ、View(XAML)の都合を吸収する部分がViewModel。**_
ModelはUI以外(ビジネスロジックやデータソースへのアクセス等)を担当する。

## PDS(Presentation Domain Separation)について
Presentation(UI)とDomain(その他の機能)を分けること。
PDSは以下のような経緯から生まれた(と理解した)。

+ UIはテストしづらいので、UI(View)とそれ以外を分けたい
+ Viewとそれ以外を分けると理解しやすい
+ 見た目の変更がその他の機能に波及しない(しづらい)
+ デザイナーとの分業の達成

## XAMLについて
AndroidアプリのViewに一般的に用いられるXML言語。
詳しくは[公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/advanced/xaml-overview-wpf)をどうぞ。
(自分は過去にActionScript3.0でMXMLを触った事があったのでイメージしやすかったです)


## ViewModelについて腹落ちしたポイント
以下の2点からViewとなるXAMLに対してはバインディングしたオブジェクトが必要であり、
それがViewModelであると理解。

### 1.XAMLの特徴(コントロールの状態保持について)
操作に対してコントロールの状態を保持するにはバインディングしたオブジェクトが必須。
無いとスクロールしただけで再描画されて状態が消える。
(チェックボックスのチェックが消えるなど)

### 2.バインディングしたオブジェクトからのみ操作可能な定義が存在する!
XAMLはXML形式でコントロールの定義が可能だが、
中にはバインディングしたオブジェクトからのみ操作可能な定義が存在する。

## 【ちなみに】View(XAML)でコードビハインドを使えばオブジェクト不要じゃね?
そうするとViewModelが使いまわせないので一般的にはおすすめしない。
例えば一覧ページと詳細ページで同じViewModelを使いたいのに、
Viewに書いてたら詳細で一覧を参照するかクローンコードにしないといけなくなってしまう。


# 勉強してみた感想と今後の課題
参考資料はMVVMだけじゃなくMVCなど他のMV◯系パターンの説明もあり、
それを読むとMV◯系はPDSを実現するための方法論でしかないのかなと。
つまり根幹にあるのはPDS。

実際にMVVMで開発する時にちゃんとMVVMに則って開発出来るように実例も見ていきたい。
既にいくつか資料を見てみたけど、まだ自信は持てない感じ…。


# 参考
## MV◯パターンやMVVMについての資料
* [GUIアーキテクチャパターンの基礎からMVVMパターンへ](https://www.slideboom.com/presentations/591514/GUI%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
* [MVVMパターンの常識 ― 「M」「V」「VM」の役割とは？](http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_05.html)
* [DataBindingて実現するMVVM Architecture](https://speakerdeck.com/star_zero/databindingteshi-xian-surumvvm-architecture?slide=7)

## MVVM開発の実践的な資料
* [IOS/Androidアプリの３つの大事な設計方針](https://www.slideshare.net/mokemokechicken/iosandroid-32804491)
* [iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い](https://www.slideshare.net/mokemokechicken/iosandroidmodel)
macOSでbyobuアップデート後にエラーが表示されたときの対処法

`Homebrew`を利用して`byobu`インストールした場合、次のコマンドが必要になったのでメモ。

## 環境

* Homebrew
* byobu
* ターミナル

## 症状

`Homebrew`で`byobu`がアップデートした直後に、`byobu`コマンドを実行すると次のようなエラーメッセージが現れる

```
bash: /usr/local/Cellar/byobu/5.125/share/byobu/profiles/bashrc: No such file or directory
```

## 原因

`.byobu/prompt`ファイル内に上記のパスが書かれていたのが原因

## 対処法

### 0. `byobu`のバージョンを調べる

```
$ byobu
byobu version 5.127
WARNING: ulimit -u is too low
tmux 2.7
```

### 1. `.byobu/prompt`の中身を書き換える

```
- . /usr/local/Cellar/byobu/5.125/share/byobu/profiles/bashrc  #byobu-prompt#
+ . /usr/local/Cellar/byobu/5.127/share/byobu/profiles/bashrc  #byobu-prompt#
```

### 2. 実行権限を与える

```
$ chmod 744 /usr/local/Cellar/byobu/5.127/share/byobu/profiles/bashrc
```

もうちょっとスマートにやりたいのになあ…。
クローラー、スクレイピング用tips(selenium,lxml)

```selenium.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


#ヘッドレスブラウザ
options = Options()
options.add_argument('--headless')
# options.add_argument('--window-size=1440,900')
driver = webdriver.Chrome(chrome_options=options)

#ヘッドレスじゃないブラウザ
driver = webdriver.Chrome()


driver.maximize_window()
driver.implicitly_wait(30)

driver.get("任意のURL")
driver.find_element_by_name('hoge').send_keys('hoge')
driver.find_element_by_css_selector('hoge').click()
driver.find_element_by_css_selector('hoge').get_attribute('hoge')
```



```lxml.py
import lxml.html
from urllib.request import urlopen
from lxml import etree


tree = lxml.html.parse(urlopen("任意のURL"))
html = tree.getroot()

html.cssselect("h1")[0].text

#全ての取得できる対象のHTMLを取得(日本語があるサイト)
lxml.html.tostring(tree, encoding="utf-8").decode()


```


```selenium_and_lxml.py
#seleniumでjsを読み込んで
driver = webdriver.Chrome()
driver.get("https://hoge/")
#driver.page_sourceを取得する
html = lxml.html.fromstring(driver.page_source)
title = html.cssselect("section#coordinate_info h1")[0].text
image = html.cssselect("div#coordinate_img img")[0].get("src")#属性取得
print(title)
print(image)
```
Androidの連打防止機構、およびOSの不具合と言い張れなくもないなにか

## 本題
サルやラットがボタン連打して狂って死ぬ実験は有名ですが、人間もボタンを連打します。
というわけでAndroidでのボタン連打防止機構。やり方そのものはわりと出てくるのですが、自分が考えたやり方が見つからなかったので書きます。

```java:GuardActivity.java

public class GuardActivity extends AppCompatActivity {

    // 最後にボタンがタップされた時間
    private long mLastClickedTime;
    // 連打防止時間.ミリ秒
    private static long GUARD_TIME = 200;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ButtonListener listener = new ButtonListener();

        // リスナをセットするボタンのID一覧
        int[] BUTTON_LIST = {R.id.ButtonEnter, R.id.ButtonExit, R.id.ButtonNext, R.id.ButtonPrev};

        for (int buttonId : BUTTON_LIST) {
            findViewById(buttonId).setOnClickListener(listener);
        }
    }

    // クリックリスナ
    private class ButtonListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            long currentTime = System.currentTimeMillis();
            if (currentTime - mLastClickedTime < GUARD_TIME) {
                // 現在時刻 - 最後にタップされた時間 < 連打防止時間
                // の場合は何もしない
                return;
            }
            // 最後にタップされた時間を更新
            mLastClickedTime = currentTime;

            switch (v.getId()) {
                case R.id.ButtonEnter:
                    // 各ボタンごとの処理
                    break;
            }

        }
    }
}

```

連打防止時間の秒数は適宜調整してください。がっつり動作確認はしてないです[^1]。

## おまけ
なんでこんなのが必要になったかというと[PreferenceFragmentCompat](https://developer.android.com/reference/android/support/v7/preference/PreferenceFragmentCompat)で作ったメニューが連打されたからです。
PreferenceFragmentを使っているっぽい**Android標準の設定アプリでメニューを連打すると同じ画面が二重に開く**ので、興味があって暇な人は連打してみましょう。別のボタンを短時間に別々に押しても画面が二重に開きます[^2]。確かNexus5XのOreoで確認しました。機種によってはできないかも。
フレームワークに既にあるものを再実装するって虚無でイヤなのですが、PreferenceFragmentCompatみたいなこまったちゃんの場合は、作り慣れたRecyclerViewやListViewでそれっぽく作ったほうが簡単で幸せです。


[^1]: 指が疲れたので。
[^2]: 押す→離す→押す→離すを高速で。要練習。
Pythonでスクレイピングした情報をLINE Notifyを使って通知する

#概要
スクレイピングに関して少し勉強したのでそれを利用した簡単アプリを作成したときのメモです。
今回は例としてYahoo!天気から得た情報をLINEに通知するやり方です。

- 使用言語 : Python3

#手順

##スクレイピングの準備

今回はBeautifulSoupを使用しました。スクレイピングの記事は当サイト内でも多数あるのでそちらを参考にしていただければと思います。

##天気予報の取得

- webサイトにアクセス

```python
import requests
from bs4 import BeautifulSoup

r = requests.get('https://example.html')
```

- 所望の情報を取得

```python

soup = BeautifulSoup(r.content, "html.parser")

hoge = soup.find_all("p")
date = soup.find_all("p", class_ = "date")
```
簡単に特定のタグの情報を取得することができます。今回は例としてPタグを取得しています。
また3行目のように属性などをさらに絞ることで取得する情報を指定しやすくなります。
取得した情報はlistとして扱うことができ, 下記のようにすることで文字を取得することも可能です。

```
today = date.getTest()
```
日付と同じ要領で天気情報も取得可能です。

##LINE Notifyを利用し, 取得したメッセージの通知

- [LINE Notify](https://notify-bot.line.me/ja/) の利用方法につきましてはこちらの記事[[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)を参考にさせていただきました。

以下, pythonを利用したLINEの通知方法です。

```python

LINE_TOKEN =  "取得したトークンを記述する"
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

def send_weather_info(msg):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": msg}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)
```

# 最終的なコード

```python

r = requests.get('https://example.html')
soup = BeautifulSoup(r.content, "html.parser")

w_date = soup.find_all("x", class_ = "xxxx")
weather = soup.find_all("x", class_ = "xxxx") # "x", "xxxx"はサイトに合わせて適宜変更してください。

today = w_date[0].getText()
tomorrow = w_date[1].getText()

td_weather = weather[0].getText()
tm_weather = weather[1].getText()

msg = "天気予報\n%s : %s\n%s : %s" % (today, td_weather, tomorrow, tm_weather)

LINE_TOKEN =  "取得したトークンを記述する"
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

def send_weather_information(msg):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": msg}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)

def main():
    send_weather_information(msg)


if __name__ == '__main__':
    main()
```

こんな感じでLINEに通知が来ました。

![IMG_3062.jpg](https://qiita-image-store.s3.amazonaws.com/0/183525/a1993e6b-8442-e0c8-f52e-e8ee25e0e6f6.jpeg)

# 感想
天気など調べるのが手間だなと思って作成してみました。
ですが, ファイルを実行するのも面倒なので, AmazonDashButtonなどを利用してもっと簡単にできればと思っております。
天気のみならLINEの通知としてよりよい方法があるようなのでそちらも参考にしてまた勉強していきたいと思います。
Django×django-oauth-toolkit×SQL Databaseでのmigrate時エラー対応

# どんなエラー？

諸事情があり、Azureで一本化しています。

OAuth2を利用した認証を実装しようとして、
oauth2_providerをsettings.pyに追加して、
[python manage.py migrate]
といつものように実行

・・・

```Bash
pyodbc NotImplementedError: the backend doesn't support altering from/to AutoField.
```

・・・がーん。。。

SQLDatabaseではIdentity fieldのAlter Table(データ型の変更)は不可のようで
django-oauth-toolkitのgithubで話し合われています。
https://github.com/jazzband/django-oauth-toolkit/pull/615

migrationsファイルの
0001でPKのidにAutoFieldで作成
0005で上記のpkをBigAutoFieldに変更
ここでエラーが発生。

## 補足

migrateでなければ、
pk制約を一旦削除して、フィールドを変更して、pkを追加しなおせば大丈夫なはず。

## 続き

migrationファイルをリセットしようという話がでていましたが、
SQLDatabaseを使っているユーザなんて少ないから
＆SQLDatabaseの問題だからということで、
「django-oauth-toolkit」での対応はなくなりました。

# 対応方法

利用者は少ないと思いますが、対応方法を念のために記載しておきます。

oauth2_providerのマイグレーションファイルが原因なので、
こちらのマイグレーションファイルを上書きしてやります。

プロジェクトファイル
|
|- db_migrations
　|- oauth2_provider

のようにフォルダを追加して、
django-oauth-toolkitのパッケージから
migrationファイル一式をコピー

0001_initial.py
0002_08_updates.py
0003_auto_20160316_1503.py
0004_auto_20160525_1623.py
0005_auto_20170514_1141.py
0006_auto_20171214_2232.py
(2018/08/16時点)

以下のように修正（原因の0001 と 0005）

https://github.com/jazzband/django-oauth-toolkit/pull/615/commits/b333aa46efbea564773b4bdb1f5b40bc653653d8

※私はBigAutoFieldで対応したので、
　0001のidを最初からBigAutoFieldに変更
　＆0005のidのBigAutoFieldのAlter Tableを削除
として、配置しました。

settings.pyに以下を追記

（https://docs.djangoproject.com/ja/2.1/ref/settings/#migration-modulesに記載があります。）

```Python
MIGRATION_MODULES = {
    'oauth2_provider': 'db_migrations.oauth2_provider',
}
```

[python manage.py migrate]
でOK

# 補足

django自体がBigIntに移行したら、
他のライブラリでも今後発生しそうで怖い。
MS SQL変更可能にならないだろうか。。
Element取得する際のNot found elementのエラー時に確認すること

SeleniumでElementを取得する際、慣れていないとよくNot found elementのエラーに遭遇します。
その際、個人的に確認することをまとめました。

#### 使用環境

- デバッガ : Eclipse
- ブラウザ : Chrome 
- 言語 : java

#### 1. デバッグを行い、Element変数の中身を確認してみる
Eclipseの場合、画像のようにElement変数内のcriteriaとparentの両方の内容を確認します。
![variables.png](https://qiita-image-store.s3.amazonaws.com/0/140953/15b5c547-0013-d130-861b-86b22dbb68c3.png)

#### 2. ブラウザの開発ツールを開き、ElementsタブでAND検索してみる
上記のデバッグで取得した変数の中身を使用します。AND検索の方法は以下です。

- CSSセレクタを使用した場合: [parent変数の中身]//[criteriaの中身]
- XPathを使用した場合: [parent変数の中身\] (半角スペース)[criteria変数の中身]

上記の検索方法で以下を確認します。

- 取りたいElementが検索に引っ掛かるかどうか
- Elementが複数取れていないか

だいたいここでElementの指定方法の間違いに気づいたりします。

![スクリーンショット 2018-08-16 0.29.53.png](https://qiita-image-store.s3.amazonaws.com/0/140953/d7209642-734d-1de4-3fe4-72a5dcb1d023.png)

#### 3. 開発ツール上からCSSセレクタやXPathを取得してみる

開発ツール上で、対象のElement右クリック > Copy > Copy selector/Xpath
上記の指定方法でElementが取得できるか試してみます。
また、自分が記載した指定方法と見比べて、どこが違うか確認します。
※自動的に生成されるCSSセレクタやXPathはメンテナンス性が低いことがあるので注意してください。

![スクリーンショット 2018-08-16 0.46.04.png](https://qiita-image-store.s3.amazonaws.com/0/140953/ae127598-1353-9f56-c6cc-a0b7e384a480.png)
#### 4. iframeでないか疑ってみる
取得したいElementがiframeの中の要素である場合、ドライバーをスイッチする必要があります。
iframeへ切り替える方法は以下です。

```java
Selenide.switchTo().frame(iframe)
```

#### 5. 別windowsでないか疑ってみる
取得したい要素が別のウィンドウや別のタブの場合も、ドライバーをスイッチする必要があります。
セレナイドを使っている場合は以下で別ウィンドウへ切り替えられます。

```java
Selenide.switchTo().window(window)
```

#### 6. 最後に
もし記述に間違いがあったり、他に何かいい方法あったら教えてください。
php-master-changes 2018-08-15

半月いけたら一ヶ月くらいはいけるのではないかと気が緩みはじめる

# 2018-08-15
## laruence: Added NEWs
- https://github.com/php/php-src/commit/e4276aeb98e90c572f80369ddf2cb82100e1e70b
- NEWS に[昨日の zend_read_static_property の修正](https://qiita.com/sj-i/items/5961d7540e2110a43483#laruence-fixed-zend_read_static_property)を追加
PostgreSQLのカレントスキーマ設定

Postgre のデフォルトでは、publicがカレントスキーマとなっている。
作成したスキーマのオブジェクトを参照するには、カレントスキーマを変更する必要があります。


```sql
-- カレントスキーマ確認。複数ある場合は最初のスキーマが表示される
SELECT current_schema();

-- カレントスキーマ設定
SET search_path to schema1, schema2;

-- 全カレントスキーマを表示する
show search_path;
```

毎回設定するのが面倒であれば、postgresql.conf で指定ができます。

```bash
vim /Library/PostgreSQL/9.6/data/postgresql.conf

search_path = '"$user", public, schema1, schema2'
```

## 参考サイト
http://syo.cocolog-nifty.com/freely/2009/01/postgresql-c5a1.html
http://eichisanden.hateblo.jp/entry/2014/01/10/143039
http://kashi.way-nifty.com/jalan/2014/03/post-1303.html
Goでのエラー判別

## 1.　返してきた関数/メソッドで判別
多分これが一番多いパターンです。

```go
	if err := foo(); err != nil {
		// fooが失敗したときの処理
	}

	v, err := bar()
	if err != nil {
		// barが失敗したときの処理
	}
```

Goのエラーハンドリングはそれぞれの関数がエラーを返してきたとき、呼び出し側の関数で処理するのが原則です。
もし伝搬させたい場合はそのエラーをそのまま戻り値にして返します。
この場合更にその呼び出し元では「呼び出した関数が返したエラー」として一律で扱うべきです。

```go
func foo() error {
	if err := func1(); err != nil {
		return err
	}

	if err := func2(); err != nil {
		return err
	}
	return nil
}

func bar() {
	if err := foo(); err != nil {
		// `foo`が失敗したときの処理
		// 中で何が失敗したかはここでは扱わない
	}
}
```
しかし、ときには中の処理のどの部分で失敗したかによって処理を変えたい場合があります。

## 2. パッケージ変数で判別
2番めのパターンはパッケージ変数で判別するやり方です。

各エラーごとにそれぞれパッケージ変数を定義します。
呼び出し元ではそれらのエラー変数と比較してエラーを判別しハンドリングします。

```go
package foo

import "errors"

var (
	Err1 = errors.New("error 1")
	Err2 = errors.New("error 2")
)

func Foo() error {
	// 処理1
	if process1.isFailed() {
		return Err1
	}
	// 処理2
	if process2.isFailed() {
		return Err2
	}
	return nil
}
```

```go
package main

import "foo"

func main() {
	if err := foo.Foo(); err != nil {
		switch err {
		case foo.Err1:
			// 処理1で失敗したときのエラーハンドリング
		case foo.Err2:
			// 処理2で失敗したときのエラーハンドリング
		default:
			// その他
		}
	}
}
```

このやり方では、呼び出した関数のどこで失敗したか判別することが出来ますし、更に下の階層で発生したエラーも判別することが出来ます。

しかし、このやり方は固定されたエラーケースには対応できますが、エラーの分類が複雑になったり、エラー時の状態を参照しないとハンドリングできないようなケースには対応できません。

## 3. 独自エラーの定義
3番目のパターンは独自のエラー型を定義するやり方です。

Goの組み込みのエラー型（`error`）は以下のような型です。

```go
type error interface {
	Error() string
}
```

そしてGoではシグネイチャーさえ満たせばどのような型でもそのインターフェース型として扱うことが出来ます。
そのため独自のエラー型を定義するのはとても簡単です。

```go
type MyError struct {
	Code    uint32
	Message string
}

// Errorメソッドさえ定義されていれば良い
func (err *MyError) Error() string { return err.Message }

func somethingFail() error { return &MyError{1, "my error"} }
```

呼び出し側でエラー判別する場合はtype switchを使いましょう。

```go
	if err := somethingFail(); err != nil {
		switch err := err.(type) {
		case *MyError:
			// MyErrorの処理
			// switch文の頭で再定義したerr変数は*MyError型なので、
			// MyError型の各フィールドにアクセスできる。
			log.Println(err.Code, err.Message)

		case *AnotherErrorType:
			// AnotherErrorTypeの処理

		case FooInterface:
			// FooInterfaceの処理
			// type FooInterface interface { Foo() string }
			// FooInterfaceというインターフェースを満たすエラーはすべてここでハンドリングできる
			log.Println(err.Foo())

		default:
			// その他の処理
		}
	}
```

大体この3つのパターンを使い分ければ大抵のケースに対応できるかなと思います。

## バッドプラクティス
ちなみにエラーメッセージでハンドリングするのはバッドプラクティスです。
あくまで、表示やログ用と割り切りましょう。

```go
	// こういうのはバッドプラクティスです
	if err := somethingFail(); err != nil {
		switch err.Error() {
		case "error 1":
			// error 1 の場合の処理
		}
	}
```

```go
	// これはひどすぎる
	if err := somethingFail(); err != nil {
		myErr := new(MyError)
		json.Unmarshal([]byte(err.Error()), myErr)
		log.Println(myErr.Code, myErr.Message)
	}
```

## おまけ
エラーにスタックトレースや追加のエラーメッセージを付与したいときもあります。
そのようなときは[github.com/pkg/errors](https://github.com/pkg/errors)を活用しましょう。

参考:
https://qiita.com/Hiraku/items/ecd6c99854845f95e4f1
https://deeeet.com/writing/2016/04/25/go-pkg-errors/
Ruby on Railsで0からアプリケーションを作るときのセッティング【備忘録】

毎度Ruby on Railsでrails newコマンドを叩く際にrubyやrailsバージョンに迷ったり、必要な設定に苦慮することが多々あったので、この際にまとめてみます。

# 好きなrailsのバージョンをインストール

`$ gem install rails --version="5.2.0"`

# gemの変更を反映する

`$ rbenv rehash`

# 反映されたか確認

`$ rails -v`

# アプリケーションを作成

```terminal:ターミナル
$ rails _5.2.0_ new rails_app -d mysql  #railsのバージョンとデータベースを指定
$ cd rails_app  #rails_appディレクトリに移動
```

# データベースを作成

`$ bundle exec rake db:create  # データベースを作成`

# 不要なファイル作成を防ぐ

```ruby:config/application.rb
# 省略
module RailApp
  class Application < Rails::Application
    # 省略
    config.generators do |g|
      g.stylesheets false
      g.javascripts false
      g.helper false
      g.test_framework false
    end
  end
end
```

# gitの設定
## gitの初期化

`$ git init`

## ローカルリポジトリにコミット
ステージングエリアへ登録
`$ git add .`

コミット
`$ git commit -m "Initial commit"`

## githubに登録

リモートリポジトリに追加
`$ git remote add origin git@github.com:ユーザ名/アプリケーション名.git`

リモートリポジトリにプッシュ
`$ git push -u origin master`

さあ、ここからはブランチを切って作業を開始していきましょう！

# stylesheetの用意
下記を参考にする

HTMLとCSSクラスでよく使う命名について
https://qiita.com/pugiemonn/items/eaa597b79fe59a1f1506

Railsのプロジェクトリニューアルの機会にHTML/CSSのコーディング規約を作ってみた
https://qiita.com/soyanchu/items/dd99fe2b3d08eb7128c7
Material Iconに好きなフォントアイコンを追加する

[Material Icon](https://material.io/tools/icons/?style=baseline)にビッタリくるようなものがないならカスタムアイコンを追加しよう。
どこかのライブラリにいかしたものがあるならそれでいいし、自分で作ったものでもよい。

# 追加したいフォントファイルをどこかに置く

例えばこれを追加することにします。
https://materialdesignicons.com/

npm installしたらsvgファイルとかttfファイルとか手に入ります。npmインストールするんならnode_modules指定でいいと思うんだけど、容量削減のために加工入れるならassetフォルダに置けばいいし、CDNから引っ張りつつservice workerのキャッシュに載せるならngsw-config.jsonのurlsに記載すればよい。

# Angularの中で追加する

MatIconRegistryで追加登録できます。個人的にはMaterialインポート用のmodule作ってるのでそこのコンストラクタで登録します。そうじゃなかったら、AppModuleでインポートされてるapp-wideなところで登録しましょう（そうじゃないとhtmlの場所によっては使えなくなるから）。URLはsanitizerしないと怒られます。

```typescript
  constructor(iconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
    iconRegistry.addSvgIconSet(sanitizer.bypassSecurityTrustResourceUrl('../node_modules/@mdi/font/materialdesignicons-webfont.svg'));
  }
```

そしたらもう公式と同じように追加したアイコンも名前指定すれば表示できます。

```html
<mat-icon svgIcon="boku-ga-tukkutta-icon"></mat-icon>
```

やっぱ名前空間とか分けようよ、将来的に同じ名前が公式で追加されたらぶつかっちゃうしとかなら、こう。

```typescript
  constructor(iconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
    iconRegistry.addSvgIconSetInNamespace('custom', sanitizer.bypassSecurityTrustResourceUrl('../node_modules/@mdi/font/materialdesignicons-webfont.svg'));
  }

```

そしたら以下で表示できます。`custom:`によって公式アイコンと名前が被らないようになります。

```html
<mat-icon svgIcon="custom:boku-ga-tukkutta-icon"></mat-icon>
```

# 他のやり方

単発アイコンを登録したかったり、svg以外ならどうするのというなら、こちらを参照してください。サンプルコードがなくてわかりづらいけど、typescriptの型定義やテストファイル見てがんばりましょう。

https://material.angular.io/components/icon/overview
【GAS】Google Apps Scriptとは？(GASの勉強を始めた#1)

「GASを使ってラクをしたい」と思っている自分のメモです。
とにかく面倒臭いことはいや！なので！GASを身につけてスマートに業務をしたい！
ということでいくつかの記事に分けてGASの記事を書いていきます！今日は第一歩！

#1.Google Apps Scriptとは？

Google Apps Script、以下GASはGoogle社が提供するプログラミング言語です。
Googleが提供する数々のアプリケーション群をプログラミングにより操作可能になります。

#2.GASで実現できること

>
####スプレッドシートで使えるオリジナル関数を作る
####ドキュメントを翻訳する
####スプレッドシートのリストからpdf形式で帳票を作成しドライブに保存
####カレンダーに登録している今日の予定をメールに送信
####フォームに回答した人にお礼メールを自動返信
####カレンダーに登録している予定をスプレッドシートに書き出す
####スプレッドシートに入力してある住所一覧をマップにプロット
####ドキュメントの内容を本文としてスプレッドシートのメールアドレス一覧にメールする
####問い合わせメールをスプレッドシートに蓄積する

アプリケーション同士を連携させることも可能です。
アプリケーションを操作する以外にも、HTMLやCSSを使って独自のWebアプリを構築したりAPI経由で外部サービスを連携したりする機能も提供されています。

#3.GASの特徴

GASの最大の特徴は、徹底したクラウド志向。記述したスクリプトファイルだったり、スクリプトを編集および実行するための環境やプログラムだったり、操作対象となるアプリやデータは全てGoogleのクラウドサーバー上にあります。

クラウド上にあるため、開発環境の準備が一切不要です！
ブラウザにアクセスするだけですぐにスクリプトを書き始めることができます。
ローカルのPCやブラウザが立ち上がっていなくてもスクリプトを実行することができるのも特徴の一つです。

#4.GASの開発に必要なもの

① Googleアカウント
②ブラウザ（GoogleChrome推奨)
③インターネットに接続できるPC(OSは問わない)

たったこれだけです！すごい！

本格的なGASの使い方についてはこれから学習して行きます！

>参考図書
・Google Apps Script完全入門
Installing xonsh on macOS

# xonsh をインストールする

ばんくしさんがいますぐインストールって言うので

## xonsh って何？

こんしゅ。Python 製でマルチプラットフォームな多機能シェル。[公式サイト](https://xon.sh/)

## 依存関係

1. Python v3.4+
1. [PLY](https://github.com/dabeaz/ply)

PLY は xonsh に入ってるからなくてもいいらしい。PLY は Python 製の Lex/Yacc 派生で，構文解析をするやつ。

## macOS にインストール

[公式インストラクション](https://xon.sh/osx.html)

macOS のシステムデフォルト Python は2系なので pyenv で入れた3系に切り替え。_（後から気づきましたが， brew で xonsh を入れる場合は pyenv で Python 3系を入れる必要は多分ないです）_

```sh
$ pyenv global 3.6.1
$ python --version
Python 3.6.1
```

インストールには brew, port, conda, pip3 が使える。素晴らしいですね。

```sh
$ brew update
$ brew install xonsh
```

brew が Python 3.7.0 のインストールを始めたのでめっちゃ時間かかった

## 入れるべき extras

readline ライブラリ。ほぼ確実に使う。

```sh
$ pip3 install gnureadline
```

Path Helper による PATH の読み込み

```:/etc/xonshrc
source-bash $(/usr/libexec/path_helper -s)
source-bash --seterrprevcmd "" /etc/profile
```

Tab 補完のための bash-completion。すでに v1 を入れている場合は brew が教えてくれるので， `brew unlink bash-completion` してください。

```sh
$ brew install bash-completion2
```

これにより `/usr/local/share/bash-completion/bash_completion` に bash-completion ファイルが配置されます。xonsh はこのパスをハードコードしているのでこれにより bash-completion が有効になります。

## おためし

これで全部入ったはずなので，[公式チュートリアル](https://xon.sh/tutorial.html)を少しやってみましょう。

### 起動

```sh
$ xonsh
aximov@mac ~ $
```

いくらか設定していた alias がスキップされましたが，無事起動しました。

### デフォルトシェルを xonsh にする

[参照](https://rcmdnk.com/blog/2015/05/25/computer-mac-bash-zsh/)

```sh
$ echo $SHELL
/usr/local/bin/bash
$ which xonsh
/usr/local/bin/xonsh
```

```:/etc/shells
/usr/local/bin/xonsh <- 追加
```

```sh
$ chsh -s /usr/local/bin/xonsh
```

これで iTerm やターミナルを起動したときにデフォルトで xonsh が起動するようになりました。

### 簡単な操作

引き続きチュートリアルを進めます。

```sh
$ 1 + 1
2
```

Python インタプリタそのものとして使えます。

```sh
$ import sys
$ print(sys.version)
3.7.0 (default, Aug 15 2018, 23:22:06)
[Clang 9.0.0 (clang-900.0.39.2)]
```

文法的に不完全な入力があると自動で複数行モードになります。

```py
$ if True:
.     print(1)
. else:
.     print(2)
.
1
```

`else` のところでインデントが自動で引っ込んでくれるかと思いましたが，流石にそこまで親切ではないようです。

for ループはもちろん。

```py
$ for i, x in enumerate('xonsh'):
.     print(i, x)
.
0 x
1 o
2 n
3 s
4 h
```

関数やクラスも定義できます。

```py
$ def f():
.     return "xonsh"
.
$ f()
'xonsh'
```

Shift + Tab で4つスペースが入力されます。また，Tabキーを連打すると補完候補が表示されます。

<img width="375" alt="Tab補完" src="https://qiita-image-store.s3.amazonaws.com/0/151801/6ee972fc-6312-0acf-5b21-99e7c80d9e3f.png">

[チュートリアル](https://xon.sh/tutorial.html)が非常に充実していますので，Python を普段あまり使わない僕もすぐに慣れることができそうです。

Python を普段使いしている人は存分に恩恵を受けられるシェルですね。
所有している複数のMacでiOSアプリを開発するための証明書周りのやり方

## はじめに
いつも忘れるしメモしておきます。これが正しいのかはよくわかりません。誰か教えてください。

## やりたいこと
Mac Aで開発している個人のiOSアプリをMac Bでも開発できるようにしたい。

## 手順
### .cerファイルを作る
1. [Apple Developer](https://developer.apple.com/account) > Certificates, Identifiers & Profiles > CertificatesのAllを見ると、`iOS Development`と`iOS Distribution`の`.cer`ファイルがあるのでダウンロードし、Finderからそれらをそれぞれ開きます（キーチェーンに登録されます）。
2. 1.が存在した場合は `.p12`ファイルの話にいってください
3. 1.の場所になかった場合、Mac Aでキーチェーンアプリを開いてメニューのキーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求 > メアド入力 > ディスクに保存をチェック > 続ける の順に行います。すると、`.certSigningRequest`ファイルが生成されます。
4. Mac Aで[Apple Developer](https://developer.apple.com/account) > Certificates, Identifiers & Profiles > CertificatesのAll を開き、右上の＋ボタンを押します。`Development`または`App Store and Ad Hoc`（Distribution）を選択し、Continueを押し、もう一度Continueを押し、Choose Fileで3.の`.certSigningRequest`を選択してContinueすると、目的の`.cer`ファイルが生成されます。

### .p12ファイルを手に入れる
Xcode > Preference > Accounts > AppleID > 右下のManage Certificatesを選択します。`iOS Development`と`iOS Distribution`のバツ印がついてないやつをそれぞれ右クリックして、Exportを選択します。パスワードを設定しないと行けないので設定してそれぞれExportします。

### Mac Bで設定する
1. 上記で作成した`.cer`ファイルと`.p12`ファイルをMac Bに送って、Mac Bで開きます（キーチェーンに登録される）。 

以上で、Mac Aで開発していたアプリをそのままMac Bでも開発できるようになるはずです。できなかったらごめんなさい。Xcode上でエラーが出てている場合は、各アプリの各Provisioning Profileに`.cer`が紐ついていない可能性があります。[Apple Developer](https://developer.apple.com/account)から再設定して、Downloadすれば治るかもしれません。

## おわりに
正しいやり方かはわからないので、誰か詳しい人教えてください。以上メモでした。
【Swift 4】 iOS, UIBarButtonItemを隠す方法

【Swift 4】 iOS, UIBarButtonItemを隠す方法
UIBarButtonItemでは「isHidden」が使えませんので、以下のようにします。
※ UIBarButtonItemの名称を「myBarButton」とします。

隠したい時

```swift
self.myBarButton.isEnabled = false
self.myBarButton.tintColor = UIColor.clear
```

見せたい時

```swift
self.myBarButton.isEnabled = true
self.myBarButton.tintColor = UIColor.init(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
```
UIColor.init(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)というのは、defaultのボタンの色（水色っぽい青）です。
PythonとDjangoのインストール方法

###Pythonのインストール
---
PythonのWebページから適当なVersionをダウンロード

コマンドプロンプトで
>Python --version

で確認
###仮想環境を構築
---
コマンドプロンプトで，
>pip install virtualenvwrapper-win

これで，virtualenvとvirtualenvwrapperがインストールされる．

###Djangoのインストール
---
コマンドプロンプトで
>pip install Django＝バージョン

でインストールできる．

###参考にしたサイト
---
https://zenmaibane.hatenablog.com/entry/2016/09/25/183220
【体験記】AWS認定ソリューションアーキテクト プロフェッショナル試験（SAP）に合格する方法

# はじめに
2018年6月に[AWS 認定ソリューションアーキテクト – プロフェッショナル](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)の試験に合格しました。
[前回の記事](https://qiita.com/hamham/items/fbbae7a3b81b03c2ed8f)でアソシエイトの体験記を書きましたが、実はこれを書いている時点で上位試験のプロフェッショナルにも合格してました。
アソシエイトに合格してから間があくと忘れてしまうので、そのまま3週間ほど勉強を続けて試験に挑みました。

# 試験の概要
まずソリューションアーキテクトのプロフェッショナルを受けるには、アソシエイトに合格しておく必要があります。
~~**アソシエイトを飛ばしていきなりプロフェッショナルを受けるのは不可です。**~~
~~知識に自信があってもまずはアソシエイトを取りましょう。~~
**（追記）2018年10月に前提条件が改定され、アソシエイトを飛ばしてプロフェッショナルを受けることが可能になりました！**


試験時間は170分と長丁場で問題数は80問です。
アソシエイトに比べて問題文が長めで、（選択肢から複数の）ベストプラクティスを選ぶ問題が多いのが特徴です。
**受験料は32,400円（税込）**とアソシエイトの倍です（落ちたらショックが大きい）

# 勉強の方法
- 先人たちの体験談読み漁り
    - [【AWS認定】ソリューションアーキテクト プロフェッショナル（AWS CSA-Pro）に合格してきた【英語重要】](https://qiita.com/tmiki/items/c83df748261c7b87ed18)
    - 上記はすごく参考になった！（でもLinux Academyとかは高いのでパス）
- 公式サイトのサンプル問題
    - 6問しかないがとりあえずやる
- [ブラックベルト](https://aws.amazon.com/jp/aws-jp-introduction/)
    - メジャーどころのサービスのSlideshareを読み込む
    - アソシエイトではあまり出なかった、Elastic Beanstalk、CloudFormation、Kinesis、Cognitoといったあたりも目を通す
- [Well-Architected フレームワーク](https://aws.amazon.com/jp/architecture/well-architected/)
    - AWSのペストプラクティスの公式見解が書かれているホワイトペーパーを読む
- 学習サイト（[AWS Web問題集で学習しよう](https://aws.koiwaclub.com/)）
    - ちょっとだけ無料でできるため実施。有料プランはやらず
- ヤフオクで見つけた問題集
    - 300問超。日本語の問題集は唯一？
    - アソシエイトのときに買ったもの（作者は別）と結構問題被ってるわりに答えが違ったりする。
    - あまり期待しないほうがよいかも


# 模擬試験
自分のPCからネット経由で受ける形です。40問と実際の試験の半分の問題数です。
本来は4,320円かかりますが、アソシエイトに受かると1回無料で受けられるバウチャーがもらえます。
アソシエイト合格して2週間ほど勉強続けたところで受験しました。

「75%くらい取れるといいなー」という気持ちで受けたのですが
#### **60%（不合格）:cry:**

問題文と自分の選択した回答はちゃんとスクリーンショットを撮って残しておきました。
カテゴリごとの正答率が出ているものの、どの問題が合ってるか間違ってるかも教えてくれません。
後輩にも協力してもらい、各問題の正解を調べます。

**※ 結果的に模試で出た問題は、実際の試験で出てきませんでした。**

# 追加で勉強
模試不合格でかなり追い込まれます（なにしろ落ちたら32,400円です）
ということでもう1回先人たちの体験記を読み直して辿り着いたのが以下です。

#### **[Jayendra's Blog](http://jayendrapatil.com/aws-solution-architect-professional-certification-exam-preparation-guide/)**


英語だったので毛嫌いしていたのですが、いろいろ見てみました。

- AWSのサービスごとにカテゴリ分けされて重要ポイントがまとめられている
- 記事の終わりには問題がいくつか載っており、重要サービス（よく出るカテゴリ）ほど問題数が多い
- 多くの問題は解説が載っている。回答が怪しい問題もあるがフォーラムでの議論も読むことができる。
- プロフェッショナルの試験で出そうな難易度の問題は、$\color{red}{\rm [PROFESSIONAL]}$と赤字でタグが付いている
- 模試で答えがわからなかった問題も載っている。

ということでGoogle翻訳を駆使しながらこれを必死にやりました。

# 試験会場
前回の渋谷では[ヒドい目](https://qiita.com/hamham/items/fbbae7a3b81b03c2ed8f#%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E7%99%BA%E7%94%9F)にあったので会場を変えて歌舞伎座タワーで申し込みました。
会場はキレイです。
私の他に同じ時間帯で5人ほどがAWSの試験を受けに来ていました。

# 試験開始
渋谷は[キオスク端末](https://qiita.com/hamham/items/fbbae7a3b81b03c2ed8f#%E8%A9%A6%E9%A8%93%E3%81%AE%E9%96%8B%E5%A7%8B%E5%89%8D%E6%89%8B%E7%B6%9A%E3%81%8D)でリモート試験官に監視されながらの試験でしたが、歌舞伎座は普通の端末でした。

試験が始まると[Jayendra's Blog](http://jayendrapatil.com/aws-solution-architect-professional-certification-exam-preparation-guide/)やヤフオク問題集（アソシエイト向けに買ったやつ）で見覚えある問題が結構でてきます。
反射的に回答がわかってるやつは早々に終わらせて、じっくり考える必要があるものに時間を使います。
結果的には試験時間を50-60分くらい余らせました。

# 結果は？
#### **85%（合格）:grin:**

# さいごに
とりあえず試験には受かりました。
受かるだけならこのやり方でいいと思いますが、本当に自分がAWSのプロフェッショナルたるスキルを持っているのかと自問自答するとまだまだだと思います。
とはいえ、肩書きが機会を生み、それによってさらなるスキルアップが図れるとポジティブに考えれば資格を取って損はないと思います。

最近業務では時代遅れなこと（オンプレのCiscoネット機器とか、OracleDBとか）ばかりやってたので、これを機にスキルをシフトしていこうと思います
CSSで矢印を作るスニペット

## 塗り矢印（下向き）

*イメージ*

<img width="162" alt="スクリーンショット 2018-08-15 23.23.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/74438/ab2bd5fc-c255-5bbc-a317-72abaa1d813e.png">


```html
<div class="arrow"></div>
```

```css
.arrow {
  position: relative;
}
.arrow::before {
  content: "";
  display: block;
  position: absolute;
  top: 0px;
  left: 50%;
  width: 0;
  height: 0;
  transform: translateX(-50%);
  border: 12px solid transparent;
  border-top: 12px solid #000;
  border-bottom-width: 0;
}
```

**右向きにする場合**

```css
  border-left: 12px solid #000;
  border-right-width: 0;
```

と変更してください。

## ライン矢印（下向き）

*イメージ*
<img width="139" alt="スクリーンショット 2018-08-15 23.27.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/74438/83dc34ed-245d-19d6-c519-1574e6ad4b05.png">


```html
<div class="arrow"></div>
```

```css
.arrow {
	position: relative;
}
.arrow::before {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  right: 50%;
  width: 14px;
  height: 14px;
  border-top: 2px solid #000;
  border-right: 2px solid #000;
  transform: translateX(-50%) rotate(135deg);
}
```

**右向きにする場合**

```css
 transform: translateX(-50%) rotate(45deg);
```

と変更してください。
Java SE の概観

### 個人的なメモ(Java SE
java有償化問題が職場で話題になっていたが、なんちゃってエンジニアにはそもそもJavaSEがわからないし、もっというとJREとJDKの違いが全くわからない。

そんなときにいい図を見つけたのでシェア。これで客と話せるはず！

https://docs.oracle.com/javase/jp/7/
はりぼてOSのメモリアロケータのRust移植+改良版 

Rust＋UEFIでOS作りたいので、はりぼてOSのメモリアロケータをRustに移植できないかなーと思ってやってみた。（あるものを流用した方が楽だよね。）
双方向線形リスト化するなどの改良が入ってるけど本質は同じもの。
[このGitHub](https://github.com/segfo/page_allocator)に上げてます。

ざっくりとした使い方はこんな感じ

```rs
    // インスタンスを生成する
    let mut manager = PageMemoryManager::new();
    
    unsafe{
        // UEFIのメモリマップとかから、情報をもらって
        // メモリ管理モジュールにメモリの空き情報を登録する
        manager.free_page_frames(memtranse(0x10000,0x1000));
        manager.free_page_frames(memtranse(0x14000,0x2000));
        manager.free_page_frames(memtranse(0x13000,0x1000));
        // 使う。領域は1ページの倍数で降ってくる。
        let mem1=manager.get_page_frames(0x2000).unwrap();
        let mem2=manager.get_page_frames(0x1000).unwrap();
        let mem3=manager.get_page_frames(0x1000).unwrap();

        println!("{:?}  pages:{}",mem1.memory(),mem1.pages());
        println!("{:?}  pages:{}",mem2.memory(),mem2.pages());
        println!("{:?}  pages:{}",mem3.memory(),mem3.pages());
    }
```

アロケートできなければpanicする。便利だなぁ。
C言語だったらifが確実に入って読みにくいコードになってた気がする。

Rustほんと便利なのでベアメタル環境とかで積極的に使われていくべきなんだよなぁ

きょうはここまで。
CakePHP入門（３） 〜レイアウト〜

デフォルトのレイアウトをいじってみます。
ここでは、Template/layout/default.ctpを複製して、my_layout.ctpとしました。コードを以下のように編集します。

```php:Template/layout/my_layout.ctp
<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <title>
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
    <section class="container">
        <?= $this->fetch('content') ?>
    </section>
</body>
</html>
```
- <?= $this->fetch('title') ?>
  - 各ビューファイルからタイトルを持ってきます。タイトルの渡し方は後ほど。
- <?= $this->Html->css('styles.css') ?>
  - styles.cssというスタイルシートを読み込んでいます。
- <?= $this->fetch('content') ?>
  - 各ビューファイルの内容がここに代入されます。
 
my_layout.ctpを全てのビューファイルで適用するために、AppController.phpの初期化処理に以下のコードを追加します。

```php:AppController.php
    ...

    public function initialize()
    {
        parent::initialize();

        $this->viewBuilder()->setLayout('my_layout');  //これを追加

        $this->loadComponent('RequestHandler', [
            'enableBeforeRedirect' => false,
        ]);
        $this->loadComponent('Flash');
    }

    ...
```

これでOKです。

さて、次に先ほど述べたタイトルの渡し方です。ビューファイルの先頭で、assignメソッドを用いて以下のように書いてあげます。

```php:
<?php
$this->assign('title', 'All Users');
?>

...
```

こうすると、my_layout.ctp にて、'All users'という文字列を'title'としてfetchできるようになるようです。

また、ビューの一部を使いまわしたい場合は、elementを使いましょう。例えば、ヘッダーは全てのページで共通しますね。全てのビューファイルにいちいち同じヘッダーコードを書く（またはコピペする）のは面倒です。
この場合は、src/Template/Element下に、my_header.ctpを作り、

```php:my_header.ctp
<header>My Blog</header>
```

呼び出したい箇所で、<?= $this->element('my_header') ?>としてあげると、この部分にmy_header.ctpの内容が代入されます。例えば以下のようにします。

```php:Template/layout/my_layout.ctp
<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <title>
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
    <?= $this->element('my_header') ?>   <!-- ここにheaderが代入される -->
    <section class="container">
        <?= $this->fetch('content') ?>
    </section>
</body>
</html>
```

（３）はここまでにします！


CakePHP入門（１）〜初期設定〜
https://qiita.com/jinto/items/f4545dfb02160c424d48


CakePHP入門（２）〜ファイルの作成〜
https://qiita.com/jinto/items/fe1da36b65fd6e704338

CakePHP入門（４）〜バリデーション〜　
https://qiita.com/jinto/items/ebdc8b673b5b663de7df
webpack-serveでcontentをwatchしてブラウザをライブリロードさせる

タイトル通りそういうことをさせたかったのですが、実現に意外にハマったので備忘録的にメモしておきます。

## 背景

旧 webpack-dev-server では `watchContentBase` というオプションがあって、ソースコードだけではなく contentBase、つまり静的ファイルの配信元ディレクトリも監視してファイルが更新されたらブラウザを更新するような設定ができました。これは割と便利なのだけど、我らが webpack-serve には公式にそんなオプションはありません。

[かなり初期の issue](https://github.com/webpack-contrib/webpack-serve/issues/6)で必要性が叫ばれていて、アドオンのレシピに追加されています。それが [docs/addons/watch-content.config.js](https://github.com/webpack-contrib/webpack-serve/blob/master/docs/addons/watch-content.config.js) です。しかし、[Watch content example is broken](https://github.com/webpack-contrib/webpack-serve/issues/264)なんて issue が立っているように、これは期待通り動かないです。

で、修正しようかなと思ったのだけど、取り急ぎ手元で作ってみたのでここに共有しておくことにしたわけです。

## 準備

[webpackとwebpack-serveで静的なWeb環境を作る](https://qiita.com/ma2saka/items/eb4190a009da9649583c)を下敷きにして作成する。なので、以下の説明はすべてそれをベースにしていることを断っておきます。

## ライブラリのインストール

ファイル監視の `chokidar` をインストールする。

```
npm install chokidar
```

## ファイル監視時にブラウザリロードする処理を実装する

ここでのポイントは、`webpack-serve` が利用している `webpack-hot-client` の貼った WebSocketのコネクションを利用することです。これによって、WebSocketのポート管理とかクライアントサイドの待ち受け処理などをサボっています。

そのために、`middleware.webpack()`の後に作成された `hotClient` の `server` を利用してメッセージを送信するようにしています。

```serve.config.js
const path = require("path");
const chokidar = require("chokidar");

const add = (app, middleware, options) => {
  middleware.webpack().then(result => {
    const server = result.hotClient.server;
    const watchPath = path.resolve(__dirname, "public", "*");
    const options = { ignoreInitial: true };
    watcher = chokidar.watch(watchPath, options);
    watcher.on("change", () => {
      server.broadcast('{ "type": "window-reload", "data": {} }');
    });
  });
};

const argv = {};
const options = {
  config,
  add,
  content: "public/",
  open: true,
  host: "0.0.0.0",
  port: 8080
};

serve(argv, options);
```

これで、開発サーバを起動した後、`public/index.html` などを更新すると自動的にリロードが走るようになります。

ファイル名とか見てないので、「今見ているページに関係ある場合だけ更新する」みたいなスマートなことはできないけど、だいたいにおいて期待することはこのレベルである気がする。

## window-reload について

webpack-hot-client の以下あたりで定義されている。hot-client のクライアント側ライブラリは、メッセージ `window-reload` が届くと `window.location.reload()` することがわかる。

- https://github.com/webpack-contrib/webpack-hot-client/blob/master/lib/client/index.js

今回はリロードのみだからこれにそのまま乗ったけど、もうちょっと細かい挙動の制御がしたければ自前で実装した方がよさそう。
「Unityではじめる2Dゲーム作り徹底ガイド」のCHAPTER5内での挙動がテキスト通りに行かずつまづきました。

Unityの初心者本でかなり早い段階で躓いた…。

##■目的
親オブジェクトのPlayerにRigidBody2Dを設定して物理演算周り、子オブジェクトのPlayerSpriteにSprite Renderを設定してアニメーション周りを受け持たせ、トリガーはPlayerのAnimatorから操作したい。

<img width="308" alt="スクリーンショット 2018-08-15 09.00.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/200229/4b5e9460-0e9f-852f-5b83-2fe8b9f0c792.png">

##■テキストに記載してある手順
1,PlayerAnimControllerという名前のAnimationControllerを作成する。
2,親オブジェクトのPlayerオブジェクトにAnimatorコンポーネントを追加し、上記のPlayerAnimControllerを設定する。
3,子オブジェクトのPlayer_Spriteを選択し、Animationビューを立ち上げ、Player_Idolという名前のAnimation Clipを作成する。
4,アニメーション用させるためのSprite画像をそのクリップにドラッグ&ドロップする。

結果、PlayerオブジェクトにはAnimatorコンポーネントが、その子オブジェクトであるPlayerSpriteにはSpriteRendererコンポーネントが存在し、紐付いたAnimationが存在する。

##■実行結果
<img width="561" alt="スクリーンショット 2018-08-15 20.23.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/200229/96b4cf5a-1d50-c99e-9ebe-fe84f612b24d.png">
3でクリップを追加するまではテキストの通りにいくが、Sprite画像を追加したときに

<img width="389" alt="スクリーンショット 2018-08-15 20.37.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/200229/e0b031d3-4808-719c-6857-f7c6fbd6ea18.png">
↑親オブジェクトであるPlayerオブジェクトにAnimationと紐付いたSpriteRenderが自動的に追加されてしまう。これでは物理演算とアニメーションを分担させるという目的が実現できない。

↓もはやAnimationはPlayerSpriteのものではなくなっている…。
<img width="402" alt="スクリーンショット 2018-08-15 20.37.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/200229/f9590827-df2e-a198-0c73-53100852390a.png">

試みとして、親オブジェクトにAnimatorを作成せず、子オブジェクトにクリップを作成しSprite画像を追加したら、子オブジェクトに自動的に子オブジェクトと同じ名前のPlayerSpriteというAnimatorコンポーネントと、PlayerSoriteというAnimationControllerが作成された。そのAnimatorコンポーネントを削除し、あとから親オブジェクトにAnimatorを追加して、PlayerSpriteControllerを参照しても、Animationクリップが見つからなくなってしまう。
<img width="300" alt="スクリーンショット 2018-08-15 22.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/200229/fbecb4e7-729d-8f48-2156-a4423aa39705.png">

この基本構造がうまくできてないと、テキストを進められないので非常に困っています。
この記事を見かけたUnityに詳しい方、アドバイス頂ければ嬉しいです。
JUCEチュートリアルの進め方

公式サイトの[JUCEチュートリアル](https://juce.com/learn/tutorials)の並び順通りに進めるとこれ何なの？という状態を保留しながら進めないといけなくて気持ち悪かったので進めながらのメモを共有。

[Tutorials | JUCE](https://juce.com/learn/tutorials)

# 1.基本のProjucer操作

- [Getting started with the Projucer](http://docs.juce.com/master/tutorial_new_projucer_project.html)
- [Manage your Projucer projects](http://docs.juce.com/master/tutorial_manage_projucer_project.html)
- [Choosing the right Projucer template for your application](http://docs.juce.com/master/tutorial_choosing_projucer_template.html)

JUCE操作の基本となるProjucerアプリケーションの使い方についてとそれぞれのProjucerテンプレートについての説明を最初に。
**Getting Started**のプラグイン関連についてはそもそもプラグイン作る予定がないというのと、現状でチュートリアル進めてもコード通りにやったらよくわからないプラグインが出来た程度の満足度しか無いので飛ばしましたがとりあえず自前のコードがDAWで読める感を得ることでモチベーションにつながる可能性もあるのでそのあたりはご判断ください。

早く音を出したいところですがここからしばらく（**Audio/Synth/MIDI/Plugins/DSP**）飛ばします


# 2.テンプレートのcppファイルを解読するために突然Graphicsカテゴリへ
- [The application window](http://docs.juce.com/master/tutorial_main_window.html)
- [The main component](http://docs.juce.com/master/tutorial_main_component.html)

JUCEに置けるメインのクラスである`JUCEApplication`および`main Component`についてようやく出てくる。これがわからない状態でオーディオ出してもそもそもこれ何という状態が続く。

# 3.コンポーネントについてもう少し詳しく知る＋UI関連の基本
**Graphic**は上記2記事で飛ばしていきなり**Interface Design**へ。
アプリケーションの見た目や色クラス、簡単なDraw系のチュートリアルなどをスルーしながら今後必要になるいくつかのチュートリアルを選択。マストなのは以下3件。
まだ音が出ないが音を出すチュートリアルに突然スライダーとか出てくる。

- [Parent and child components](http://docs.juce.com/master/tutorial_component_parents_children.html)
- [Listeners and Broadcasters](http://docs.juce.com/master/tutorial_listeners_and_broadcasters.html)
- [The Slider class](http://docs.juce.com/master/tutorial_slider_values.html)

それぞれネストされたコンポーネントを作る方法、UIクラスのイベントをどうやって利用するか、具体的なUIパーツについての詳細チュートリアルになっている。スライダーに追加して`Label`, `ComboBox`, `RadioButton`あたりを進めてもいいがこれをやっているとウェブのフロントやってる気持ちになるので注意。

# 4.やっと音が出る。
- [Synth > Build a white noise generator](http://docs.juce.com/master/tutorial_simple_synth_noise.html)
- [Synth > Control audio levels](http://docs.juce.com/master/tutorial_synth_level_control.html)
- [Synth > Control audio levels using decibels](http://docs.juce.com/master/tutorial_synth_db_level_control.html)
- [Synth > Build a sine wave synthesiser](http://docs.juce.com/master/tutorial_sine_synth.html)

1つ目のノイズジェネレーターのサンプルコードは2つ目の記事でこうすると良いよというコードが入っていて1つ目の記事では全く触れられていないので読み飛ばしていいです（スライダー変更時にクリックノイズが出なくするような実装）

ただしここら辺からbufferに書き込む系の作業が入ってくるため他にAudioUnit等でオーディオバッファごとの処理をやった経験がないと若干躓く可能性ありでこの辺りはJUCE外に何らかの情報を求める必要があるかもしれない。あと使用する各クラスについての詳細はないので`AudioBuffer`クラス、`AudioSampleBuffer`クラス、`AudioSourceChannelInfo`、あたりのリファレンスは一通り確認しておいたほうがここの行を読みやすい。

オーディオの加工優先であれば**Audio**カテゴリを優先でも問題ないかと思う。


# その他

その他ランダムクラス、ファイル操作、プラグイン関係、MIDIなどはそれぞれ必要だと思われるものを選択。個人的にはInternalクロックで動くシーケンサー実装について知る必要があったがそれについてのチュートリアルがなかったためそういうのはGithubとかでコード探してTimerクラスのリファレンス読みながらどうにかするしかない感じでした。
EC2 のコスト・性能を比較する gem ec2spec を作った

# TL;DR

- EC2 のコスト・性能を比較する gem [ec2spec](https://github.com/kyoshidajp/ec2spec) を作った
- CLI とライブラリの2通りの利用が可能

# 類似のツール

- [Amazon Web Services Simple Monthly Calculator](https://calculator.s3.amazonaws.com/index.html)
- [Amazon EC2 Instance Comparison](https://www.ec2instances.info/)

これらのツールでは、リージョンやインスタンスタイプをキーに対象を絞るのが一般的な使い方ではないでしょうか？

ec2spec ではインスタンスタイプは対象ホストから、金額やスペックは [AWS Price List API](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/price-changes.html) から取得しています。リージョンは割り切って、オプションで指定するようにしました。また、OS は Linux、料金タイプはオンデマンドに限定しています。

個人的な用途として、**すでに可動しているホストを比較したい場合が多く**、リージョンは決まっているのでこの様にしました。

# 使い方

gem でインストールできます。

```
$ gem install ec2spec
```

bundler 経由でも OK です。その場合、以降の実行コマンドは bundler 経由に読み替えてください。

実行は次の通りです。

```
$ ec2spec ssh -h host1 ... [options]
```

例えば `host1`、`host2`、`host3` を比較するには次のように実行します。

```
$ ec2spec ssh -h host1 host2 host3
I, [2018-08-12T20:54:25.814752 #64341]  INFO -- : Started: host1
I, [2018-08-12T20:54:25.814835 #64341]  INFO -- : Started: host2
I, [2018-08-12T20:54:25.814867 #64341]  INFO -- : Started: host3
I, [2018-08-12T20:54:25.826113 #64341]  INFO -- : Finished: host3
I, [2018-08-12T20:54:29.385848 #64341]  INFO -- : Finished: host1
I, [2018-08-12T20:54:37.560003 #64341]  INFO -- : Finished: host2
+---------------+-------------+-------------+-------+
|               | host1       | host2       | host3 |
+---------------+-------------+-------------|-------+
| instance_type |    t2.micro |  c4.2xlarge |   N/A |
|   instance_id |  i-xxxxxxxx |  i-yyyyyyyy |   N/A |
|          vCPU |           1 |           8 |   N/A |
|        memory |       1 GiB |      15 GiB |   N/A |
| price (USD/H) |      0.0152 |       0.504 |   N/A |
| price (USD/M) |     11.3088 |     374.976 |   N/A |
+---------------+-------------+---------------------+
```

ご覧のように対象ホストについて、それぞれ次の項目を出力しています。

- インスタンスタイプ
- インスタンス ID
- vCPU
- メモリ
- 料金（USD で1時間と1ヶ月）

`host3` は何らかの問題でデータが取得できなかったため、すべての値が `N/A` になっています。

ライブラリとして使用する事も可能です。次はコンソールから使用した例です。

```
> require 'ec2spec'
> hosts = %w[host1 host2]
> client = Ec2spec::Client.new(hosts, 30, 'hash')
> result_json = client.run
> puts result_json
I, [2018-08-12T20:54:25.814752 #64341]  INFO -- : Started: host1
I, [2018-08-12T20:54:25.814835 #64341]  INFO -- : Started: host2
I, [2018-08-12T20:54:29.385848 #64341]  INFO -- : Finished: host1
I, [2018-08-12T20:54:37.560003 #64341]  INFO -- : Finished: host2
=> {"host1":{"instance_type":"t2.micro","instance_id":"i-xxxxxxxx","vCPU":"1","memory":"1 GiB","price (USD/H)":0.152,"price (USD/M)":11.3088},"host2":{"instance_type":"c4.2xlarge","instance_id":"i-yyyyyyyy","vCPU":"8","memory":"15 GiB","price (USD/H)":0.504,"price (USD/M)":374.976}}
```

`Hash` 形式でデータを取得して、出力しています。

## オプション

| オプション名 | 説明   |
| :--------| :----- |
| -h, --host | ホスト名 |
| --days | 1ヶ月を何日とするか |
| --format | 出力フォーマット（**デフォルト:** `plain_text`） |
| --region | EC2 のリージョン（**デフォルト:** `ap-northeast-1`） |
| --debug  | デバッグモードオン |

# 今後の展開

今後考えている機能は次の通りです。

- 金額を日本円など他の通貨で表示
- 対象ホストへの接続設定ファイルの指定オプションを追加
   - `ssh` コマンドの `-F` オプションをイメージ
- インスタンスID をキーとしたキャッシュ化
- 取得した Price List API のキャッシュ更新