OmniAICreator/Qiita-1.07M huggingface dataset:
Androidのホームアプリでホームボタンが効くようにするには

世の中には技術的な情報を集める手段がたくさんあります。
先週の[弊社CTOの記事](https://qiita.com/caesar_cat/items/0d9ebf063db6972e4311)にもありますが、インターネットを利用すれば大抵の問題は解決できますし、勉強会に参加することでも解決できるかもしれません。
ただし、そこには情報を提供する人間が語らない情報はありません。
つまり得られる情報はどうしても偏ってしまいます。

今回は、

1. 情報を提供する人が知っていて当然と思っている情報
2. そもそも知っている人が少なくて提供されない情報

なのかなぁ？と感じたAndroidのホームアプリの作り方をまとめます。

# ホームアプリを作ったことはありますか？

皆さんはホームアプリを作ったことはありますか？
個人的なイメージでは仕事でも趣味でもあまり作らない種類のアプリではないかと思います。
単純にホームアプリを作ろうと思って検索をかけると多くの情報が出て来るので、きっとこの段階で困る人は少ないでしょう。

ホームアプリのAndroidManifest.xmlのルートアクティビティに下記のintent-filterを記述するだけでOKです。

```xml
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    <category android:name="android.intent.category.HOME" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
```

# ホームアプリ表示中にホームボタンを押すと...

さて、ホームアプリに画面遷移が１つもない場合はこれで問題ないのですが、画面遷移が入って来ると問題が発生します。

**ホームボタンを押してもホームアプリの初期画面に戻りません。**

ホームボタンのイベントを直接ハンドリングすることはできませんし、onUserLeaveHint等のライフサイクルメソッドも呼ばれません。

しかもSDK付属のサンプルアプリでも発生しているため参考にならず、市販されている端末のホームアプリでは初期画面が表示されるため仕様ですとは言えません。

# 困ったときは

「やはり公式のドキュメントが一番！」と言いたいところですが、読みこんでいってもそれらしい情報が見当たりません。

最終的に行き着いたのはAOSPの[Launcher3](https://android.googlesource.com/platform/packages/apps/Launcher3/)のソースコードでした。
今回は設定周りだと思ったのでAndroidManifest.xmlのルートアクティビティに対する記述を見てみます。

```xml:Sample
<activity
    android:name="Home"
    android:theme="@style/Theme"
    android:launchMode="singleInstance"
    android:stateNotNeeded="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
```

```xml:AOSP
<activity
    android:name="com.android.launcher3.Launcher"
    android:launchMode="singleTask"
    android:clearTaskOnLaunch="true"
    android:stateNotNeeded="true"
    android:windowSoftInputMode="adjustPan|stateUnchanged"
    android:screenOrientation="nosensor"
    android:configChanges="keyboard|keyboardHidden|navigation"
    android:resizeableActivity="true"
    android:resumeWhilePausing="true"
    android:taskAffinity=""
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.MONKEY" />
    </intent-filter>
</activity>
```

全然違いますね。
この差分から解決に必要な設定を探しました。

# そして解決へ

結論としてはclearTaskOnLaunchをtrueにすることで解決しました。
[ドキュメントの説明](https://developer.android.com/guide/topics/manifest/activity-element.html?hl=ja#clear)を読んでもこの設定によってホームボタンが効くようになる印象は受けないので少しモヤモヤするところですが、Googleのランチャーアプリを参考にしているので問題ないでしょう。
心配な方はルートアクティビティの設定をそのまま利用すると安心かもしれません。

# まとめ

問）自作ホームアプリでホームボタンを押下してもうんともすんとも言わない問題を解決せよ。
答）AndroidManifest.xmlのルートアクティビティの設定にandroid:clearTaskOnLaunch="true"を追加する。
adb reverseでerror: closedと出る

# Situation
ReactNativeのAndroidでの実機検証で出たエラー
Androidバージョンは4.4.4 KitKat

# Problem
```
MacBook-Pro:Project user$ adb reverse tcp:8081 tcp:8081
error: closed
```

# Solution
https://stackoverflow.com/questions/31525431/getting-error-closed-twice-on-adb-reverse

Android 4.4.4だとadb reverseができないらしい...
Android 5.0 Lollipop以降だと大丈夫。
Chrome拡張を使って Django を起動せずにテンプレートのデザインを確認する方法

#この記事について

Djangoのテンプレートの拡張子は「.html」です。

Ajaxを使えば組み込みタグは不要になり、Webデザイナーの編集作業が独立して出来ると期待したんですが、静的コンテンツの組み込みタグ（例:`<img src="{% static 'myapp/a.jpg' %}" alt="My image" />`）は外せないのでそのままではダメと悟りました。

Chrome拡張のJavaScript挿入機能を使い、とりあえず 画像とcssのリンクを、staticタグから通常のリンクに置き換える手法を考えてみました。

#目的

テンプレート内のstaticファイル用の組み込みタグを、ブラウザ拡張で通常のリンクに変換する。ブラウザの「ファイルを開く」から表示しても変換されるようにする。

BEFORE:`<img src="{% static 'myapp/a.jpg' %}" alt="My image" />`
AFTER: `<img src="../../static/myapp/a.jpg" alt="My image">`

```html:template.html
<!DOCTYPE html>
<html lang="en">
<body>
    <!-- {% load static %} -->
    <img src="{% static 'myapp/a.jpg' %}" alt="My image" />
</body>
</html>
```


#環境

- Windows7 64bit
- Python3.6 
- Django 1.11
- Google Chrome 62.0


#設定手順

### ScriptAutoRunnerをインストール
Chromeで拡張機能「ScriptAutoRunner」をインストールする。

[ScriptAutoRunner - Chrome ウェブストア](]https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm?hl=ja)

他のブラウザのJavaScript挿入機能でも同様に可能だと思いますが、ローカルファイルにも適用できるタイプのものは限られるようです。

### ローカルファイルへのアクセスを許可

Chromeの設定→その他ツール→拡張機能より拡張機能の一覧を表示、ScriptAutoRunnerのチェックボックス「ファイルのURLへのアクセスを許可する」をチェック。
これでローカルファイルでもJavaScriptが実行されます。

### ScriptAutoRunnerに変換コードを設定

使い方はこちらの記事が詳しいです。
[任意のサイトで任意のJavaScriptを自動実行させるChrome拡張](https://qiita.com/nakajmg/items/bcbf0e5debcfa70c8d63)
[ScriptAutoRunnerで遊んでみる（フォームをいろいろ）](https://qiita.com/itaya/items/36ed8b890c87ac47d9d3)

ScriptAutoRunnerの設定画面を表示し、「</>」ボタンで追加エントリを表示、以下のコードを入力する

```js:js
var re = new RegExp("{% static '(.*)' %}")
a = document.getElementsByTagName("*")
for (var i = 0; i < a.length; i++) { 
    src = a[i].getAttribute("src")
    if (src && re.test(src)){
        new_src = src.replace(re, '../../static/$1')
        a[i].setAttribute("src", new_src)
    }
}
```

最後にプラグのアイコンをクリックして有効化する。

### テンプレートファイルを開く

Chrome上で「Ctrl + O」でテンプレートファイル選択、もしくはファイルをドラッグアンドドロップでもOKです。成功すればsrc属性のstaticタグが、プロジェクト内のstaticディレクトリへのリンクに変換されます。

ScriptAutoRunner適用前
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/217094/78900a55-71e8-c31d-7f0f-ff560791a770.png)


ScriptAutoRunner適用後![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/217094/41759bb8-ee06-ce57-0237-8abc8a03a236.png)



ただし、この方法はstaticタグで読み込むJavaScriptが実行されないので、残念ながらあまり汎用性はありません…
まずふつうのリンクでHTMLを作って、受け入れの時にstaticタグに置き換える方法が確実なんですかね。
RubyからSlack-API

# RubyからSlack-API
## 目次
 - はじめに
 - 準備
 - 実践
 - 応用

## はじめに
AdventClendar"Slack"が空いていたので、この記事を書くことになりました。
Slackで嫌がらせメッセージを送りたいときに結構使います（笑）
## 準備
### Slackにbotユーザーを作る
https://api.slack.com/apps
上にアクセスして、Create an Appをクリックします。
![スクリーンショット 2017-12-01 9.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/128374/b94e593c-1738-725e-940c-fd974deaffab.png)
そこで、botの名前とslackチームを選択します。
私は,"TestBot"にしました！
作ったら出てくるページの下の方のVerification Tokenのtokenをメモしておきましょう！
![スクリーンショット 2017-12-01 9.50.59.png](https://qiita-image-store.s3.amazonaws.com/0/128374/fe36340b-64e1-71a3-160e-3edf0c47b99e.png)
### gemInstall
`gem install slack-api`を実行します
これで、準備が完了です！
## 実践
下の`YOUTOKEN`をあなたの先ほどのTokenに置き換えて、実行して見ます。

```
require 'slack-api'
# 先ほどのTokenを下に入力
TOKEN = 'xxxxxx'

Slack.configure do |conf|
  conf.token = TOKEN
end

client = Slack::RealTime::Client.new

client.on :hello do
  puts 'connected!'
  client.message channel: 'your_channel_id', text: 'connected!'
end
```
上のようにすることで、slackにポストできちゃいます！
## 応用
Slack-APIを使うと、返事？？もできるらしいです。
（例："スケジュール"とダイレクトメッセージで送信すると、今日のGoogleカレンダーが表示されるなど..etc..）
貂が可愛い！ 新フォント貂明朝のイラストをウェブページで表示する方法

2017年11月28日、Adobeが新フォント「<a href="https://blogs.adobe.com/CCJKType/2017/11/ten-mincho-ja.html" >貂明朝（てんみんちょう）</a>」を発表し、その可愛らしいフォントが話題になっています。

※ 「貂」とはイタチ科の動物のこと

また、可愛らしいイラスト文字も楽しめます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67884/36c58bdd-a73f-dfc1-4d7e-9fd22077684c.png)

貂明朝はAdobeが提供しているサービス「[Typekit](https://typekit.com/)」に含まれているため、Creative Cloudユーザーであればウェブページ上のフォントとして表示することが可能です。本エントリーでは、貂明朝とそのイラスト文字をウェブページで表示する方法について紹介します。

# 貂明朝をウェブフォントとして使う
[Web サイトへのフォントの追加](https://helpx.adobe.com/jp/typekit/using/add-fonts-website.html)の手順に従って、貂明朝をウェブフォントとして追加します。これを行わないと貂明朝は使えないのでご注意ください。

設定後、HTMLの`<head>`タグに次のように記述します。

```html:HTML
 <script src="https://use.typekit.net/fya1swr.js"></script>
 <script>try {
    Typekit.load({async: true});
  } catch (e) {
  }</script>

```

CSSの`font-family`で`"ten-mincho"`を指定すれば、貂明朝がウェブフォントとして使えるようになります。

```css:CSS
body {
  font-family: "ten-mincho", serif;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67884/f6c90eb8-8cb9-0099-96f4-8bc37cb11502.png)

- [貂明朝のウェブフォント表示デモ](https://tonkotsuboy.github.io/kanobox/171201_tenmincho/step1.html)

# イラスト文字の表示
イラスト文字のうち、次の表示は簡単です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67884/f698e779-ebd4-f7fb-61db-ccaa6b7d79fb.png)

次のようにHTMLで記述するだけです。

```html:HTML
<p>☀ ☁ ☂ ☃ ☜ ☝ ☞ ☟ 〠 〽︎</p>
```

# イラスト文字の貂の表示

![](https://qiita-image-store.s3.amazonaws.com/0/67884/4e4947eb-bea4-a488-8145-34b9c9e865c1.png)

4匹の貂のイラストを表すには、次の2ステップが必要です。

1. 貂用のHTMLを記述
2. CSSの`font-feature-settings`を使って異体字を設定

## HTMLの記述

4匹の貂は、**全角**英数の`Ｌ`、`Ｏ`、`Ｖ`、`Ｅ`にあたります。本エントリーのコードをコピーするか、[全角半角 変換ツール](https://so-zou.jp/web-app/text/fullwidth-halfwidth/)を使って変換するとよいでしょう。

```html:HTML
<p>ＬＯＶＥ</p>
```

## CSSで `font-feature-settings`を設定
貂のイラストは異体字として存在するので、OpenType フォントの機能を制御できる「[font-feature-settings](https://developer.mozilla.org/ja/docs/Web/CSS/font-feature-settings)」プロパティで、次のように指定します。

```css:CSS
body {
  font-feature-settings: "ss02";
}
```

※ [ss02](https://www.microsoft.com/typography/otspec/features_pt.htm#ssxx)の指定の根拠は「[「貂明朝」は日本語フォントの新たな領域へ - CJK Type Blog](https://blogs.adobe.com/CCJKType/2017/11/ten-mincho-ja.html)」の「OpenType フィーチャー」より

ブラウザでの表示結果が下記となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67884/480b1723-abfb-b712-903a-9c64649dae25.png)

[貂明朝のイラスト文字表示（全角英数字を使用）](https://tonkotsuboy.github.io/kanobox/171201_tenmincho/step2another.html) 

ただ、全角英数はコードを使うとフォントによってはコード上の見た目が分かりづらかったり、PCの設定で入力しづらかったりします。使うときには注意しましょう。4匹の貂はそれぞれ`65324`、`65327`、`65334`、`65317`で表せますので、こちらを使うという選択肢もあります。

# せっかくなので回してみた
本エントリーの手法で表示した貂たちをアニメーションさせてみました。

「[貂明朝 - PDCA](https://tonkotsuboy.github.io/kanobox/171201_tenmincho/pdca.html)」

動画での様子はこちら。

![Kapture 2020-08-29 at 18.41.29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67884/19a2c196-5203-b257-f964-27526e7b03fe.gif)


# かわいい貂をあなたのウェブページに
こちらの手法はChrome、Firefox、Safari、Edge、iOS Safari、Android Chrome、そしてIE 11など、主要ブラウザ全てで動作します。コピペで使えるサンプルとなっていますので、ウェブページに可愛らしい貂を表示してみてください。
文字列の基本的な定義、表記法など

#文字列とは
文字の集合をアルファベットという．アルファベット $\mathit{\Sigma}$ 上の文字列とは $\mathit{\Sigma}$ 中の文字を $0$ 個以上並べた列のことである．長さ $0$ の文字列は空文字列 $\mathit{\varepsilon}$ という．

例えば， $\mathit{\Sigma=\\{a,b\\}}$ 上の文字列は
$\mathit{\varepsilon}$，
$a$，
$ab$，
$baabb$
などである．

アルファベット $\mathit{\Sigma}$ 上の長さ $\mathit{k}$ の文字列全体の集合を $\mathit{\Sigma}^k$ と表現し，アルファベット $\mathit{\Sigma}$ 上の文字列全体の集合を
 $\mathit{\Sigma^*}$ と表現する．

例えば， $\mathit{\Sigma=\\{a,b\\}}$ のとき，
$\mathit{\Sigma}^0=\\{\mathit{\varepsilon}\\}$， 
$\mathit{\Sigma}^1=\\{\mathit{a,b}\\}$，
$\mathit{\Sigma}^2=\\{\mathit{aa,ab,ba,bb}\\}$，
$\mathit{\Sigma}^*=\\{\mathit{\varepsilon,a,b,aa,ab,ba,bb,aaa,aab,\ldots}\\}$
である．

#部分文字列・接頭辞・接尾辞

$\mathit{|S|}$ を $\mathit{S}$ の長さ，$\mathit{S}[\mathit{i}]$ を $\mathit{S}$ の$\ \mathit{i}$ $\(\mathit{i}\in\[1,\mathit{|S|}\]\)$ 番目の文字とする．
文字列 $\mathit{S=S}[1]\mathit{S}[2]\ldots \mathit{S}[\mathit{|S|}]$ の部分文字列$\ \mathit{S}[\mathit{l,r}]$ とは，文字列 $\mathit{S}$ 中に出現する開始位置が $\mathit{l}$ で，終了位置が $\mathit{r}$ である文字列 $\mathit{S}[\mathit{l}]\mathit{S}[\mathit{l}+1]\ldots \mathit{S}[\mathit{r}]\(1\leq \mathit{l}\leq \mathit{r}\leq \mathit{|S|}\)$ のことである．
ただし，$\mathit{\varepsilon}$ も文字列 $\mathit{S}$ の部分文字列である．

例えば， $\mathit{S=abaab}$ のとき
その部分文字列は
$\mathit{\varepsilon,a,ab,baa,aa,aab,abaab}$
などである．

接頭辞と接尾辞は特殊な部分文字列である．
文字列 $\mathit{S}$ の接頭辞とは開始位置が $1$ の $\mathit{S}$ の部分文字列 $\mathit{S}[1,\mathit{r}]\(1\leq \mathit{r} \leq \mathit{|S|}\)$ である．
ただし，$\mathit{\varepsilon}$ も文字列 $\mathit{S}$ の接頭辞である．

例えば，$\mathit{S=abaab}$ のとき，
接頭辞は
$\mathit{\varepsilon,a,ab,aba,abaa,abaab}$
である．


文字列 $\mathit{S}$ の接尾辞とは終了位置が $\mathit{|S|}$ の $\mathit{S}$ の部分文字列
 $\mathit{S}[\mathit{l},\mathit{|S|}]\(1\leq \mathit{l} \leq \mathit{|S|}\)$ である．
ただし，$\mathit{\varepsilon}$ も文字列 $\mathit{S}$ の接尾辞である．

例えば，$\mathit{S=abaab}$ のとき，
接尾辞は
$\mathit{abaab,baab,aab,ab,b,\varepsilon}$
である．
[re:inventレポート] Cloudformation DeepDiveで発表された今後の機能

今回はCloudformation、「DEV317-R - [REPEAT] Deep Dive on AWS CloudFormation」の参加レポートです

会場は他のセッションと違い、Theatreを使っており独特な雰囲気があるよいところでした。
DeepDiveだけあって基本機能の紹介は一切なく、直近提供した/提供予定の機能がProductManagerとAdvocateの方から紹介がありました

ツアー参加者向けのwrapupでも出て来ないくらいの情報でしたが価値はあると思ったのでまとめます。

12/6追記
本セッションの動画が公開されていますのでリンク張っておきます
https://www.youtube.com/watch?v=01hy48R9Kr8

## Stackの削除保護機能

Stackを間違って消してしまうことがないように保護する機能。
Cloudformationは複数のリソースを一気に作れるのはよいですが、間違った操作をするとひどいことになります。そうならないように追加した機能とのこと。

これはすでに実際の環境に適用されています。
初期状態で保護になっていないリソースもあるのでCloudformation使っている方は一度チェックしてみてください
スタックの概要タブに追加されています

![IMG_0143.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/c7b3a58c-71ad-e2ae-d09f-6d8de0c88eb1.jpeg)

## Stackのdrift管理（コンソールなどから設定を変更したことがわかる）

これはすばらしい機能拡張。

Cloudformation使っててよくあるのが、少しの設定変更の際にいちいち設定ファイルを直すのではなく画面からぽちっとやってしまうこと。開発者以外がやってしまうケースもあり、気づけないところがたちが悪い。
そういうことが想定されるケースでは、最初だけCloudformation使って一気にリソースを作ってあとはコンソールから触ることにするという運用ルールにしていましたが、この機能でInfrastructure as a Codeの徹底ができます。ほんとすばらしいです。

少し見づらくて申し訳ありませんが、DriftStatusというところで確認可能です
![IMG_0147.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/32c7dbfa-937a-b244-2b5a-b2fe03d68da6.jpeg)

しかも差分まで表示されるという。
![drift.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/69b1660a-4ef0-4d19-8dfa-8225ff496260.jpeg)
※12/6 見にくかったので画像置き換えました

2018年の早めには提供予定とのことでしたので待ち遠しいですね。

## AWS Configを使ったStackの変更履歴管理

AWSConfigを使ったことがなく、どういった使い方になるのかわからないのですが、画像にあるように視覚的にどんな変更がいつ行われたのかを確認できるような機能が追加されるようです
![IMG_0151.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/e9f550e1-f160-e13b-fd4e-a4227195416c.jpeg)

CloudformationのParameterの値とかに使われるのですかね・・？

## リージョン、アカウントを超えたプロビジョニング

システムによっては環境ごとにアカウントを作成することがあるかと思いますが、そういった場合でも一気にCloudformationで作れますという機能。

正直なところ、各環境で作るので特に困っていない（というかテスト環境から本番環境触るの嫌です）のですが、テスト環境が複数必要な場合には重宝するのかもしれません。

以下のようなコンセプトだとのこと。複数のStackをStackSetという概念でまとめます
![IMG_0153.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/049aa734-3a0b-1613-af14-491d9a5ab10d.jpeg)

デモで紹介されていた画面です。ここで対象アカウントやリージョンを選択します。
![IMG_0156.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/80bf0434-3492-a411-bc22-f05447bf2593.jpeg)

## バリデーション！

アジェンダにバリデーションと書かれていたので期待していたのですが、ここは期待外れでした。

以下の構成にあるように、CodeBuildやLambdaを使って個別に検証ロジックを実装しているだけのようでした。Lambdaでやればできるのはわかりますが、変更頻度に対して維持コストが高すぎるかと。。
![IMG_0157.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/5e7a59cb-bda4-ce9f-8640-863bba9538b8.jpeg)

既にどこかにあるかもしれませんが、Lint的なもので構文チェックしてくれるだけで十分価値があるのですがどうなのでしょう。
それとも何かのIDEで設定ファイル簡単に作れるのですかね？

## 感想

バリデーション部分は残念だったものの、保護機能やdrift機能など期待できるものが多くありました。
数々の新サービスが目立って、古くからあるサービスの情報は一切流れていませんが、着実に成長しているということはありがたいことです。

＃世間的にもterraformとか3rd partyツールに流れてあまり使われていないんですかね・・？
[Swift]TableViewからモーダルウィンドウに遷移する方法

アプリでモーダルウィンドウを表示させようとしたら、詰まってしまっtのでメモ。
イメージとしてはこんな感じ
<img width="375" alt="fullsizeoutput_907.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/175906/538fbf69-549a-3962-4f3c-d3e9dc4320f8.jpeg">
　　　　　　　　　　　⇩
<img width="375" alt="fullsizeoutput_908.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/175906/09f188b3-50da-0f05-b0f1-99e753aac5d3.jpeg">

当初は下記の記事を参考に、実装したものの、「present」で画面遷移しようとすると、遷移先のVCが取得できずエラーが発生。
調べてみると、tableviewで遷移する時は使用できないので、「override func prepare」で遷移先のデータを準備してから、「performSegue」で遷移する方法に変更。
https://qiita.com/ngo275/items/80477dd74f77328eb4e0

```swift:ViewController.swift
//遷移元のVC

    func tableView(_ table: UITableView,didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "Modal", sender: nil)
    }
    
    // Segue 準備
    override func prepare(for segue: UIStoryboardSegue, sender: Any!) {
        if (segue.identifier == "Modal") {
            guard let ModalVC = segue.destination as? ModalViewController else {
                return
            }
            
            ModalVC.modalPresentationStyle = .overCurrentContext
            ModalVC.view.backgroundColor = UIColor(red:0.94, green:0.94, blue:0.96, alpha:0.5)
            
        }
    }
```

```swift:ModalViewController.swift
//遷移先のVC

class ModalViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
//ここで閉じるボタン以外をタップした場合でも画面が閉じるように処理を記載
//tagで管理するとコードが書きやすい
        super.touchesEnded(touches, with: event)
        for touch: UITouch in touches {
            let tag = touch.view!.tag
            if tag == 1 {
                dismiss(animated: true, completion: nil)
            }
        }
        
    }
    
    @IBAction func didTapClose(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
```

記事の書き方がよくわからないけど、毎日詰まったところを書くだけで、かなり知識が整理される！！
頑張ります。
Wgetしてスクレイピングする

アドベントカレンダーの1日目が空いていたので、飛び込みで記事書きます。

# はじめに
　WEBサイトをスクレイピングするときに、しばしば面倒なことにぶつかります。

- スクレイピング対象から、想定どおりに文字が取り出せない
- スクレイピングしたいけど、クローラーをつくるの面倒
- あとからスクレイピングしたい箇所に気が付いた
- スクレピング先に大きな負荷かけたくない

　それ、コンテンツを取得するダウンローダ「Wget」で解決しましょう。

# Wgetとは

すでにご存知の人は読み飛ばしてください。

コンテンツを取得するダウンローダ「Wget」、その歴史は1996年まで遡ります。それからの歴史の詳しいことは[Wikipedia - Wget](https://ja.wikipedia.org/wiki/GNU_Wget)を見ていただくとして、いろいろバージョンアップを重ねて、urlを入力してブラウザで表示するレベルなら十分すぎるほどの便利なダウンロードできるツールとして活躍しています。

Linux OSと呼ばれるたいていの環境には、インストール済みであることが多く、素の状態のLinuxからソフトウェアパッケージや証明書のダウンロードなどで使ってたりします。

とても簡単に使えるWget、いろいろなオプションを使いこなすとクローラー＋スクレイピングの手助けをしてくれるツールとして便利に使えます！

# Wgetの使い方

## とりあえず実行してみる

```shell
$ wget https://qiita.com/
```

シェルを開いて`Wget`コマンドのあとにURLを入力して、実行してみてください。
するとQiitaのトップページをダウンロードすることができます。

ね、簡単でしょ？

## ダウンロードしたらhtmlファイルだけで画像がないんだけど？

最初の`Wget`コマンドは`https://qiita.com/のindex.htmlをダウンロードして`という内容でした。「index.htmlをダウンロード」を実行した結果が、愚直にhtmlファイルだけダウンロードされました。

もう少し融通をきかせて欲しい感じもしますが、画像を収集したいときに困ります。
そんなときは、`-r`と`-l 1`オプションを使います。

```shell
$ wget -r -l 1 https://qiita.com/
```

これでindex.htmlファイルと関連しているファイル(画像など)がダウンロードできました。ちなみにオプションの`-r`は`再帰的にダウンロード`します。……htmlファイルのなかのリンクを解析しながら、そのリンクをダウンロードします。言葉にするとややこしいですが、ブラウザでリンクを片っ端から開くようなイメージです。

また、`-l 1`はリンクの深さを指定します。Wgetの実行時に指定したurlをゼロの起点として、リンクをたどったときに深さがカウントアップします。つまり、`https://qiita.com/`ページにあるリンク先は`深さ:1`と考えられます。深さを1まで制限することで、指定したurlに係わるコンテンツをダウンロードできるわけです。

## サイトをまるっとダウンロードしたい

さきほどのオプション`-r`と、`-l 1`をちょっと変えて`-l 0`を指定します。`深さ:0`指定すると延々と深いリンク先もたどってくれます。

```shell
$ wget -r -l 0 https://qiita.com/
```

上記コマンドを実行すると……こんなにファイルいらないよ！ってくらいダウンロードしてるかと思います。途中でやめたいときは`Cntl+C`で強制終了できます。

ちなみに、Qiitaのようなコンテンツがたくさん掲載されているサイトでは、このコマンドの実行はお勧めしません。動的に生成されているコンテンツの場合、動的に生成されたリンクをたどった先が動的に生成されたリンク集だったりしてWgetが延々とループにはまった状態になることがあるからです。

## サイトの一部をダウンロードするには？

ようやくここでスクレイピングの話が出てきます。

スクレイピングする対象が、静的コンテンツの場合はサイトをまるっとダウンロードしてダウンロードしたhtmlファイルをスクレイピング/解析すればいいのですが、動的に生成されるコンテンツの場合、人の目ではループが完結するように見えてもWget上で無限に思えるhtmlページがあるように見えてしまうことがあります。

そこで、Wgetの巡回機能を使わずに、人の手でリンク集を作り そこからWgetでダウンロードをさせる方法をとります。シェル芸を駆使して「とりあえず実行してみる」のようにURLをパラメータとして渡して処理させる方法もあるのですが、せっかくWgetに便利なオプション`-i`(対象urlをファイルから読み込む)があるので使ってみます。

```shell
$ wget -i url.txt -l 1
```

`url.txt`は、urlが羅列されているテキストです。複数のurlを記述するには改行して書いていきます。

```txt
https://qiita.com/advent-calendar/2017/increments
https://qiita.com/advent-calendar/2017/crawler
```

よくあるテキストファイルです。プログラムでクロールさせるのもアリだとは思いますが、
開発途中で何度もスクレイピング対象のサイトをクロールすると待ち時間(ダウンロード時間)がかかってしまいます。

そこでWgetを使って、1度ダウンロードさせることで、プログラム側はローカルファイルを読み取ってスクレイピングすればよくなります。また、スクレイピング対象のスナップショットとして保存できるため便利です。

## 記載しなければならないURLが多い？

ひとつひとつurlをテキストファイルに記載するのは大変です。
スクレイピングする対象のリストをスクレイピングして抽出してしまいましょう。

## つまり……スクレイピングを効率的に進めるには？

1. スクレイピング対象を観察する
2. スクレイピング対象の一覧を作る(url.txtの生成)
3. Wgetでurl.txtを巡回して対象をダウンロードする
4. ダウンロードしたhtmlをスクレイピングする

`2.`と`4.`の部分だけプログラミングすればよくなるので、効率よくコーディングできます。

# 終わりに
ざっくりとした説明になってしまいましたが「Wgetしてスクレイピングする」いかがだったでしょうか？

おそらく実際に実行したときに、「保存先のディレクトリを変えたい」とか
「生成されるディレクトリの階層を抑えたい」とか「親ディレクトリの巡回は不要」とか
「Basic認証されたページを取得したい」とか「クッキーを保存/読込したい」とか
色々とやりたいことが出てくるかと思います。

それ、[Wgetのオプション指定](https://www.gnu.org/software/wget/manual/wget.html)でできます。
ヘルプに書いてあるので見てみるといろいろ面白い発見があると思います。

```shell
$ wget --help
```
WebRTCを調べてみた

※自分の調査メモ

# 自分のプライベートIPの確認
↓このサイトにアクセスすると、自分のプライベートIPアドレスが分かります。
http://ip-api.com/
普通、プライベートIPは分からないはずなのにどうやっているのか？
WebRTCが使われています。
このip-api.com、githubでソースが公開されており、なんとシングルページのhtmlです。
https://github.com/vladc/ip-api.com
source.htmlの中のget_internal()という関数でプライベートIPを取得しています。

# 2者間でカメラの映像をやり取りする
simpleWebRTCというライブラリを使うとムチャクチャ簡単にできます。
https://simplewebrtc.com/
このページのトップに書かれているわずかなhtmlとJavaScriptをコピペするだけ。
（htmlはhttpsのサイトに置かないとカメラが使えないので注意）

ただし、プロダクションで使うにはSTUNサーバやシグナリングサーバを自前で立てる必要があり、そこが面倒そうです。
simplewebrtcのデフォルトで設定されているのはこれ：
シグナリングサーバ：https://github.com/andyet/signalmaster
STUN&TURNサーバ：https://github.com/otalk/restund

TURNサーバのホスティングもあるらしい。
https://xirsys.com/simplewebrtc/

# テキストチャットのデモ
デモ
https://www.webrtc-experiment.com/text-chat/
ソースコード
https://github.com/muaz-khan/WebRTC-Experiment/tree/master/text-chat

# Atomのteletypeをパケットキャプチャしてみたところ
WebRTCは基本的にUDPベースです。
片方のAtomでキーを入力する度にパケットが送られているようです。そのとき必ず応答パケットも送られるので、ACKをしてるのだと思います。
UDPはパケットの到達順序も保証されないですが、SCTP（UDP+TCPみたいなもの）を使っているので、到達順序は保証されるようです。

teletypeのソースをgrepしてみたところ、必ず使っているはずの `RTCPeerConnection` などがありませんでした。atom本体の方に組み込まれているのだろうか？

# 同一LAN内のマシンで通信する場合
STUNによるNAT越えの説明を読む限り、一度ルータを出てグローバルIPを使って通信しそうと思ったのですが、ちゃんとプライベートIPで通信していました。

# For More Info

WebRTC Advent Calendarが参考になりそう
https://qiita.com/yusuke84/items/286f569d110daede721e
Kotlinを使ってみた感想

この記事は、[株式会社Y's アドベントカレンダー](https://qiita.com/advent-calendar/2017/ysinc) 1日目の記事になります。

# 概要
あまり有益な内容は書けないかもしれません。
その節はごめんなさい。

１、２週間ほど、kotlin/spark（マイクロフレームワーク）で
社内教育用のダミーデータを生成する簡単なAPIを作ってました。
で、色々嬉しかったことを羅列していきます。

# 開発環境
- Debian 7.6
- kotlin 1.1.60
- gradle 4.2.1
- sparkjava 1.0.0-alpha
- IntelliJ IDEA

# 嬉しかった３つのこと
## スマートキャスト
従来、Javaだと型チェックして早期リターンする時、

```java
class Hoge {
    private int foo;
    
    public Hoge(int foo) {
        this.foo = foo;
    }

    public int getFoo() {
        return foo;
    }
}

public void fuga(T hoge) {
    if (!(hoge instanceof Hoge)) {
        return;
    }

    Hoge h = (Hoge) hoge;
    System.out.println(h.getFoo());
}
```

みたいに、チェックした後にキャストする処理を書かないと使えなかったと思いますが、
kotlinだと

```kotlin
data class Hoge(foo: Int) {}

fun fuga(hoge: T) {
    if (hoge !is Hoge) {
        return;
    }

    System.out.println(hoge.foo);
}
```

と、一度型チェックしたらキャストまでしてくれるという代物。
とても直感的。great.
あと、 is 演算子の前に否定を入れることができるので()でくくる必要もない！ beautiful.

## ラムダ式
sparkでルーティングを定義するとき

```kotlin
fun main(args: Array<String>) {
    get("/hello") { request, response ->
        "Hello, Spark"
    }
}
```

最終に書いた処理・表現が返るから、簡潔にかけるのすごい。

Javaもラムダ書けるけど、AndroidはJava7で動くから、
少々気にしなきゃいけないこと多くてなぁって。
あとは好みだけど、()内に書くより、{}で書けるのがすこ。

## データクラスとプライマリコンストラクタ
これは非常に画期的だと思う。
今までsetter/getterしかない、いわゆるPOJOを必死に作ってたけど
それを

```kotlin
data class Hoge(name: String, age: Int) {}
```

と、クラスのプライマリコンストラクタに渡してあげるだけで、表現可能だってこと。
単純なことだけどテンションあがったw

class書いて、コンストラクタ書いて、フィールド定義して、getter作る、
なんてことしなくてもいいのは良き。

いつかセカンダリコンストラクタ使ってやんよ

## 他にも
- 使いたかった無名関数！！
- コンパイラでnull安全保証
- ; つけなくていいの楽
- 意外と便利な名前付き引数（IntelliJ IDEA+Kotlin Pluginとの併用で最強）

などなど、感動したことはありますが、
今現在必死に[これ](https://www.amazon.co.jp/dp/4839961743)読んでるので、もっと実験していきたいなぁって思います。

## 終わり
kotlin 1.2から、swiftのみならず、JavaScriptに変換して
Webアプリケーションを作れるって聞いたので、もっとkotlinの勉強して、
いつかkotlinのAdovocatorに、俺はなる！！

枠が残ってたら、社内教育向けの簡易APIをsparkで作ってみたので、
その話もするかもしれないし、しないかもしれないです。

おわり。

次は 2日目 @Bong さんの記事です。お楽しみに！
プログラミングを早くする方法

プログラミングを早くする方法なんてタイトルですが、
これは単に私が　iOSの開発をしてる時の方法です。
# 必要なもの
・Boostnote(https://boostnote.io)  
今回は、Boostnoteの機能の一つSnippetノートを活用する方法の一例をご紹介します。
私自身、iOSの開発をしているので、今回はXcodeをエディタとして使用しています。

私はプログラミングをするとき、基本的には欲しい機能をメモ帳にまとめています。
昔は、Mac純正のメモ帳を使っていたのですが、これがとても読みづらいし、どこに行ったのかわからなくなることも多々ありました。
しかし、Boostnoteのスニペットノート機能を使用すると一つのSnippetノートに複数のプログラムを保持できるので後で参照しやすいです。  

# Snippetノート活用例
例えば「UILabel」という括りを一つ作っておくと、
関連する機能をそこにまとめておくことができます。
こちらの画像はBoostnoteの画面です。
<img width="512" alt="20171130185428.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/126a1ff1-6b54-531d-6d03-1dd95807d264.png">

UILableというSnippetノートに「README.md」と「initLabel.mm」というメモが入っています。
Labelの生成を一発で済ませたいなら「initLabel.mm」のコードをそのままコピペします。  

# 言語自動認識
<img width="512" alt="20171130185722.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/a4aff691-686b-934a-20a3-e0b2de7767c3.png">
  
更に、Snippetノートを活用し、タイトルに拡張子「.mm」と入れておくと、自動で「Objective-C」の言語と認識して、文をハイライトしてくれるのでこれもまた使いやすい点です。  
<img width="512" alt="20171130190401.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/016c4c8e-e7c5-994d-e85c-254340aa10c2.png">
 
こちらは、純正のメモ帳の場合ですが、非常に読みづらいことがわかると思います。

# まとめ
また、Label特有のプロパティを確認したいときは、「README.md」に書いてあるので迷わず「UILabel」のカスタマイズができます。  
1枚目の画像に他にも「UIToolBar」や「UIWebView」などたくさんのノートがありますが、全て同じように私は使っています。  
以前その都度Mac純正のメモ帳内を検索したり、ネットサーフィンをしていたのでその分早くプログラミングができるようになりました。  
<img width="512" alt="20171130185951.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/c2e03af7-d67d-6b4e-9467-80cfb91683e9.png">
  
以上、私のBoostnote-Snippetノート活用法の紹介でした。 
他にもハイライトされていて使いやすいスニペットノートがあるサービスなどあれば教えてほしいです。
Capybara の headless chrome で Accept-Language ヘッダを送る設定

```ruby
Capybara.register_driver :headless_chrome do |app|
  Capybara::Selenium::Driver.new(app,
    browser: :chrome,
    desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(),
    options: Selenium::WebDriver::Chrome::Options.new(
      args: %w(--headless --disable-gpu --lang=ja-JP)
    )
  )
end
```

ポイントは、`--lang=`オプションを使うこと。

https://peter.sh/experiments/chromium-command-line-switches/ あたりに載ってた。
【JavaScript】文字列を日付(Date)に変換する際に、ブラウザによる解析の違いで時間がずれる

文字列を以下のように日付に変換した場合、ブラウザによって時間がずれた。

```js
// ISO-8601 拡張形式 で、+09:00を省略した形
var strDate= '2018-01-01T02:00:00';
console.log(new Date(strDate)); // Mon Jan 01 2018 02:00:00 GMT+0900 (東京 (標準時)) ← ブラウザによって結果が変わる
```

PCのChrome、Edge、IE11はマシンのタイムゾーンを見てくれるみたいで日本時間で取得できたが、モバイルSafariだと±0の標準時で取得され、9時間のずれが発生した。

以下のように正確に入れれば問題ない。

```js
new Date('2018-01-01T02:00:00+09:00');
```

または、`2018/01/01 02:00:00` の形だと `+09:00` をつける必要がない。
例えば年月日と時間を別々に取っているときとかは、以下の書き方のほうが楽かも。

```js
var ymd = '2018-01-01';
var time = '02:00';

// '2018/01/01 02:00:00' の形する
var strDate = ymd.replace(/-/g, '/') + ' ' + time + ':00';
console.log(new Date(strDate)); // Mon Jan 01 2018 02:00:00 GMT+0900 (東京 (標準時))
```

文字列→日付変換時のブラウザによる解析の違いは以下のサイトにまとまっていました。
https://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm#no2
UnityのGL.IssuePluginEventを使ってandroidのJavaメソッドを呼ぶ方法

昨日投稿した「[Unityから画像のピクセル情報をネイティブに渡す方法](https://qiita.com/t_hoshiyama/items/cd1ad3767e02da79d848)」の続きです。

昨日のプロジェクトでは`OnPostRender`でJavaのメソッドを呼んで、Javaネイティブ側で`glReadPixels`を実行させていたのですが、UnityのMultithreaded Renderingに対応していませんでした。
そこで、`GL.IssuePluginEvent`を使ってMultithreaded Renderingに対応させようということなのですが、結果から言えば半分できて半分諦めました。

更新したサンプルプロジェクトはこちら
https://bitbucket.org/HoshiyamaTakaaki/pixelreadstest

`GL.IssuePluginEvent`はレンダリングスレッドから指定のC++メソッドを呼んでくれる命令です。
なのでそのままではJavaメソッドは呼べません。
そこでいったんC++のメソッドを経由してJNI経由でJavaのstaticメソッドを呼び出します。

```csharp:CameraOnPost.cs
#if !UNITY_EDITOR
#if UNITY_ANDROID
	[DllImport("glutil")]
	private static extern IntPtr getRenderEventFunc();
#endif
#endif

	private void OnPostRender()
	{
#if UNITY_ANDROID && !UNITY_EDITOR
		GL.IssuePluginEvent(getRenderEventFunc(), m_TargetTexture.GetNativeTexturePtr().ToInt32());
		//m_NativePlugin.CallStatic("sendRgbaFrame", m_TargetTexture.GetNativeTexturePtr().ToInt32());
		//GL.InvalidateState();
#endif
	}
```

```cpp:glutil.cpp
extern "C" {
    using UnityRenderEvent = void(*)(int);

    UnityRenderEvent getRenderEventFunc();
}

// call from Unity(IssuePluginEvent)
void onRenderEvent(int eventId)
{
    LIBENC_LOGD("onRenderEvent:%d", eventId);
    JNIEnv *jenv = getEnv();
    if (gjClass_UnityConnect == NULL)
    {
        gjClass_UnityConnect = (jclass)jenv->NewGlobalRef(findClass(jenv, "jp/ne/pickle/libpixelreads/UnityConnect"));
        gjMethodId_sendRgbaFrame = jenv->GetStaticMethodID(gjClass_UnityConnect, "sendRgbaFrame", "(I)V");
    }
    if (gjClass_UnityConnect != NULL)
    {
        jenv->CallStaticVoidMethod(gjClass_UnityConnect, gjMethodId_sendRgbaFrame, eventId);
        jthrowable mException = jenv->ExceptionOccurred();
        if (mException)
        {
            jenv->ExceptionDescribe();
            jenv->ExceptionClear();
        }
    }
    else
    {
        LIBENC_LOGE("jClass not got");
    }
}

// call from Unity(IssuePluginEvent)
UnityRenderEvent getRenderEventFunc()
{
    return onRenderEvent;
}
```

このような形で、C#からC++の`onRenderEvent`がレンダリングスレッドで呼ばれます。
そしてメソッド内でJavaの目的のメソッドを探してアクセスを行います。
ちなみに`JNI_OnLoad`が呼ばれるスレッドとは別スレッドとなるので、JavaVM以外のJNIEnvなどの情報は取得し直す必要があるようです。

これで一応Javaメソッドの呼び出しは行えるようになりましたが、ここからJava側でOpenGLESの操作を行う場合に、色々とRuntimeエラーが発生しました。
たぶんサンプルコードではJava側のOpenGLESの初期化(UnityConnect.initialize)などが別スレッドで行われているからだと思います。
GL_INVALID_OPERATIONが出まくります。

というわけで、スレッドを意識して処理をきちんと整理すれば動くようになるんじゃないかと思いますが、正直もうこれ以上沼にはまる時間はないので、Multithreaded Renderingは諦めようと思います。

Androidは本当に沼です。
Swarm のチェックインを IFTTT で Mastodon へ転送する

本記事は Mastodon Advent Calendar 2017 6日目の記事です。
昨日は @Ress さんによる [Mastodon をカスタマイズする](https://qiita.com/Ress/items/064109cf36ea5437c3a1) でした。

----

こんにちは！6日目担当の koogawa です。

突然ですが、私は [Swarm](https://www.swarmapp.com/) というサービスが大好きです。
毎日、どこへ行くにもチェックインは欠かさず、総チェックイン数は 20,000 を超えました。
そして先日、ついに Swarm のチェックインを IFTTT で Mastodon へ転送する Applet を作ってしまいました。
以下にその手順をまとめます。

# 用意するもの

- Curl の使える環境 - Curl でなくても、コマンドラインでHTTPリクエストが送れること。
- IFTTT アカウント
- Swarm アカウント
- Mastodon アカウント

これらのアカウントの作成方法については、ここでは触れません。
これ以降、Mastodonの登録メールアドレスとインスタンスを以下のものとして記します。

|メールアドレス|インスタンス|
|:-:|:-:|
|hogehoge@fuga.example.jp|mastodon.example.com|

# Mastodon の access_token を取得する

Mastodon にアプリケーションの登録を行い、access_token を取得します。
手順については @yukimochi さんの記事にとても丁寧にまとめられています。（私もお世話になりました！）

[Twitter の投稿を IFTTT で Mastodon へ転送する。 \- Qiita](https://qiita.com/yukimochi/items/f80a50a4486d0cb770dc)

`client_name` は「From Swarm」、`website` は「https://www.swarmapp.com/」にすると良いでしょう。

# IFTTT で Swarm のチェックインを転送する。

取得した access_token を用いて、IFTTT から Swarm のチェックイン内容を Mastodon に投稿します。
今回はすべてのチェックインを Mastodon に投稿するのではなく、チェックイン時に `#mastodon` の文字を含むチェックインだけを投稿するようにしてみます。

1. IFTTT のページ上部の`My Applets`をクリックし、`New Applet`をクリックする
2. 青文字の`this`をクリックし、`Foursquare` を選択する（Swarm ではないので注意！）
3. `New check-in tagged` をクリックする
4. `Tag` に `mastodon` と入力し、`Create trigger`をクリックする（`#` は不要です）
5. 青文字の`that`をクリックし、検索ボックスに'webhook'と入力し、`Maker Webhooks`をクリックする。
6. `Make a web request`をクリックする。
7. 以下の通りに項目を埋める。

なお、インスタンスのURLと<>の場所は、必ず自分の環境のものに書き換えてください。（<>も含めて書き換えてください。）

|項目|内容|
|:-:|:-:|
|URL|https://mastodon.example.com/api/v1/statuses|
|Method|POST|
|Content Type|application/x-www-form-urlencoded|
|Body|access_token=<64字の英数字>&status= I'm+at+@{{VenueName}}+{{ShoutNoHashtag}}+{{VenueUrl}}&visibility=<希望の公開範囲>|

入力したら、`Create action`をクリックします。
最後に、`Finish`をクリックして完成です。
この直後から、Swarm に `#mastodon` 付きでチェックインすると、Mastodon に次のフォーマットで投稿されるようになります。

```
I'm at @渋谷駅 ["おはよう ございます"] http://4sq.com/5i7TJf
```

`{{VenueName}}` や `{{ShoutNoHashtag}}` 以外にもいくつか ingredient が用意されているので、いろいろ試してみると面白いと思います。

# さいごに

せっかく IFTTT に Applet を作ったので一般にも公開したかったのですが、現在は「パートナー」と呼ばれる企業向けの有料アカウントしか公開ができなくなってしまったようです😢

一手間かかりますが、これを機にぜひこの Applet を試してみてください。

良い Mastodon & Swarm ライフを！😄

----

Mastodon Advent Calendar、明日はまだ空きがあるみたいですよ！
Project Euler Q31 【硬貨の和】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
イギリスでは硬貨はポンド£とペンスpがあり，一般的に流通している硬貨は以下の8種類である.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).

以下の方法で£2を作ることが可能である．

$1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p$

これらの硬貨を使って£2を作る方法は何通りあるか?


## 解答

```bash
seq 0 200 |
awk '{print "1 "$1}' |
awk '{for(i=0;i<=200/2;i++){v=$1*$2+2*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/5;i++){v=$1+5*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/10;i++){v=$1+10*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/20;i++){v=$1+20*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/50;i++){v=$1+50*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/100;i++){v=$1+100*i;if(v<=200){print v}}}' |
awk '{for(i=0;i<=200/200;i++){v=$1+200*i;if(v==200){print v}}}' |
wc -l
73682
```

何事もやってみる、それが大事。
まさか`print v`だけでOKだとは思わなかった。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/031.html
「Javaを勉強しておくときっといいことが」

こんにちは　株式会社Nucoの某エンジニアです

[1日目の記事](https://qiita.com/miumiu0917/items/43f4ec487652ba866c2d)でも紹介されている通り、弊社は主に機械学習に取り組んでいる会社です

業務の中ではPythonゴリゴリ書いているのですが、「好きに書いていい」とのことだったのでタイトル通りにJavaの話をしようと思います
<br>
<br>
<br>
私自身はエンジニアになる際にJavaを選びました


その時は何か理由があったわけではなく、とりあえずよく聞く名前の言語だから、って感じだったと思います


エンジニアになった後、Javaを使った業務アプリの開発を最初に経験し、MVCフレームワークだとかの概念を勉強しつつ仕事をしてました


最近までで「Javaをやっててよかったわー」って感じたことを~~苦し紛れに~~書いていこうかと思います
そんなに技術的な話題でもなさげな感じがしてどうも申し訳


### ・おしながき
1. ネットで参照できるページ・記事が豊富
2. ライブラリが豊富
3. データの型を配慮する「クセ」
4. Java経験からのAndroid開発
5. Java経験からの他言語開発



###　1. ネットで参照できるページ・記事が豊富


個人のブログも含め情報がたくさん見つかります    特にJavaはあっとうてきだとおもいました(小並感)


スタック〇ーバーフ〇ーで英文のやり取りを頑張って解読しなくても、日本語でググるだけでもだいたい解決の糸口は見つかることが多いです
(でも英語が使えないとこの先しんどいのでそっちの勉強も頑張ろうね☆)


自分では結構限定的だと感じるような問題でも、同じような問題にぶつかった先人のノウハウが見つかることが多いので解決不可能な状態に陥りにくいと思います(Javaは特にそんな気がします)


まぁ

「Qiita」や「はて〇」含め、情報発信がかなり自由になった今では他の言語でも記事がそれなりに見つかるので、Java「だけ」のいいところ、ってわけでもないですけど…


### 2. ライブラリが豊富

「こういう処理があったらいいのにな」って思うような処理が使えるライブラリに出会える可能性がかなり高いです


自分で一から実装するよりも信頼性が高いことと、コードの量の削減→可読性の向上にもつながります


インポートしてその関数呼び出してやるだけで実装したい処理を実現できるのです しかも無料です 先人たちの知恵に感謝しつつありがたく使わせてもらいましょう




…楽をすることは、別に悪いことではないですから



Java始めて間もない方は"java stringutils"とググることから始めてみましょう　きっと幸せになれます



### 3. データの型を配慮する「クセ」


Javaは処理を書いていて、メソッドからの戻り値を代入する変数の型を間違えていると即IDEがコンパイルエラーを吐いてくるので


いやってほどに「今の処理でどういう型のデータを扱っているのか」に気を遣う必要があります


最近の開発現場で「javac叩いて手動コンパイルする」なんてのはなかなかないだろうし、今やIDE先輩のお許しを得ないとRunさせてもらえません


型推論なんてものもデフォルトでは存在しないですし


小さい子供に矯正用のお箸を使わせて訓練するようなものです


正しい型を意識しながらコーディングする癖をつけること


他の言語に移ったときも必ず役にたつはずです



### 4. Java経験からのAndroid開発


まさに言語はJavaを使っているので、Android開発への道も開けるというものです


Android開発=スマホアプリ開発、だけではないというのを知っているのことも大事です


組み込み系の開発でもAndroidを採用している現場が多いので、Java単体のみを扱っている場合に比べて仕事の幅がぐっと広がります


過去に1年程そういう現場にいましたが、Androidの知識だけでなく実際のハードウェアをこねくりまわしながら開発をしていたのは楽しかったです



### 5. Java経験からの他言語開発

データ型の配慮の項目でもちょいと書いた話ですけど


Javaはとにかく「ルールにうるさい」言語です


あいまいな書き方をすると即座にエラーになります


「よしなに」「いい感じに」してくれることなんて期待してはいけません


hello worldをするまでのハードルの高さは皆さんご存知かと思います


``` java:HelloWorld.java
public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello World !!");
    }
}
```
↑1行出力するだけのためにこんなに宣言をしなければなりません


「プログラミング言語」が如何に複雑にできているかがわかります


最初は「おまじないだと思ってね」なんて言われることもありますが、決して「おまじない」なんかではありません


この5行の中に、Javaを使いこなすための基本的かつ、重要なエッセンスが凝縮されていると言っても過言ではありません


だからこそ最初に頑張って習得するだけの価値はあると思います



ちなみにPython↓

```python:hello_world.py
print('Hello World !!')  # Simple is the best, huh?
```


## 最後に

つらつらと書いてきました

私のエンジニアとしてのキャリアの、その根底にはJavaがあります

1つの言語をある程度頑張って勉強すれば、他の言語を学習するハードルも下がります

そのハードルの下げ幅を一番大きくしてくれるのは、何よりもJavaだと思っています

縁あってこの記事を読んでくださっている方の周りにJavaで苦戦している人がもしいたら、優しく声をかけてあげてほしいです

「Javaを勉強しておくときっといいことがある」


ありがとうございました。
WindowsでのRuby 2.4 + Ruby on rails 5.1環境構築

#はじめに
初めてWindow10でRubyをインストールするための手順メモ。
すでに環境構築済でアップグレードする場合は別の手順が必要になる可能性があります。

[検証環境]
OS:Windows10(64bit)
Ruby:2.4.2
Rails:5.1.4

#Rubyのインストール
以下URLからインストーラをダウンロード。

https://rubyinstaller.org/downloads/

![スクリーンショット 2017-12-01 15.59.04.png](https://qiita-image-store.s3.amazonaws.com/0/216980/de8a0a79-ae5b-1ef1-a363-b77eecb7093c.png)

ダウンロードした「rubyinstaller-2.4.2-2-x64.exe」を実行してRuby2.4.2をインストール。
※インストーラはすべてデフォルトのままでOK

# MSYS2 toolkitのインストール
Ruby 2.0～2.3で言うDevKit-mingw64のようなもの。
2.4からMSYS2 toolkitになった。

インストーラーでデフォルト設定のまま最後まで実行すると、インストールウィザードを閉じた後にコマンドプロンプトで以下のような画面が起動する。
(終了画面でチェックを外せば起動しない)
![スクリーンショット 2017-12-01 16.08.10.png](https://qiita-image-store.s3.amazonaws.com/0/216980/eaf38ed2-ae9d-7e93-ba48-ac41fcc5ce91.png)

インタラクティブ形式でダウンロードとMSYS2 toolkitのインストーラを実行。
ここでは初めてRubyをインストールすることを想定しているので、何も数字を入力せずに「Enter」を入力し、インストーラのダウンロードを開始する。
インストーラは開始すると自動で実行してくれるので完了まで待つ。

完了した後、コマンドプロンプトで以下のように表示されることを確認。
![スクリーンショット 2017-12-01 16.34.50.png](https://qiita-image-store.s3.amazonaws.com/0/216980/a36cb626-170c-e1ef-d9b9-3e4fc4eb5352.png)

# Railsのインストール
投稿時のバージョンは5.1.4でした。

```dos
gem install rails
```

完了したら以下で確認。

```dos
>rails -v
rails 5.1.4
```

#サンプルプロジェクトを作ってみる
コマンドプロンプトから以下を実行。

```dos
>rails new Test
>cd Test
>rails g scaffold user name:text
>rails db:migrate
>rails s
```

これでブラウザから

http://localhost:3000/users

にアクセスすれば以下の画面が表示される。

![スクリーンショット 2017-12-01 19.29.46.png](https://qiita-image-store.s3.amazonaws.com/0/216980/017452cb-1fec-04e7-86a9-3806d521d1b8.png)

はずだったが、以下のようなエラーが表示された。

>TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。

##対策
Gemfileに以下を追加

>gem 'coffee-script-source', '1.8.0'

gem更新してサーバー再起動

```dos
bundle update coffee-script-source
rails s
```
【Python】pyenv VS virtualenv

`pyenv` を使用して、システムに異なるバージョンの Python をインストールすること、
またバージョンを切り替えるすることができます。


####**各バージョンのインストール**
- インストールできるバージョンをリストアップします。
```$ pyenv install --list```

- 特定のバージョンをインストール
```$ pyenv install 3.6.1``` 


####**バージョンの切り換え**
- システムレベルで Python のバージョンを 3.6.1 に切り換え 
```$ pyenv global 3.6.1```

- 特定のフォルダにて、Python のバージョンを 3.6.1 に切り換え
```$ pyenv local 3.6.1```

- 一時的に Python のバージョンを 3.6.1 に切り換え
```$ pyenv shell 3.6.1```


####**仮想環境の構築**
- 仮想環境の追加
```$ pyenv virtualenv 3.6.1 virtualenv_name```

- 仮想環境追加の確認
```$ pyenv versions```

- 仮想環境を有効
```$ pyenv activate virtualenv_name```

- 仮想環境を解除
```$ pyenv deactivate virtualenv_name```

####**まとめ**
**pyenv:** 全てのライブラリに対して、バージョンの切り換えができます。
**virtualenv:** 特定のバージョンに対して、特定のライブラリだけインストールすることができます。
Kubernetesコンポーネントのポート番号

Kubernetesクラスタがうまく動かないときのデバッグなどに役立ちます。

## kubea-apiserver

insecure port: 8080
tls port: 443

## kube-scheduler

http service: 10251

## controller-manager

http service: 10252

## kubelet

cadvisor: 4194
healthz: 10248
unauthenticated: 10250
read-only: 10255

## kube-proxy

healthz: 10256

## flannel

8472

## etcd

2379

## 参考

https://github.com/kubernetes/kubernetes/blob/master/pkg/master/ports/ports.go
gulp-webserverでローカルにサーバーを立ち上げる手順まとめ


##gulpが入っているか確認する

```bash:
#gulpのバージョン情報を確認
gulp -v

#gulpが入っていなければinstallする
yarn add gulp

#npmでinstallする場合
npm install gulp
```

##yarnでgulp-webserverをinstallする

```bash:
#packege.jsonを作成する
yarn init

#gulp-webserverをinstallする
yarn add --dev gulp-webserver

#npmでintallする場合
npm install --save-dev gulp-webserver
```

##gulpfile.jsを作る

```javascript:gulpfile.js
//gulpfile.jsを作って、gulpタスクを追加する
var gulp = require('gulp');
var webserver = require('gulp-webserver');

gulp.task('webserver', function(){
  gulp.src('public')
  .pipe(webserver({
    livereload: true,
    open: true,
    port: 8000
  }));
});
```

##サーバーを立ち上げる

```bash:
gulp webserver
```


おわり

##参考サイト
・[gulp-webserver](https://www.npmjs.com/package/gulp-webserver)
・[annot GET html & gulp.src location ignored. · Issue #26](https://github.com/schickling/gulp-webserver/issues/26)
データサイエンスを勉強し始めて分かってきたこと。(ケーススタディとしてみてほしい)

#少しづつですが、学んできている。

データサイエンティストは、前職がマーケターとか理数系の修士博士を取っていないとなれない仕事だなーと思い、一度プログラマーとしてのキャリアを進むべきだ！と考えrailsとrubyの勉強をしていました。

今は簡単なアプリとか、作りたいものは基本作れるようになった感じです。

さらなるスキルアップのために、もう一度本腰を入れてデータサイエンスの勉強を始めたところです。

#そもそも、データサイエンティストに必要な能力とは

①ハッキングスキル(プログラミングとか)
②数学、統計(を意味のある形にして、実装と運用をする)スキル
③独自の強み(前職とか)

参考：@hik0107 さん【[そろそろデータサイエンティストの定義とスキルセットについて本気で考えてみる](https://qiita.com/hik0107/items/f9bf14a7575d5c885a16)】

これらの能力をつけようとしている方々向け(僕と同じ初学者)に記事を書かせてもらいます。


#失敗1: プログラム書けなすぎた

というより、当時の僕にとってpythonが分かりづらかったのかもしれません。

pythonがわかりづらいと感じた人は、**phpとかrubyのようなわかりやすい言語の文法だけ覚えて**再度pythonに挑戦すると、かなりわかりやすく(むしろ、pythonすげーなと)感じると思います。遠回りのように見えて、この方法が一番近いです。

##**これから勉強を始める方が注意すると、役立つと思われること**

・python3が分かりづらかった。やるならcondaでpython2と3(3.5とか)で、分けてて進めるのがおすすめ。
 →python3だと、本に書いてある通りに進めない時がある。

・python2,3で生じるエラーに免疫がなかった。
→(当時はわかりませんでしたが、エラーの文末か文頭読めば理解できるのでご安心ください！)

・プログラミングは、問題を解きながら覚えていくのが一番早い and 楽しい!


rubyをある程度勉強して、【ここめんどくさいな〜】と感じていたところを、pythonは補っていたのを最近知りました。

科学技術計算ライブラリも充実しているし使うならpythonですね。


#失敗2: 統計スキル全く無すぎた

ある程度プログラミングができるようになるとコードは少し読めて理解できるようになりますが、次は「なんのアルゴリズムなのか、全くわかんない!」現象が起こります！

その時に、統計学のこういう定理とか公式がどう生きるか知っておけば、すごい楽しくデータサイエンスの勉強ができるはず！

勉強する順番は、ロジスティック回帰まで勉強するならまずこんな感じで進めていけば大丈夫かなと思います。

(現在お試し中なので、本当にうまくいくかわかりません。)

**1：標準偏差、基準値などなど
2：確率密度関数(ガウス分布(正規分布)、カイ二乗分布などなど)
3：2変数
4：微分、行列
5：単回帰
6：重回帰
7：ロジスティック回帰**

漫画のやつとか、わかりやすい統計学の本がたくさんあるので、理論を先に覚えていくのも１つの手だなと思いました！

#まとめ

これから勉強を始める方は、
・pythonを勉強する！
・統計学を勉強する！
ここを進めると、少しづつ分かってくると思います！

#P.S. これから自分に必要だと思っていること

たぶん、今僕がやっていることは、基本中の基本のようなことだと思います。

これからは、

・さらなる統計スキル
→いろいろな手法があると思うので、いろんな選択肢の中から正確な手法を選択できる用にならないといけないなと思います。**どのような知識があると更に良いか、先駆者の皆様教えてください**m(__)m

・データ処理スキル
 →複雑なSQLとかちゃんと書けるようになりたいです。

・数学スキル
→**pythonに任せちゃえばいいかな**と思っているのですが、そんなことは無いのでしょうか?わかる方いれば教えて欲しいです！

###**===小さく作ろう！===**

当たり前のことなんですが、研究されている方も居るくらいなので短期間にすべてを知ることなんて出来ません。今仕事にしている人も、全てに詳しかったら日本なんかで働いていないと思います。

プログラミングの勉強をしていて思いましたが、小さくつくって、知識を少しづつ積んでいくのが大切だなと思いました。

皆様のご意見是非教えてくださいm(__)m！！
S3を見直そう（主にセキュリティのアンチパターン）

しがないインフラエンジニアYasです。
ずぶずぶのオンプレインフラエンジニア（という名の何でも屋）だったのですがお仕事をきっかけにどっぷりAWSに浸かる事になりました。

そんな訳で過去の失敗を糧に色々書いていこうと思います。
Qiita投稿が初めてな上、技術投稿自体も初めてですので色々と表示や表現がおかしいところが多々あるかと思いますが、暖かい目で見守っていただければ幸いです。
すでにMarkdownで四苦八苦です・・・


さて、本日のお題は「S3」です。
S3の説明は公式サイトやいろんなブログで記載されているので割愛して、今回はセキュリティアンチパターンに着目します。

###１：気がついたら全公開 BucketPolicy編
BucketPolicyというS3のセキュリティ設定箇所があるのですが、いろんなブログのPolicy記載例をそのまま鵜呑みにして貼り付けるといつのまにやら全公開。

＜PolicyPattern＞
>
`{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"sid12345",
      "Effect":"Allow",
      "Principal": "*",　←これ
      "Action":["s3:*"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}`

Principal意識しないと全公開したりします。
たまに昔のブログで見かけたりしますが、初心者トラップだなーと。
最近はコンソール画面上でパプリックアクセス可能なものはマークがでるので、意図しない場合は要チェックです。

_↓こんな感じでPublicだよ！とお知らせしてくれます。_
![pubaccess.png](https://qiita-image-store.s3.amazonaws.com/0/216909/0b64638f-e6a5-da36-1cba-a1857282900b.png)


###2:気がついたら全公開：ツール編
S3へのファイルアップロードにCyberDuckとか使っている人もいるかと思います。
一部のバーションの頃ファイルパーミッション変更オプションで「パブリック」にしちゃってる場合がありました。
デフォルトなのかアップデートなのか仕様なのか・・・・
いろんな事情でPutObjectACLを付与しちゃってるときは注意しましょう。（やりがちなのは”Put*”で権限付与とか・・・）

_↓事例はCyberduckです。いいツールデスYO！_
![cyberduck.png](https://qiita-image-store.s3.amazonaws.com/0/216909/3669210d-15fb-6cf0-cb26-ea6968f98f67.png)

ちなみにファイル単位で許可されている時は、コンソール上からは分かりません。（現時点では）

思わぬところで落とし穴がある場合がありますので、適宜見直ししましょう。
セキュリティに気をつけて、良いAWSライフを！






<BR>
<BR>




おまけの独り言：
AssumeRoleでAccessKeyを付与している時はPut先のAWSアカウントが異なると権限の関係で色々支障が出ちゃうんですよね。なのでPutObjectACLが必要になるというジレンマ。
原因はおそらくAssumerole先のオブジェクトに対し、Assume元のアクセス権限しか付与されないからだと思いますが・・・
form画面内のselectでcollection一覧を分かりやすくする

普通にDraperでdecoratorを適用するだけど忘れそうなのでメモ

```ruby:app/decorators/tag_decorator.rb
class TagDecorator < ApplicationDecorator
  def name
    "id:#{object.id} <#{object.text_ja}>"
  end
end

```

```ruby:app/admin/post_decorator.rb
form do |f|
  ...
  f.input :tag,
    collection: TagDecorater.decoreate_collection(Tag.all)
  ...
end
```



もちろんCollectionに対してDecoratorを作っておく方法でも良い

```ruby
         ↓
class TagsDecorator < Draper::CollectionDecorator
  def page_number
    42
  end
end
--- 
   ↓
TagsDecorater.decoreate(Tag.all)

```
Objective-C, Swift ライブラリ無しでインジケーターアラートを表示

カテゴリで実装していますが、
ViewControllerであればコピペで使えるレベルです。

## 実装

```objc:UIViewController+Alert.m
#import "UIViewController+Alert.h"

@implementation UIViewController (Alert)

- (void)showIndicatorAlert:(NSString*)text
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:text preferredStyle:UIAlertControllerStyleAlert];
    UIActivityIndicatorView *view = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    view.center = CGPointMake(60, 30);
    [alertController.view addSubview:view];
    [view startAnimating];
    [self presentViewController:alertController animated:YES completion:nil];
}

@end
```

```objc:呼び出し元

[self showIndicatorAlert:@"Please wait..."];

```

表示結果

<img width="250" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/112186/d35ce1ba-b8b1-29cb-50e7-01a659c611fd.png">

## 閉じる方法

```objc:別スレッドとかで

... 処理 ...

// 閉じる
dispatch_sync(dispatch_get_main_queue(), ^{
    [self dismissViewControllerAnimated:true completion:nil];
});

```

## Swift版

```swift
extension UIViewController {
    func showIndicatorAlert(text: String) {
        let alert = UIAlertController(title: text,
                                      message: "",
                                      preferredStyle: .alert)
        let indicatorView = UIActivityIndicatorView(style: .medium)
        indicatorView.center = CGPoint(x: 60, y: 30)
        indicatorView.startAnimating()
        alert.view.addSubview(indicatorView)
        self.present(alert, animated: true, completion: nil)
    }
}
```

- 表示

```swift
self.showIndicatorAlert(text: "Please wait...")
```

- 閉じる

```swift
self.dismiss(animated: true)
```
古いEC-CUBEでもトークン決済を実装しよう

PayPal の checkout.js を使用すれば、購入確認ページに JavaScript のコードを貼り付けるだけでトークン決済を実装できます。
これなら、2.4 や、 2.11, 2.12 など古いバージョンの EC-CUBE でも対応可能です。

こんなコードを **shopping/confirm.tpl** に埋めるだけです。
*別途 PayPal プレミアアカウントまたはビジネスアカウントの開設が必要です。*

```shopping/confirm.tpl
<script src="https://www.paypalobjects.com/api/checkout.min.js" data-version-4></script>
<script>
    paypal.Button.render({
        env: 'sandbox', // Specify 'sandbox' for the test environment
        client: {
            sandbox: '<PayPal sandbox client ID>',
            production: '<PayPal production client ID>'
        },
        locale: 'ja_JP',
        style: {
            size: 'small'
        },
        payment: function (resolve, reject) {
            var env = this.props.env;
            var client = this.props.client;
            return paypal.rest.payment.create(env, client, {
                transactions: [
                    {
                        amount: { total: '<!--{$arrForm.payment_total}-->', currency: 'JPY' },
                        invoice_number: '<!--{$arrForm.order_temp_id}-->',
                        description: 'EC-CUBE 決済'
                    }
                ]
            },
                                              {
                                                  input_fields: {
                                                      no_shipping: 1
                                                  }
                                              });
        },
        commit: true,
        onAuthorize: function (data, actions) {
            // Execute the payment here, when the buyer approves the transaction
            return actions.payment.execute().then(function () {
                $('#form1').submit();
            });
        }
    }, '#paypal-button');
</script>
```

お支払い方法に応じて、購入完了ボタンの箇所に以下の div タグを描画させるようにします。

```html
<div id="paypal-button"></div>
```
(あとでもうちょっと詳しい手順を記載します...)
video要素のloadメソッドをjQueryで操作

今まで、video要素のloadメソッドを以下のように書いていました。（jQueryを使用しています）

```js
$(function(){
  $("#video要素のID").attr("src", "videoファイルへのパス");
  $("#video要素のID").load();
}
```

jQueryの3系だとloadが使用できないので、以下のように書き換え。

```js
$(function(){
  $("#video要素のID").attr("src", "videoファイルへのパス");
  $("#video要素のID").trigger("load");
}
```
jQuery1系からtriggerは使えるので、この方法で統一したほうが良いかも。
NYAGOS、かんたん設定

Windows向け拡張コマンドラインシェル：[NYAGOS (Nihongo Yet Another GOing Shell)](https://github.com/zetamatta/nyagos) の個人設定はホームディレクトリに .nyagos というテキストファイル(Luaスクリプト)を作成して行います。

Windows の場合ホームディレクトリは一般に `C:\Users\(ユーザ名)` というフォルダーです。環境変数 HOME に別のフォルダーを定義しておけば、そちらへ変更することも可能です。

なお、メモ帳などで `.nyagos` という名前で保存しようとすると、勝手に `.nyagos.txt` という名前に変えられてしまいます。一旦、`.nyagos.txt` で保存してから、後からエクスプローラーで `.nyagos.` 等とわざと末尾に余分の `.` をつけた形にリネームしてください。末尾の `.` はエクスプローラーに対して「拡張子が無い」ということを明示するためのものです。リネーム後に再表示させると、末尾の `.` が取れているのが分かると思います。

環境変数の設定
==========

環境変数は設定ファイル `.nyagos` の中で、`nyagos.env.変数名` という名前の変数に定義を代入することで設定できます。

たとえば PATH に C:\bin を加えたい時は

``` lua
nyagos.env.path = nyagos.env.path .. ";C:\\bin"
```

と .nyagos に記入してください。Lua言語では「`..`」(ピリオド二つ）が文字列の連結の演算子です。\ は文字列の中なので `\\` とエスケープします。

なお、NYAGOS の紹介記事で `set { ... }` という記法を紹介しているものがありますが、これも間違いではありません。`set` は nyagos.exe と隣接したフォルダー `nyagos.d` の中の `aliasandset.lua`というアドオンファイルの中で定義されている便利関数です。


エイリアス(別名)の定義
========================

エイリアスも `.nyagos ` の中で`nyagos.alias.エイリアス名` という名前の変数に定義を代入することで設定できます。

たとえば「`ls -l`」を「`ll`」でも実行できるようにするには

``` lua
nyagos.alias.ll = 'ls -l $*'
```

などと `.nyagos` の中に記載します。`$*` はエイリアスに渡された引数を全て引用するという意味です。他に第一引数の `$1`,第二引数の `$2` …などもあります。（これらのマクロがない場合は自動で勝手に末尾に `$*` があるとみなされます）

エイリアスは文字列で設定するだけでなく、Lua の関数にリンクさせることもできます。

``` lua
nyagos.alias.printarg = function(args)
    for i=1,#args do
        print(args[i])
    end
end
```

```
% printarg x y a d
x
y
a
d
```

NYAGOS にはいろいろな機能がありますが、とりあえず環境変数の変更やエイリアスなどが使えれば、必要最小限のカスタマイズはできると思います。
ls コマンド

# ls

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の1日目の記事です。

## man

```
NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List information about the FILEs (the current directory by default).  Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.
```
list の略。

## 知っとくとよさそうなこと

### 終了ステータス

```
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).
```
アクセスできないディレクトリとかがあると、エラー値を返す。

### i ノード

`-i` オプションで i ノード番号を表示できる。

```
       -i, --inode
              print the index number of each file
```
i ノードとは、ファイル（やディレクトリ）の管理情報のようなもの。
http://kazmax.zpp.jp/linux_beginner/inode.html