OmniAICreator/Qiita-1.07M huggingface dataset:
アスペクト比を維持してView内いっぱいに拡大するViewをstoryboardだけで作成する

# なんのこっちゃ？
図で説明すると、以下のような感じ。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/116677/c8e516e8-8881-2ce9-e64e-aa1e61e8772d.png)
白Viewのsubviewとして黄色Viewが配置されているものとします。
そして...

- 黄色Viewが白Viewの中央
- 黄色Viewは常に指定のアスペクト比を維持（図では4:3）
- 黄色Viewが、白Viewの長辺・短辺どちらか最初に接する方までいっぱいに広がる

...そんなViewが作りたかったのです。

（Androidアプリの経験がある方なら「ImageViewで`android:scaleType="fitCenter"`を指定した感じ」と言えば伝わるでしょうか）

# storyboardでの設定
黄色Viewに付与した制約は、以下のようになります。
![storyboard.png](https://qiita-image-store.s3.amazonaws.com/0/116677/f8cb5fa1-cdc6-8678-1767-ab668029c5ae.png)

ポイントは以下の通り。

- `Equal Width`の制約と`Equal Height`の制約両方に、`=0`と`≦0`の２種類の制約をつける
- `Equal Width`の制約と`Equal Height`の制約を全て優先度を下げる（図では`high`に設定）


これだけです。
参考になれば幸いです。
EntityFrameworkCore

EntityFrameworkとEntityFrameworkCoreの差について。
現時点(EF Core 2.0)の情報です。中にはBacklogで開発中の機能もあります。

- LazyLoadは未実装。
- TPTは未実装。
- ConvertionのルールがEntityFrameworkと違うものがある。
    - https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties
- ComplexTypeは未実装。
- オブジェクトマッピング無しの多対多関連テーブルの使用

他にもあるかも。
Japan Accessibility Conference vol.1 動画・資料

11月11日に開催された [Japan Accessibility Conference vol.1](https://connpass.com/event/68762) の動画と発表資料



|    A会場    |    B会場    |
|:------------------:|:------------------:|
|[オープニング](https://freshlive.tv/tech-conference/168860?start=270)|
|基調講演<br>[UX as science](https://freshlive.tv/tech-conference/168860?start=945)<br>Kim Jinsooさん|
|[アクセシビリティのインクルーシブデザイン](https://freshlive.tv/tech-conference/168860?start=5470)<br>張善英さん|[あなたの価値を高めるWebアクセシビリティ](https://freshlive.tv/tech-conference/168863?start=0)<br>伊原力也さん<br>[資料](https://www.slideshare.net/rikiha/webjac-special-ver)|
|[アクセシビリティ・ガイドラインの歩き方（初心者編）](https://freshlive.tv/tech-conference/168860?start=8865)<br> momdo_さん、太田良典さん<br>[資料](https://docs.google.com/presentation/d/1U74164uPJsHQU12OcAeZPVwfwCzAWJy6hSPZyCxG8kM/edit#slide=id.p)|[チームで取り組む！アクセシビリティコーディング・デザイン](https://freshlive.tv/tech-conference/168863?start=3350)<br>小林大輔さん、伊敷政英さん<br>[資料](https://www.slideshare.net/KobayashiDaisuke1/ss-81885664)|
|[アクセシビリティ検証ツールとしてのNVDA入門](https://freshlive.tv/tech-conference/168860?start=12100)<br>西本卓也さん<br>[資料](https://www.slideshare.net/nishimotz/171111-nishimotonvdajpv2)|[アクセシビリティに対する WordPress の責任について](https://freshlive.tv/tech-conference/168863?start=6720)<br>三好隆之さん|
|[日本最大級のトラフィックを操る企業を動かす障害当事者の声。](https://freshlive.tv/tech-conference/168860?start=15675)<br>中野信さん、中根雅文さん|[メディア事業でのアクセシビリティ展開事例・CAではこうやってます](https://freshlive.tv/tech-conference/168863?start=10210)<br>桝田草一さん、土岐真里奈さん|
【R】 英語の単語頻出表作成

#

#単語頻度表

tolower(toupper(tolower(sample)))

strsplit(sample," ")

sample2<- unlist(strsplit(sample," "))

table<-as.data.frame(table(sample2))

table1<-head(table,10)

-------------------------------

#メディアカウント
media_list<-test$SocialNetwork

media_count<-as.data.frame(table(media_list))

media_count_decreasing<-media_count[order(media_count$Freq,decreasing = TRUE),]

barplot(media_count_decreasing[,2],names.arg = x,col=cm.colors(5))

pie(media_count_decreasing[,2],names.arg = x,col=cm.colors(5))
Ubuntuで簡易的なJenkinsサーバを構築

環境: Ubuntu 16.04

# Jenkins インストール
```
% wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
% sudo echo "deb http://pkg.jenkins-ci.org/debian-stable binary/" > /etc/apt/sources.list.d/jenkins.list
% sudo apt-get update -y
% sudo apt-get install -y jenkins openjdk-8-jdk
```
# Jenkins セットアップ
```
% sudo systemctl enable jenkins
% sudo systemctl start jenkins
% cat /var/lib/jenkins/secrets/initialAdminPassword
Admin パスワード
```

ブラウザで　`http://[IP Address]:8080/`　にアクセスし、上記のパスワードでログイン。


# 参考URL
+ https://pkg.jenkins.io/debian-stable/
なんだかんだ Simplenote っていいぞ、な話

# Simplenote is 何
https://simplenote.com/

* evernoteとかそこらへんの系譜の「クラウドメモ」系サービス。
* 運営は Automattic (Wordpressの創始者がはじめたとこ) 。

# どこが便利なの？
* Markdownサポートしてる。
* Webから確認したり編集したりできる。
* もちろんネイティブアプリもある。
* 割と軽い気がする。
* タグ付けして管理もできる。
* プログラマが大好きな Dark Theme あり。
* **タダ**。

# エディタ的にはどうなの？
ちょいちょい残念。
* フォントとか行間とかいじれない。
* 同期の関係なのか、長い文章はたまにいきなり変なスクロールする (いきなり最上部にぶっ飛ばされたりする) 。
* 同期の関係なのか、極稀に文章がぶっ壊れることがある (今のところアプリを再起動すれば直っている) 。
* サポートするMarkdownがほんとに最低限 (例えばGitHub Flavored Markdownの拡張記法なんかは使えない - もちろん打ち込むことはできるけど) 。

# 誰におすすめ？
* Markdownが使いたい。
* なんでもいいからとりあえず端末間共有なメモがほしい。
* ヘタにアプリ入れたくない。
* 写真の保存とかいらない。メモだけシンプルにほしい。
[メモ]VB.NETでのビット演算について 2017.11.15修正

#状況
PLCからShort型のデータ(-32768～32767)を取り出し、それに対してビット演算を行う。

#困ったこと
取得データがSignedShortのため、ビット演算時に取得データをUnsigned型に変換しないといけない。
(というか、簡潔な方法がこれしか浮かばなかった。)

#解決
以下が、使用した関数。
2017.11.15修正

    Public Function GetBitRange(ByVal data As Short, ByVal pos As Integer) As Integer
        Dim range As UShort = 2 ^ pos
        Return (ToUnsigned(data) And range) \ range
    End Function

    Public Function GetBitRange(ByVal data As Short, ByVal startpos As Integer, ByVal endpos As Integer) As Short
        If startpos = 0 AndAlso endpos = 15 Then
            Return data
        End If
        Dim range As UShort = 0
        For i As Integer = startpos To endpos
            range += 2 ^ i
        Next
        Return (ToUnsigned(data) And range) \ 2 ^ startpos
    End Function

    Public Function ToUnsigned(ByVal data As Short) As UShort
        If data < 0 Then
            Return data + UShort.MaxValue + 1
        Else
            Return data
        End If
    End Function

#使用方法
dataはPLCから取得したデータ
pos,startpos,endposはビット番号(0-15)
startposとendposの大小が逆だったら動作しないのは(まだ)仕様です。

便利コードをまとめてるので、バグとかあったら教えてください。
https://github.com/keuxkeu/useful-codes-for-vb.net
AWS lambdaとIFTTTを使って、LINE botへのメッセージをtwitterに転送する

LINE の Messaging API を使えば、LINE bot が受信したメッセージを任意のURLに`POST`させることができます。

https://developers.line.me/ja/docs/messaging-api/reference/#anchor-e2c59da01216760e81e8ca10c55b2e28b276c3e5

これをそのまま直にIFTTTに流せればいいけど、そうはいかないので間にAWS lambdaをかまして変換します。

https://github.com/thrakt/line-to-ifttt-bridge

```py
import json
import os

import requests

def handle(event, context):
    """
    Lambda handler
    """
    
    line_event = event['events'][0]

    if not os.environ["IFTTT_URL"]:
        return "please set IFTTT_URL"

    if line_event["type"] == "message" and line_event["message"]["type"] == "text":
        requests.post(os.environ["IFTTT_URL"], data={
            "value1": line_event["message"]["text"]
        })

    return {}
```

テキストメッセージの時だけ送ります。スタンプとかは無視する。
見てもらうとわかるんですが、各イベントは`events`という配列で来ます。厳密にはこれでループさせたほうがよかった……。サンプルは各イベントの中身なので注意。

また、API Gatewayでlambdaに通すと思いますが、上のやり方だとlambdaプロキシ統合は使用しない設定にする必要があります。LINE側から投げられるjsonを加工せずそのまま受け取るため。

あとはIFTTTのWebhooks(Maker Channelから名前変わってた）をトリガとして、twitterでvalue1をtweetすればOK。

----

で、こんな物の何が嬉しいんだという余談です。

[Clova WAVE](https://clova.line.me/)を買ったんですが、APIとかなく外と連携される手段が一切ありません。ただ、LINEの送信機能があります。そこで考えた。

**このLINE送信機能でLINE botにメッセージ送ったらいろいろできるんじゃね？**

って思うじゃん。俺も思ったわけよ。手始めに音声入力だけでtwitter送れるようにしたい。これが本当のライフログや～ってイキってたんですが……。ダメだった。

ClovaのLINE送信機能は、Clovaのスピーカー単位でグループが作られて、そこに参加している人に大してメッセージを送れるという物です。紐付いたアカウントは別名を付けて、○○にLINE送信 みたいなオーダーになるわけです。

このClovaのグループですが、普通と違って単純な友だち追加では追加されません。友だち追加をすると相手にメッセージが飛び、それを承認したら初めて追加という流れ。**botはClovaのグループへの招待を承認することができません。**多分。能動的に友だち追加なんてできない。

という事で頓挫し、手元にはLINEのメッセージがtwitterに流れるbotだけが残ったという、余談でした……。
Googleスプレッドシートでフィルタを使用する際の注意点

スプレッドシートはとても便利ですが、チームで使う場合はフィルタのかけ方に注意。


【目的】
スプレッドシートで自分だけのフィルタを設定する。

【はじめに】
普通のフィルタの場合の設定はどうなるか？
データ->フィルタから設定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/9ad679ea-7b6d-d1e0-9515-a642ae4075f1.png)

下図のを見る限り、普通のフィルタが設定される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/f44261e0-eac5-17af-d19c-2c9466ab0180.png)

もちろんエクセル同様にフィルタをかけることができる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/b08082b8-c21e-df58-8570-c85be1e85a41.png)

ただしこの場合はこのスプレッドシートそのものにフィルタが設定されている状態となるため、他の人にもフィルタ設定後の状態が共有される。
では、次に自身だけフィルタを設定するにはどうするか。

【手順】
１．データ->フィルタ設定->新しいフィルタ表示を作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/05f80252-8245-426d-3ec1-15fd55f64703.png)
２．下図のようにフィルタリングされる。
　　→自分専用にする場合はフィルタの名前を設定
　　→フィルタの範囲がおかしい場合は「範囲」から調整。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/7182b237-a1e3-9963-f12b-fb07aba2605e.png)
以上
***
これで。ほかの人には見えない自分専用のフィルタが作成できました。
プロジェクトでスプレッドシートを使う場合、重宝します。
結構便利！RailsでTask実行の結果を通知するTaskNotifierクラス

Railsのtaskを実行して成功/失敗の結果をslackなどに通知したいということはよくあると思いますが普通に書くとこんな感じになります。

```rb
task :hoge => :environment do |task, args|
  begin
    # タスクの処理
    # ...
    SlackNotifier.notify(message: "Success to exec task hoge")
  rescue => e
    SlackNotifier.notify(message: "Fail to exec task hoge #{e.message}")
  end
end
```

でこれが1つだけなら良いですが沢山タスクを書いていくとどんどん冗長になっていきます。

```rb
task :hoge => :environment do |task, args|
  begin
    # タスクの処理
    # ...
    SlackNotifier.notify(message: "Success to exec task hoge")
  rescue => e
    SlackNotifier.notify(message: "Fail to exec task hoge #{e.message}")
  end
end

task :baz => :environment do |task, args|
  begin
    # タスクの処理
    # ...
    SlackNotifier.notify(message: "Success to exec task baz")
  rescue => e
    SlackNotifier.notify(message: "Fail to exec task baz #{e.message}")
  end
end

task :bar => :environment do |task, args|
  begin
    # タスクの処理
    # ...
    SlackNotifier.notify(message: "Success to exec task hoge")
  rescue => e
    SlackNotifier.notify(message: "Fail to exec task bar #{e.message}")
  end
end
```

そこでTaskNotifierクラスを書いてみました。
(notifierで使うクラスは自分がお使いのクラスを設定してください)

```rb
class Util::TaskNotifier
  attr_accessor :task_name, :success_message, :fail_message

  def initialize(task, notifier = SlackNotifier)
    @task = task
    @notifier = notifier
  end

  def exec
    begin
      yield(self)
      @notifier.notify(message: success_message || default_success_message)
    rescue => e
      @notifier.notify(message: fail_message || default_fail_message(e))
    end
  end

  private
  def default_success_message
    "Success to exec task #{@task.name}"
  end

  def default_fail_message(e)
    "Fail to exec task #{@task.name} because #{e.message}"
  end
end
```

呼びだすときは処理内容をTaskNotifier#exec内で書くことで成功/失敗時の通知はTaskNotifierクラス内で勝手にやってくれます

```rb
task :foo => :environment do |task, args|
  Util::TaskNotifier.new(task).exec do |notifier|
    print("foo")
  end
end
```
<img width="233" alt="Slack_-_umataro.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/71154/765a0181-b9d8-597e-0b1d-52161d463297.jpeg">


またカスタムでメッセージを表示したいときはカスタム値をブロック内で設定することで個別にメッセージ内容をコントロールできます。

```rb
task :foo => :environment do |task, args|
  Util::TaskNotifier.new(task).exec do |notifier|
    notifier.fail_message = "ooooops!" #カスタムメッセージを設定
    print("foo")
  end
end
```
<img width="215" alt="Slack_-_umataro.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/71154/3c3841c6-e87b-3d90-6ed0-999055fdb0f3.jpeg">

あんなに冗長だったタスクの羅列はこんな風にスッキリ書けるようになりました。

```rb
task :hoge => :environment do |task, args|
  Util::TaskNotifier.new(task).exec do |notifier|
    # タスクの処理
    # ...
  end
end

task :baz => :environment do |task, args|
  Util::TaskNotifier.new(task).exec do |notifier|
    # タスクの処理
    # ...
  end
end

task :bar => :environment do |task, args|
  Util::TaskNotifier.new(task).exec do |notifier|
    # タスクの処理
    # ...
  end
end
```

RakeTaskをよく書く皆様良ければ使ってみてください :+1:
Macでnetkeiba-scraperを使って、競馬データベースをスクレイピングする

機械学習で競馬予測をしてみよう！と思ったものの、データを集めるのが大変です。

そんな時、ありがたいことにscalaでのスクレイピングコードがあったので、これを使わせてもらいました。

まずは、ここからクローンしてきます。
[netkeiba-scraper](https://github.com/stockedge/netkeiba-scraper)

しかし、ハマりどころがいくつもあるので、解決法を書き残していきます。

# 1. homebrewのインストール
MacOS用のパッケージマネージャです。今回はこれを使います。

[MacにHomebrewをインストールする](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)

# 2. Javaのインストール
sbtというscalaのビルドツールを使うのですが、java9だと動かないバグがあるみたいです。
こちらを参考にjava8を入れて使える状態にします。

[MacのBrewでJava8 + Java9を利用する](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2)

バグについてはこちら
[Unable to upgrade sbt on mac with brew](https://github.com/sbt/sbt/issues/3686)
![スクリーンショット 2017-11-12 20.39.20.png](https://qiita-image-store.s3.amazonaws.com/0/114709/d73631ee-368f-4cde-a1e3-27c71a5e20d2.png)

#3. scalaとsbtのインストール
スクレイピングのコードはscalaなので、homebrewからscalaとsbtを入れます。
[Scalaとsbtのインストール方法](http://www.task-notes.com/entry/20151220/1450541851)

#4. build.sbtの修正
ライブラリのバージョンが新しくなっている関係で、依存ライブラリを修正する必要があります。テキストエディタでbuild.sbtを開き、以下をコピペしてください。

変更したのは、"org.scala-lang.modules" %% "scala-xml"と、libraryDependencies ++= Seqの中身です。

```sbt:修正後
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.7.2"

libraryDependencies += "joda-time" % "joda-time" % "2.3"

libraryDependencies += "org.joda" % "joda-convert" % "1.6"

libraryDependencies += "commons-io" % "commons-io" % "2.4"

libraryDependencies += "nu.validator.htmlparser" % "htmlparser" % "1.4"

libraryDependencies += "org.seleniumhq.selenium" % "selenium-java" % "2.41.0"

libraryDependencies += "commons-lang" % "commons-lang" % "2.6"

libraryDependencies += "org.scala-lang.modules" %% "scala-xml" % "1.0.6"

// Scala 2.10, 2.11, 2.12
libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc"               % "2.5.2",
  "com.h2database"  %  "h2"                        % "1.4.196",
  "ch.qos.logback"  %  "logback-classic"           % "1.2.3"
)
```

※ 記事公開後にもライブラリが更新されるとエラーが出る場合があるので、以下のレポジトリの様子を見ながら適時書き換えてください。
https://github.com/scalikejdbc/scalikejdbc
https://mvnrepository.com/artifact/org.scala-lang.modules/scala-xml_2.11

#5.ログイン
もしnetkeiba会員ならいくつかの特別な指標が使えます。(ログインしなくても、特別な指標以外のデータは入ります)

src/main/scala/netkeiba-scraper/Main.scala
をエディタで開くと、以下のようになっているのでメールアドレスとパスワードを自分のものに修正します。

```scala:Main.scala
object RaceScraper {
 
  val mail = "enter your email address"
  val password = "enter your password"
  
  def scrape() = {
    
    val driver = new HtmlUnitDriver(false)
以下略)
```

#6. 実行
**クローンしてきたディレクトリにcdしてから**sbtを起動し、READMEに書いてあるコマンドを上から順に実行します。

ちなみに僕の場合では10年分のスクレイピングのコードが14時間ぐらいでした。
初学者のPWAまとめ

*この記事はPWA初学者が「面白そうだゾ」となったけど「結局PWAってなんなんだ？」と混乱したのでまとめたものです。*

# PWAって何？ 新技術なの？
**違います**。
もちろん新技術は投入されていますが、**PWAそのものは新技術ではありません**。Web2.0みたいなもんです。
つまり、**これまでに出てきた技術、これに合わせて出した技術をひっくるめて使ってPWAというものを作ろう**といっています。Googleが。
（というわけで、基本的にAndroid向け技術らしい。ただ、最近Safariも対応しかけてるとかなんとか）

# PWAってなにをすればいいの？
頑張ってこれを満たしていってください（多分全部じゃなくても許されると思います）。
https://developers.google.com/web/progressive-web-apps/checklist
少なくとも、ここに書いてあることを満たしたWebページをPWAといって怒られることはないでしょう。

# どんなものが使われるの？
こんな感じです（※偏見を含む気がします）。

## HTTPS
最重要枠その一。というのも、これがないと「アプリの正当性を検証できない」ので。
ただ、要するに**全部HTTPSでやらないとPWAとは認めない**という話でしかないので、そこまで難しい話ではありません。

## Web App Manifest  
最重要枠その二。「このサイトはこういう名前で、こういうアイコンがあって、こんな感じのスプラッシュスクリーンがあるよ」というようなことを書きましょう、という話です。
ざっくり言うなら、ホーム画面に置くアイコンの設計図です。というわけで、これまで書いてませんでしたが、PWAにすると**ホーム画面にアイコンをおいて "インストール" することができます**。
実体はWebアプリなので更新はらくらく、めんどくさいストア申請もありません。

## Service Workers
最重要枠その三。キャッシュ機能、プッシュ通知受信機能、遅延送信機能……あたりがついたすごいプロキシ（みたいなもの）です。これがなければPWAはコンセプトごと死滅します。
すごくざっくりいうと「画面世界（DOM）の外で動くもうひとつのJS」です。このため画面世界には直接干渉できませんし、画面世界のJSとは別のスクリプトが必要です。
使うと（キャッシュが十分溜まっていれば）圏外でもページが見られるし、圏外なのにデータを送信（するように見せかけて、あとで通信が復帰した時に改めて送ることが）できます。
プロキシとしてリクエストを乗っ取ってくれるので「アレ取ってきてよ」に「ここにあるよ」とか、「これ送ってきて」「やっとく、通信復活したらね」とか、そういうことをしてくれるわけですね。

## localStorageとかIndexedDBとか
PWAの目的の一つに「**もっとネイティブっぽいことしたい！**」というのがあります。
ネイティブの強さの一つに「クライアント側にデータを持たせられる」というのがありましたが、そのブラウザ版です。もちろん小容量限定ですが、データを保持できます。
Cookieやサーバ側のDBに設定情報を頑張って詰め込む時代なんて、もうとっくに終わってるんですよ……。

## History API
「進む」「戻る」を使った時、たまに変な飛ばされ方をしてイラッとした経験はありませんか。
これはAjaxバリバリなアプリにはままあることですが、ページ遷移と内容の変更が一致しなくなったので、履歴と操作も当然一致しなくなったためです。
これに「じゃあもう履歴いじっちゃえよ」という答えを返すのがこのAPIで、履歴に新しくURLを乗せたりできます。
「ページ遷移はしてないけど、今ここまで来たよ！」というのを履歴で表現できるわけですね。素晴らしい！また一つ状態が減ったぞ！

## その他、デバイスの機能にアクセスするAPI類
例えば Geolocation API とか。

# ざっくりまとめると？
「**キャッシュ機能を滅茶苦茶強化して、オフラインでも見られるようにした！デバイスの機能に触れるようにもしたし、ホーム画面にアイコン置けるようにもした！もうWebアプリはネイティブに負けないぞ！！**」
Docker for WindowsのMobyLinuxVMに接続する方法

# 目的
Docker for Windows(Linux)でDocker HostのMobyLinuxVMの中に入って設定を確認したり一時的に変更したい場合、Hyper-Vマネージャーの仮想マシン接続を試みても、接続することはできません。

そこで、接続する方法を調べてみました。

手順としては、
[DOCKER COMMUNITY FORUMS: How can I SSH into the Beta’s MobyLinuxVM](https://forums.docker.com/t/how-can-i-ssh-into-the-betas-mobylinuxvm/10991/14)
のコメントに書いてある方法ほぼそのままですが、Dockerの仕組みの勉強になったので、個人的なメモを兼ねて残しておきます。

# 注意
- これが必要になるケースはかなり限られると思います。
- 半分興味本位で調べた程度なので、誤りや補足等あればご指摘お願いします。

# 前提
- OS: Windows 10 Pro Fall Creators Update
- Docker for Windows: Version 17.09.0-ce-win33 (13620) stable

# 手順
1. nsenterでPID 1の名前空間に入るコンテナのDockerfileを作成する
2. DockerfileをBuildする
3. ビルドしたイメージを特権付きでHostのプロセス名前空間で起動する

## １．nsenterでPID 1に入るコンテナのDockerfileを作成する
任意の場所に以下のDockerfileを作成します。
util-linuxをインストールし、ENTRYPOINTでnsenterを使って、PID 1(コンテナ自身のinitプロセス)の名前空間に入ります。

``` ruby:Dockerfile
FROM alpine
MAINTAINER You <you@example.com>
RUN apk update && \
    apk add util-linux && \
    rm -rf /var/cache/apk/*
ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid"]
```

## ２．DockerfileをBuildする
上記Dockerfileをビルドします。

```ps1:PowerShell
PS C:\Users\xxx>docker build . -t hostenter
```

## ３．ビルドしたイメージを特権付きでHostのプロセス名前空間で起動する
インタラクティブモードで`docker run`してシェルを起動します。

```ps1:PowerShell
PS C:\Users\xxx>docker run -it --privileged --pid=host hostenter /bin/sh
/ #
```

`--privileged`オプションを付けて特権コンテナとして起動することで、Host上のデパイスにアクセス出来るようにしています。
`--pid=host`でホストの名前空間で起動しています。

# 仕組み
Docker Host上でコンテナが起動されると、各コンテナはHostの**dockerd**からforkしたプロセスとして実行されます。
その際、それぞれのコンテナに異なる名前空間が割り当てられ、PID 1(initプロセス)を起点としてコンテナ上のプロセスが実行されます。
参考：[RED HAT OREN EYE ONLINE: Dockerによるコンテナ化アプリケーションの運用設計ガイド（パート1）](http://jp-redhat.com/openeye_online/column/nakai/3077/)

nsenterは、任意の名前空間に入るツールで、通常はHost上にインストールして各コンテナにアタッチするために利用されます。（docker execコマンドが無かった時代に必須だったらしい）
参考：[Qiita: nsenter・docker-enterでコンテナに入る方法](https://qiita.com/zembutsu/items/0b8171e85828e0e4fc55)

また、各コンテナプロセスの名前空間は`docker run`の`--pid`オプションで変更することができ、Hostの名前空間で実行する事もできます。
`--priviliged`オプションを付ければ、コンテナはHost上の全てのデバイスにアクセスできるため、上記の方法でコンテナからホストの名前空間のプロセスとしてシェルを実行しています。
Vimのプラグインマネージャを乗り換えた

# はじめに
今年の年末はやや慌ただしくなる事が想定されているので、早めにvimrcの大掃除をしようと思ったのがきっかけ。
IT企業に新卒でエンジニアとして入社して以降、ずっとNeoBundleを愛用させていただいていたが、後継であるdein.vimへの移行は昨年見送っていた。自分はミニマルな機能だけで十分かなと感じていたので、この機会に"A minimalist Vim plugin manager."と銘打っているvim-plugに乗り換えてみる事にした。

# vim-plugの導入
[vim-plug](https://github.com/junegunn/vim-plug)のREADME.mdを参考に。

## インストール
plug.vimを~/.vim/autoload/に配置するだけ。

```bash:installation
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

## 使い方
.vimrcは、以下のように`call plug#begin()`と`call plug#end()`の間に使いたいプラグインを羅列するだけ。

```vim:.vimrc
call plug#begin('~/.vim/plugged')
Plug 'Yggdroot/indentLine'
Plug 'bronson/vim-trailing-whitespace'
call plug#end()
```

.vimrcを上書き保存して閉じたら、vimを起動して`:PlugInstall`と打てば記述したプラグインがインストールされる。
なお、[vim-plug](https://github.com/junegunn/vim-plug)によれば、

> Automatically executes filetype plugin indent on and syntax enable. You can revert the settings after the call. e.g. filetype indent off, syntax off, etc.

とのことなので、NeoBundleでは以下のように書いていたが、`filetype plugin indent on`と`syntax enable`の2行が不要になる。

```vim:.vimrc
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundle 'Yggdroot/indentLine'
NeoBundle 'bronson/vim-trailing-whitespace'
call neobundle#end()
filetype plugin indent on
syntax enable
```

## その他
その他コマンドやオプションなど。
`:PlugStatus` プラグインの状態確認
`:PlugUpdate` プラグインの更新
`:PlugUpgrade`  vim-plug自身の更新

プラグインの更新後に追加操作の必要なものは、下記のようにオプションを添えておけば良いとの事。ミニマルと銘打つ割にはケアが行き届いていて便利だ。

```vim:.vimrc
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
Plug 'Valloric/YouCompleteMe', { 'do': './install.py' }
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
```
メモ：Perlで便利なモジュール集

　普段、よく使うPerlモジュールを備忘録として列挙します。新たによく使っていけばここに追記していく予定です。
　あくまでインフラ屋の観点から書いているからか、独自解釈に満ち満ちているため、気になる方はご自身で使ってみて判断してください。

#ネットワーク

| モジュール名| 使い道 | cpanページ |
|:-----------------|:------------------|:------------------|
|Net::Ping::External|perlスクリプト上でICMP pingを簡単に打てる。Net::PingがrootでしかICMP pingを打てないため、選ぶならこちらのほうがいい。|http://search.cpan.org/~colinm/Net-Ping-External-0.11/External.pm|
|Net::Traceroute|perl上からTracerouteを簡単に打つことができる。|http://search.cpan.org/~hag/Net-Traceroute-1.15/Traceroute.pm|

#ファイル転送

| モジュール名| 使い道 | cpanページ |
|:-----------------|:------------------|:------------------|
|Net::FTP|perl上で簡単にリモートサーバにFTPできる。|http://search.cpan.org/~shay/libnet-3.10/lib/Net/FTP.pm|

#管理系

| モジュール名| 使い道 | cpanページ |
|:-----------------|:------------------|:------------------|
|Net::SNMP|perl上で簡単にSNMPでの操作を取り扱うことができる。|http://search.cpan.org/~dtown/Net-SNMP-v6.0.1/lib/Net/SNMP.pm|
|Net::Telnet|perl上でリモートサーバにtelnetできる。比較的扱いやすい印象だけど、セキュリティには注意しよう。|http://search.cpan.org/~jrogers/Net-Telnet-3.04/lib/Net/Telnet.pm|
|Net::SSH|perl上でリモートサーバにsshできる。セキュリティが気になる時は当然こっちを選ぶ。|http://search.cpan.org/~ivan/Net-SSH-0.09/SSH.pm|

#データベース操作
| モジュール名| 使い道 | cpanページ |
|:-----------------|:------------------|:------------------|
|DBI|データベースに接続するために必須ともいえるモジュール|http://search.cpan.org/~timb/DBI-1.637/DBI.pm|
|DBD::Oracle|perl上でOracle DBを使うためのデータベースドライバ。OracleDBを操作する際にはDBIと併せて必要。|http://search.cpan.org/~pythian/DBD-Oracle-1.74/lib/DBD/Oracle.pm|
|DBD::mysql|perl上でMySQLを使うためのデータベースドライバ。MySQLを操作する際にはDBIと併せて必要。|http://search.cpan.org/~michielb/DBD-mysql-4.043/lib/DBD/mysql.pm|
|DBD::Pg|perl上でPostgresを使うためのデータベースドライバ。Postgresを操作する際にはDBIと併せて必要。|http://search.cpan.org/dist/DBD-Pg/Pg.pm|

#数値計算
| モジュール名| 使い道 | cpanページ |
|:-----------------|:------------------|:------------------|
|List::Util|配列の中で最大値や最小値を取得したい時など、配列処理をする。トラフィック分析を行う目的で、mrtgの生ログを整形する際にお世話になりました。|http://search.cpan.org/~pevans/Scalar-List-Utils-1.49/lib/List/Util.pm|
Google HomeからのリクエストかどうかをWebhookで判別する

Google AssistantはAndroid 6.0以降のAndroidから利用される場合とGoogle Homeから利用される場合があります。DialogflowのFulfillmentからのWebhookをHerokuなどで受けてレスポンスを返すようなAPIを作った場合、リクエストがGoogle Homeからなのかスマホからなのかを判別して返すメッセージを変えたいケースがあります。たとえば、応答時にアプリへ誘導したい場合はスマホからの場合は「詳細を確認する場合はアプリを起動してください」と返し、Google Homeの場合は「スマホがあればアプリから詳細を確認できます」というように応答メッセージが微妙に変わる場合や、天気などの情報であればディスプレイのあるスマホには天気のアイコンを返すなどです。

<img width="908" alt="スクリーンショット 2017-11-12 18.44.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3324/18a1d640-55a7-c6dd-9957-d91d3340205f.png">


## `surface.capabilities` をチェックする

リクエストのJsonの `surface.capabilities` プロパティをチェックします。

```js
{ "originalRequest":
  {
    //...省略
    "data":
    { 
      // ...省略
      "surface": { "capabilities": [ 
        { "name": "actions.capability.AUDIO_OUTPUT" } 
        { "name": "actions.capability.SCREEN_OUTPUT" }
      ] },
      // ...省略
    }
  }
}
```

`AUDIO_OUTPUT` は音声の返信が可能であることを表し、`SCREEN_OUTPUT` は画面表示が可能であることを表します。配列型のプロパティのためスマホの場合は両方、スピーカーの場合は `AUDIO_OUTPUT` だけが設定されたリクエストが送られてきます。

[AppRequest  |  Actions on Google  |  Google Developers]
(https://developers.google.com/actions/reference/rest/Shared.Types/AppRequest#surface)

## アプリ自体の設定

そもそもGoogle Homeだけに対応したいような場合はAction on Googleに設定することができます。

<img width="916" alt="スクリーンショット 2017-11-12 21.43.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3324/3ce8aac0-6404-5f1f-1a99-831e879a57d0.png">

Google Homeでしか使えないピカチュウのアプリはこの設定がされていると思われます。

[Google Japan Blog: Google Home で、ピカチュウとお話しよう！](https://japan.googleblog.com/2017/11/google-home.html)

## 補足

スマホとスピーカーで会話を分岐させるような場合はDialogflowのIntentsでContextを設定することで特定のSurfaceのみをトリガーとするようにIntentを設定することができるらしい。主題と外れてきたので割愛。このようなSurfaceの制御については、上記のケースも含めて公式ドキュメントにまとめられているので詳細はそちらを参照ください。

[Surface Capabilities  |  Actions on Google  |  Google Developers](https://developers.google.com/actions/assistant/surface-capabilities)
新Python生活二日目(振返り)【PyQ/5章】

何か武器を一つ持ちたいと思いPyQに登録したが、早々に壁を感じてしまい、
月額料金に見合わない自分の進捗の悪さ。。

気付けばあっという間に一ヶ月経過。

これじゃーいかんと思い立ち、新たに始める【新】Python生活。

日々少しずつですが進捗の記録を残してきます。

#辞書
####■辞書の作成、要素の取り出し
※辞書とはキーと値を持つデータ

```py3
fruits = {} #データをいれるfruitsという名の辞書
'#以下は要素の追加
fruits['りんご'] = '赤'
fruits['みかん'] = '橙'
fruits['バナナ'] = '黄'

print(fruits) #{'りんご':'赤','みかん':'橙','バナナ':'黄'}
print(fruits['りんご']) #赤
```

↓こーやって作る事も出来る

```py3
fruits = {'りんご':'赤'
         ,'みかん':'橙'
         ,'バナナ':'黄'}
```

####■辞書の値の追加・更新

```py3
fruits['メロン'] = '緑' #メロン:緑の追加。既に辞書内にあれば値の更新。
```

####■辞書の値の削除

```py3
del 辞書名['キー'] #キーの値を削除
```

####■辞書の要素の削除

```py3
辞書名.pop(キー) #消去した要素の値を取得
```

辞書にキーが存在するか確認
辞書内に指定したキーが存在しなかった場合、KeyErrorを返す
存在しない場合は処理を返すように設定

```py3
if キー in 辞書名:
    print('あったよ') #処理① 
else:
    print('無かったよ') #処理②
```

辞書に指定されたキーがある場合は紐付いた値を返し、キーが無い場合は指定された値を返す

```py3
fruits = {'りんご':'赤', 'みかん':'橙', 'バナナ':'黄'}
print(fruits.get('マンゴー','売り切れ'))
```

####■キーの一覧を出力

```py3
fruits = {'りんご':'赤', 'みかん':'橙', 'バナナ':'黄'}
fruits_keys = fruits.keys()
print(fruits_keys)
```
```text:出力結果
りんご
みかん
バナナ
```
####■値の一覧を出力

```py3
fruits = {'りんご':'赤', 'みかん':'橙', 'バナナ':'黄'}
fruits_values = fruits.values()
print(fruits_values)
```
```text:出力結果
赤
橙
黄
```
プログラミング未経験者がエンジニア目指す（その3）

# N予備校の章
第1章　05.はじめてのJavaScript
## はじめに
・JavaScriptができるようになると最終的には簡単なゲームが作れるようになるらしい。
## 概要
・JavaScriptとは
・HTML内にJavaScriptを書いてみる
・JavaScriptを別ファイルにする
・エラーについて
## 分かったこと
・HTMLにJavaScriptを書くことができる
・HTMLからJavaScriptファイルを読み込むことができる
・Chromeのデベロッパーツールでエラーの内容を表示することができる
・HTMLとJavaScriptのファイルを分割するのは、それぞれの内容を読みやすくするため
## 疑問点
・何がわからないのかが疑問。疑問がないのはまずいと思う。
## 感想
・HTMLにJavaScriptが書けるなんて純粋にすごい、楽しいと感じた。
## 終わりに
・スペルミスが多く、タイピングのスピードが遅いなと感じた。
seasar2のお勉強5(Seasar2徹底入門の7 S2JBDC入門あたり）

とりあえず動かすだけなら簡単。
なお、本に書いてあったs2jdbc-gen-build.xmlでサンプル動かすやつはやってないです。

以下やってみた内容。
まずは以下のようなPersonというEntityを作る(getter,setterは略）。@Entityアノテーションは必須。
あとは実際にPersonというテーブルに実際に下のクラスの変数と同名のカラムを持ったテーブルも作っておいてください。

```
import javax.persistence.Entity;
@Entity
public class Person implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	/** 名前 */
	public String name;

	/** 所属*/
	public String belonging;

	/** 特徴*/
	public String feature;
}
```

呼ぶ側。実行するとテーブルにはいっている情報が全部取れる。
あとjdbcManager.insert(p).execute();みたいに（pはPersonクラスのオブジェクト）やるとinsertも出来る。今回の投稿では省いてますが。


```
package org.seasar2.s2jdbc.example.service;
import java.util.Iterator;
import java.util.List;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar2.s2jdbc.example.entity.Person;


public class HelloS2jdbc {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		SingletonS2ContainerFactory.init();
		JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

		List<Person> results = jdbcManager.from(Person.class).getResultList();

		for (Iterator<Person> iterator = results.iterator(); iterator.hasNext();) {
			Person person = (Person) iterator.next();
			System.out.print(person.getName());
			System.out.print(person.getBelonging());
			System.out.println(person.getFeature());
		}

		SingletonS2ContainerFactory.destroy();
	}
}
```

あと私は今回postgresqlを使っているので
s2jdbc.diconのdialectはpostgreDialectに切り替えるのと
jdbc.diconのxaDataSourceもPostgreSQLのものに切り替えました。どちらもDoltengでデフォルトで作るとH2側が有効化されていて他のDBリソースのものはコメントアウトされています。

まあ軽く動かす分には簡単だけどDB周りはSQL書きたいのであんまりこのHibernateみたいな書き方は個人的に好きじゃないです。
ということで本では９章のSQL定義ファイルにSQL書くやり方だと

```
		results = jdbcManager.selectBySqlFile
				(Person.class, "org/seasar2/s2jdbc/example/service/Person_Search.sql", sCon).getResultList();
		for (Iterator<Person> iterator = results.iterator(); iterator.hasNext();) {
			Person person = (Person) iterator.next();
			System.out.print(person.getName());
			System.out.print(person.getBelonging());
			System.out.println(person.getFeature());
		}
```

で、resoucesフォルダの下にorg/seasar2/s2jdbc/example/service/Person_Search.sqlってのを作って

```
SELECT name, belonging, feature FROM person WHERE feature = /*feature*/
```

と書いておけばいける。埋め込み文字も行けるしこれならmyBatisみたいに使えて満足。
RancherOSで起動時にNFS(EFS)をマウント

ちゃんとドキュメント化されてないですが、RancherOS v1.1.0以降ではOS起動時にNFS領域のマウントができるようになっています。

cloud-config.ymlに以下のように書けばOKです。

```yaml
#cloud-init
mounts:
  - ["192.2.0.1:/export", "/mnt/efs", "nfs4", "nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2"]
```

参考: [Support NFS shares in cloud-config mounts](https://github.com/rancher/os/pull/1761)

参考リンク先のコメントにcloud-configのサンプルがありますが**間違えている**ので注意してください。
`rancher`配下ではなくトップレベルに`mounts`を書くのが正解です。

以上です。
Cloud Foundryのサービスを定期的に再起動する

# 1. はじめに
IBM Cloud(旧Bluemix)のCloud Foundryで作ったアプリがたまにハングしてしまうので、Google Apps Scriptを使って定期的に再起動する仕組みを作ってみました。
(新しいライト・アカウントでは、Cloud Foundryアプリは10日間cfコマンドを発行しないと、自動的にスリープにされてしまうので、その対策としても使えると思います)

Croud Foundryには[REST API](https://apidocs.cloudfoundry.org/272/)がありますが、IFTTTのWebhooksから叩ける範囲では実現できなかったため、Google Apps Scriptを使ってみることにしました。Google Apps Scriptはあまり知名度がありませんが、実はJavascriptの関数をAPIとして公開することができるため、簡易サーバレス環境として使っています。

最終的な流れは、IFTTT(webhooks) ⇒ google Apps ⇒ CF APIとなります。Google Apps Scriptの部分は[GitHubに公開](https://github.com/akuroda/gas-cf-restart)しましたので、使ってみてください。


# 2. 導入

## 2.1 Google Apps Script
- https://script.google.com/ からスクリプト作成画面を起動し、任意のプロジェクト名を設定します。
- デフォルトのスクリプトの内容を全て削除し、[GitHubのリポジトリ](https://github.com/akuroda/gas-cf-restart)からcf-restart.js の内容をコピペして保存します。スクリプトのファイル名は何でも大丈夫です。
- ファイル⇒プロジェクトのプロパティ⇒スクリプトのプロパティで下記の内容を設定します。CF_LOGIN_URL、CF_API_URLはIBM Cloudの場合を想定して記載しています。
<img width="513" alt="script_property.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/171276/ce8f6068-e3ee-d31a-6579-8bd43c667bc0.png">

- ファイル⇒版を管理で適当な説明を入れて「新しいバージョンを保存」を押します。
- 公開⇒ウェブアプリケーションを導入で、以下のオレンジ枠の部分を設定します。青で囲った部分が実行用URLになります(このURLを知っている人はアクセス可能になるので注意してください)。バージョンは初回は1になるはずです。
<img width="334" alt="webapp.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/171276/5981b81d-a3f3-513e-47a1-03ed58a5dc3e.png">

(公開の手順はハマるポイントなので、うまく行かなかった場合はググって調べてみてください)

## 2.2 IFTTT
2.1の最後のステップで取得した実行用URLに対して、IFTTTからPOSTリクエストを発行します。Request Bodyに以下の形式のJSONでCloud FoundryアプリケーションのGUIDを設定します。
`{"guid": "99999999-9999-9999-9999-999999999999"}`

IFTTTでは、以下のように設定します。この例では、日曜日の午前2時に再起動するようにしてみました。Web RequestはURL、Method、Content Type、Bodyを設定します。

![gas-ifttt.png](https://qiita-image-store.s3.amazonaws.com/0/171276/c8be09e8-18b5-ce39-7213-53a37177d7f0.png)


# 3. その他
Google Apps Scriptに対してHTTPリクエストを行う場合、リダイレクトが発生するので、自分で直接呼び出す場合は注意が必要です。
Stringのcharacters.countが非推奨(deprecated)になって、文字列の長さを取得する実装について

# はじめに
`characters.count`と実際に人が見てカウントできる数を取得していたのですが、
(正確にできるようになったのはどうもSwift4.0.0以降?)
[Qiita Swift の文字列の長さ yamoridon様の記事](https://qiita.com/yamoridon/items/6f73ffe02ab46eb6ae85)
Xcode9.1以降ではStringの`characters`プロパティが非推奨になっていました。

<img width="400" alt="screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/f8fa7c49-8ce0-8af6-3909-26111571bd69.png">

# サンプル
しかし、Swift4.0.0以降で`count`プロパティが強力になったようで、これを使うと良いのかもしれません。例を示します。  
今までの`characters.count`と同じ値を出すものを探してみました。

```swift
let text = "ABCDEFG"
print(text.utf8.count)              // 7
print(text.utf16.count)             // 7
print((text as NSString).length)    // 7
print(text.utf8CString.count)       // 8
print(text.unicodeScalars.count)    // 7
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7

//////////////////////////////////////////////////////////

let text = "ABC😄DEF"
print(text.utf8.count)              // 10
print(text.utf16.count)             // 8
print((text as NSString).length)    // 8
print(text.utf8CString.count)       // 11
print(text.unicodeScalars.count)    // 7
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7

//////////////////////////////////////////////////////////

let text = "ABC👩‍👩‍👧‍👦DEF"
print(text.utf8.count)              // 31
print(text.utf16.count)             // 17
print((text as NSString).length)    // 17
print(text.utf8CString.count)       // 32
print(text.unicodeScalars.count)    // 13
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7
```

ちなみに、UITextViewなどに入っている文字(NSMutableAttributedStringなど)に対して色をつけるなどのNSRangeを決定する際は見た目のカウント数で取得してはうまく行かなかったりします。

---

以下`string.count`

<img width="700" alt="no.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/6eb5e99f-92d9-9340-ada9-b4d5bb293ebe.png">

---

以下`string.utf16.count`(`(text as NSString).length`と同じ)

<img width="700" alt="ok.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/71229a72-960a-f020-6ad1-d84df30d1479.png">

---

以下[NSMutableAttributedStringのlengthプロパティ](https://developer.apple.com/documentation/foundation/nsattributedstring/1418432-length)

<img width="700" alt="okok.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/d587aa94-7fef-6511-7c1b-d5b8664f8753.png">

文字に色をつけるなどをする場合は1番下の**NSMutableAttributedStringのlengthプロパティ**が良いのかもしれません。

**NSRange**などの範囲決定に利用するNSMutableAttributedStringのlengthは自動で利用する文字コードに対応されるのかなという疑問が残りました。(文字コードの詳しい詳細については理解できなかったです...)

# 参考にさせていただいた記事
- [Updating Strings For Swift 4](https://useyourloaf.com/blog/updating-strings-for-swift-4/)
- [Apple Reference](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html)

見て頂いてありがとうございます。
第5章 Ruby基礎：RPGを作る ～配列/ハッシュまで

#第5章 Ruby基礎：RPGを作る ～配列/ハッシュまで
Rubyの書き方について以下3点についてまとめる
 - 条件分岐、変数
 - 繰り返し構文
 - 配列/ハッシュ





#####条件分岐
---

```
if 条件（真偽値）
  文1
elsif
  文2
else
  文3
end
```
elsif 、elseは条件によっては省略可。
endの付け忘れに気を付ける。





#####繰り返し構文
---

```
初期値
while 　条件式　do
  処理
end
```

```
初期値
while 　条件式　do
  処理
end
```
```
初期値
for 変数　in オブジェクト　do
  処理
end
```
whileは条件がtrueの場合繰り返す、untilは反対でfalthの場合繰り返す。
for文のオブジェクトについては下記、配列/ハッシュを参照。
よくある書き方として「..」を使った範囲指定や、「+=」「!=」の書き方は覚えておくべき
これらもendを忘れないように。



#####配列/ハッシュ
---
 - 配列…[　]で囲む。
[　]内に複数の要素を入れる場合はカンマ(,)で区切る。
複数の要素の位置を**添字**といい、**0から数える**<p>|　|で囲った変数を使用できる.eachの処理を使える。


 - ハッシュ…{ }で囲む。
ロケット演算子=>を使って参照できる。
{ }内にロケット演算子を使うことで2つの要素を組み込める。
これも.eachの処理を使うことができる。

どちらも変数を指定しないでいきなり使うことができることが便利なのだろうが、
配列とハッシュの違いがわかりにくい。
おそらく単純なものを配列、複雑な要素が絡むものをハッシュで使い分ける？
[ASUS]x200maのキーボートを交換

なぜか急にc,s,altボタンが利かなくなってしまったので、
交換した。

簡単にではあるけど備忘録
※分解は自己責任でお願いします。
ちなみに私も素人なので。。

#１．裏面の９か所あるネジを外す
※内二つはすべり止めの下に隠れているので、すべり止めを取る。
すべり止めは両面テープでくっついているのでまたつけられる。
![DSC_0229.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/9550367e-7db3-c312-8481-8136b4b99d1f.jpeg)

#２．隙間に薄い何かを食い込ませて徐々に開く
画像は開いた状態
２本つながっているケーブルというか紙は、細い方がマウスパッド
太い方がキーボードと繋がっている。この２本を外す。それぞれパチッっとする蓋？抑えがあるのでそれを上げてから外す
![DSC_0230.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/ef21c6fd-ca04-a46e-930d-20904f20401b.jpeg)

#３．開くとキーボード部分が分離できる
![DSC_0231.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/4a9a4f0b-1181-e49f-a60f-f045be51b7ef.jpeg)
![DSC_0232.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/35e07d5e-41ff-b998-5747-633eb5367780.jpeg)

#４．黒いカバーを外す（両面テープ
![DSC_0233.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/8cd9195c-d4e8-574e-81e2-e97ba8b29a4c.jpeg)

#５．黒い粒みたいなやつを端っこから外してそのあとは手で外していき、新しいキーボードと取り換える。
※再利用したい場合はアルミ？の部分がべこべこにならないように慎重に外す。
私は捨てるつもりだったので気にせずベッコベコにしてやった。
あとこの黒い粒みたいなものでキーボードの貼りを持たせているので、
無理にとって新しいキーボードを取り付けてもキータッチに張りがでないので注意。
私の場合は、テープで留めた上でマザーボードとキーボードとの隙間にスポンジ挟んで誤魔化した。
![DSC_0234.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/d678786e-6cdf-1094-fb22-eb6c94a85e4a.jpeg)
![DSC_0235.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/b704c421-4d51-fa88-5231-5740eab34e0f.jpeg)

#６．あとは手順を逆にして戻していくだけ。
マザーボードとキーボードが分離するのでかなり簡単だった。

おーわり
[メモ] 継承と仮想関数

C++の自分用の備忘録.
久しぶりにC++を触る機会があったのでまとめました.

## virtualなしの場合
基底クラス(Base1)型変数は実体(インスタンス)に関わらず基底クラス(Base1)の関数が呼び出される.

```cpp:non_virtual.cpp
class Base1 {
  public:
  Base1(){}
    void func() { cout << "Base1" << endl; }
};

class Sub1 : public Base1 {
  public:
    Sub1(){}
    void func() { cout << "Sub1" << endl; }
};
```

```cpp
Base1* b1 = new Base1();
Base1* b2 = new Sub1();
b1->func();
b2->func();
```

実行結果

```
Base1
Base1
```

## virtualありの場合
基底クラス(Base2)型変数でも実体(インスタンス)によって呼び出されるクラスの関数が変化する

```cpp:virtual.cpp
class Base2 {
  public:
    Base2(){}
    virtual void func() { cout << "Base2" << endl; }
};

class Sub2 : public Base2 {
  public:
    Sub2(){}
    void func() { cout << "Sub2" << endl; }
};
```

```cpp
Base2* b1 = new Base2();
Base2* b2 = new Sub2();
b1->func();
b2->func();
```

実行結果
```
Base2
Sub2
```

## final/override(C++11)
+ final
  + 誤った継承の防止(クラス)
  + 誤ったオーバーライドの防止(関数)
+ orverride
  + 仮想関数(virtual)指定忘れ防止
  + 引数の型・個数の異なる関数のオーバーライド防止
  + オーバーライドするなら明示するようにする(個人の感想)
  
```cpp:final_override.cpp
class Base1 final {} // 継承禁止クラス

class Base2 {
  public:
    Base2(){}
    // 仮想デストラクタ
    // 派生クラスのデストラクタが呼び出させるために
    // virutalが必要
    ~Base2(){}
    
    virtual void func_final() final;
    virtual void func_virtual();
    void func_nonvirutal();
};

class Sub : public Base2 {
  public:
    Sub(){}
    virtual ~Sub(){}
    
    // void func_final(); // finalメンバ関数はオーバーライドできない
    void func_virtual() override; // オーバーライドできる
    // void func_virtual(int a) override; // 引数の不一致. オーバーライドできない
    // void func_nonvirtual() orverride; // 非仮想関数はオーバーライドできない
};
```

## 純粋仮想関数
実装を持たないプロトタイプだけの関数
純粋仮想関数を持つクラスを「抽象クラス」と呼び, インスタンスを生成することができない. また, 継承したクラスは必ず実装しなればならない.

```cpp:pure.cpp
class Base {
  public:
    virtual void func(void) = 0;
};

class Sub {
  public:
    void func() override { cout << "Sub(Override)" << endl; }
};
```

## インターフェース
抽象クラスでインターフェースを表現し, 派生クラスで実装する.

```cpp:interface.cpp
class IAnimal {
  public :
    virtual ~IAnimal(){};
    virtual void cry(void) = 0;
};

class Dog : public IAnimal {
  public:
    Dog(){}
    ~Dog(){}
    void cry() override { cout << "わんわん" << endl; }
};

class Cat : public IAnimal {
  public:
    Cat(){}
    ~Cat(){}
    void cry() override { cout << "にゃん" << endl; }
};
```

```cpp
IAnimal *dog = new Dog();
IAnimal *cat = new Cat();
dog->cry();
cat->cry();
```

実行結果

```
わんわん
にゃん
```
次々と登場する音声AIアシスタント、スマートスピーカ

10月頭に Google Home が日本で発売開始、LINE の Clova WAVE も一般販売を開始、そして11月8日、アマゾンジャパンがスマートスピーカー「Amazon Echo」シリーズの日本語対応版の発売を発表しました。これら次々と登場する音声AIアシスタントは、スマホと同様にアプリ開発のエコシステムをもっています。アプリのことをGoogleでは”Action”、Amazonでは”Skill”といいますが自分の使いたいActionやSkillを有効にすることにより、自宅で銀行口座の残高を照会したり、企業の商品を注文したりといったことがスマートスピーカーでできるようになります。Amazon Echoでは、すでに100以上の国内パートナがおり、さまざまな大手企業のSkillが用意されている音声AIアシスタントの動きをオンラインメディアからピックアップしてご紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)

#[開発パートナーの多彩さ誇るAmazon Echo、ただしまだ苦手もある] (http://itpro.nikkeibp.co.jp/atcl/column/14/346926/110801195/)

Amazon Echoの国内発表に関するITProの記事です。
2017年11月8日、アマゾンジャパンがスマートスピーカー「Amazon Echo」シリーズの日本語対応版の発売を発表したこと、「スキル」と呼ばれるAmazon Echoの機能を開発するためのフレームワーク「Alexa Skills Kit（ASK）」と、Alexaの機能を外部端末で利用できる「Alexa Voice Service」の国内での提供開始も発表したことを伝えています。

・一連の発表で特に目を引いたのが、日本国内におけるASKの開発パートナーの数。100以上のパートナーが開発したAmazon Echo向けのスキルは11月8日時点で265。発売前からバラエティに富んでいる。

・ただし、家庭での利用を想定したスキルがほとんどで、業務利用を想定したスキルはまだほとんどないとのこと。理由としては、業務用途では、複数回のやりとりが必要となることが多く、そのような用途には「どのような順序でユーザーに質問をするかという対話のシナリオを練る必要がある」ため、開発スキルが求められ難しくなるとのこと。現在、米国でのスキルも大半は一問一答式でやりとりが完結するものとのこと。


# [AI音声アシスタントを巡る新たな戦い] (http://itpro.nikkeibp.co.jp/atcl/column/14/278383/080700058/)

ITProが8月に掲載したAI音声アシスタントをめぐるGoogleとAmazonの戦いをレポートした記事です。

まずは、Amazon EchoがAI音声アシスタントを搭載したスマートスピーカ市場の7割を占めていることを紹介したのちに、Amazon Echoの勢力が拡大している理由の１つとして、2016年6月に音声アシスタント機能であるAlexaを開発業者に公開したことを取り上げています。2017年1月のCES2017では、すでにAlexa搭載デバイスが700も発表されていると伝えています。

また、Alexaの機能を開発者が独自に強化できる「Alexa Skill Kit」を公開したことも普及に貢献したと取り上げている。すでに米国では、1万を越えるSkillが提供されているとのこと。

一方で、Amazonを追従するGoogleの動きも紹介している。2016年11月に米国でGoogle Homeを販売開始。2016年12月にはAlexaのSkillに相当する「Action」を作成するための「Actions on Google API」を、2017年4月には第三者のデバイスにGoogle Assistantを搭載できるようにする「Google Assistant SDK」をそれぞれ公開。
その他、サムソンやLINEの親会社であるネイバーなどの動きなども紹介しています


#[音声アシスタントはAIスピーカーの外へ飛び出す](http://thebridge.jp/2017/10/voice-assistant-gets-out-of-smart-speaker)

「起業家と投資家を繋ぐ」をコンセプトに国内スタートアップを中心としたテクノロジー系ニュースを配信するブログメディア”The BRIDGE”への寄稿記事です。VR や音声インターフェイスなどの先端テクノロジーを活用した UX/UI 領域で事業展開している、WHITE の CEO 神谷憲司氏が音声アシスタントの動きについて解説してくれています。

音声アシスタントがコントロールする製品は家庭内だけにとどまらないことを紹介してくれています。Amazon Skills Store には「Connected Car」のカテゴリもあり、Ford、Mercedes、BMW、Tesla、Hyundai、日産など自動車メーカー各社が Skill を提供してくれており、家にいながらEchoを通じてリモートでエンジンをかけたり、車内のエアコンを調節したりといったことが可能になります。

さらに、Ford、BMW、日産などの自動車メーカーは車自体に Alexa を搭載することを発表している。年内から2018年に実装が見込まれる。今年の1月に公開された Ford の動画（以下）が、Alexa を搭載したクルマの便利さを上手く表現しています。

#[will.i.amによるスタートアップ「i.am+」が企業向けAIアシスタント「Omega」をリリース](https://robotstart.info/2017/11/10/ai-platform-omega-for-enterprise-by-wiiliam.html)

ハリウッドの技術ベンチャー「i.am+」が新しい音声アシスタント「Omega」を発表したことをレポートしている「ロボスタ」の記事です。

Omega（オメガ）とは企業向けの音声ベースのUIを提供するAIプラットフォーム。特徴は企業にフォーカスしていること、複数のデータポイントと豊富なコンテキストを活用することで自然で直感的なやりとりが可能だといいます。また公式サイトによれば、既に、テクノロジー、ヘルスケア、金融サービス、保険業界の企業にサービスを提供しているとのこと。

シナリオを組み込んだ業務用のやりとりもすぐにAIアシスタントで可能となっていくのでしょうか
【Playcanvas】オブジェクト間でのイベントの通知

オブジェクト間でのイベントの通知は

```js

// イベントの登録
this.app.on(イベント名, イベントの処理, イベントのスコープ);

// 例
this.app.on('game:pause', function (){ }, this);


// イベントの発火
this.app.fire(イベント名);

// 例
this.app.fire('game:pause');

```

を用います。


イベントの登録は「initialize」で行います。
イベントの発火はボタンのクリック時やキャラクターの死亡時などで行います。

イベントの登録、発火の処理は同じゲームのインスタンス内で共有しています。
ですので別々のスクリプトでイベントの登録、発火を記述することができます。
これにより、各オブジェクト間の結合度が下がります。
Windows Client に対して sysprep を実行する時のノウハウ

これは[Windows Client に対して sysprep を実行する時のノウハウ (tumbler.com) ](https://yamanyon.tumblr.com/post/164708129158/windows-client-%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6-sysprep-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%99%82%E3%81%AE%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6)を複製したものです。

# ミニセットアップで必ず聞いてくるユーザー アカウントの新規作成をバイパスする方法

https://blogs.technet.microsoft.com/askcorejp/2010/05/28/12427/

この操作を不用意にバイパスすると、アカウントが一切存在しない状態となってしまいます。
例えば。

1. 最初のセットアップで User というユーザーアカウントを作成
2. Administrator を有効化
3. アカウント User を削除
4. LocalAccount にパラメーターを仕込んだ応答ファイルで sysprep 実施

と操作すると、Administrator アカウントが利用できない状態になり、かつ別の管理者権限を所有したアカウントも不在となるため、該当ディスク イメージはログオン不能になりました。

しかしながら、[Administrator アカウントを無効にさせないためには、AutoLogon を設定すれば良いとのこと。(mctjp.com)](http://mctjp.com/2011/08/12/windows7-%E3%81%AE%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/)

# ミニセットアップで必ず聞いてくる「設定」画面で「簡単設定」ボタンを選択する方法

http://miyunyanchan.hatenablog.com/entry/2017/03/28/211057

http://mctjp.com/2011/08/12/windows7-%E3%81%AE%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

oobeSystem の Microsoft-Windows-Shell-Setup/OOBE で  ProtectYourPC を 1 に、という記述が多いですが、これはどうもダウトなようです。
Windows 8.1 Enterprise with Update1 環境で試してみましたが、うまくいきませんでした。調査中ですが Specialize あたりにあるんじゃないでしょうか。

# 今使っているプロファイルを既定値にする方法

http://miyunyanchan.hatenablog.com/entry/2017/03/28/211057

specialize の  Microsoft-Windows-Shell-Setup で  CopyProfile を true にします。

# その他の基本的な設定方法

http://www.vwnet.jp/Windows/WS12R2/2016071301/sysperp_untitled.htm

こちらに大体必要なことが記載されています。
仙台CTF WriteUp

偉い人がWriteUpまでがCTFと言っていたので。

解けた気がする奴だけ。

##**復習問題**##
**1 プロキシログの調査**
プロキシログを渡すから、不審ホストと通信している端末のIPをSubmitしろという問題
不審ホストが判明しているので、提供されたAccessログからホスト名で検索する。
同列のIPアドレスをSubmit

**2 メモリフォレンジック**
感染端末のメモリイメージ渡すから不審ホストへ通信しているプロセスのPIDをSubmitしろという問題
volatilityのnetscanからPIDをSubmit

**3 タイムライン解析**
ディスクイメージを渡すから、ダウンローダーを特定しろという問題
FTK Imagerでddファイルを読み込む。ユーザーのデスクトップに変なファイルがあったからSubmit

**4 ダウンローダーの通信先**
検体とaccess.logを渡すから、通信先を特定しろという問題
検体をサンドボックスに投げて通信先特定してSubmit

##**ログ解析**##
**1 大量アクセス**
アクセスログから大量アクセスしていたIPアドレスを特定しろという問題
テキストエディタで開くと、同じIPで大量のログが残っているのでSubmit

**2 SSHによる不正ログイン**
SSHのログから不正ログインされたユーザー名を特定しろという問題
AcceptedでGrepしてSubmit

**3 シェルのコマンド履歴**
シェルのコマンド履歴からダウンロード元を特定しろという問題
historyファイルをテキストエディタで開くとURLがあるのでSubmit

##**マルウェア解析**##
**1 マルウェアの通信先(EXE編)**
EXEファイルの通信先を特定しろという問題
他の問題解いてるあいまにサンドボックスに投げて通信先特定してSubmit

**2 マルウェアの通信先（JS編）**
EXE編と一緒

**3 マルウェアの通信先（Link編）**
Linkファイルを右クリックしてプロパティを開く。
リンク先にURLがあるのでSubmit

##**Forensics**##
**2 不審USBメモリ**
systemレジストリとsetupapi.logが渡されるので、感染源のUSBメモリを特定しろという問題
レジストリビューアでsystemレジストリを読み込む
感染源のUSBメモリ以外に社有のUSBメモリがあるらしい。
丁寧に社有のUSBメモリのシリアルを教えてくれてるので、シルアルで検索すると前後に別のUSBメモリのシリアルが見つかるのでSubmit

##**セキュリティ診断**##
**1 管理者アカウント**
特定のWebシステムでアカウントの管理に問題がある。管理者アカウントでログインしてフラグを探せという問題
適当に思い当たるID,Passを入力したらログインできてしまったのでSubmit

**2 ユーザー一覧**
管理者ページにユーザー一覧が表示できてしまう脆弱性があり、そこに含まれるフラグを探せという問題
SQLiの問題だった。「' ;」で全アカウント表示できるので一覧に含まれるフラグをSubmit

##**雑学**##
**1 NSAの攻撃ツール**
WannaCryで使用された攻撃ツール名を答えろという問題
WannaCry NSAでググったら出てくるのでSubmit

**2 電子メール詐欺**
送金詐欺をアルファベット3文字で何というかという問題
送金詐欺でググったら出てくるのでSubmit


##**感想**##
・もう少し頑張れたかなと思う。特にフォレンジック系は凡ミスで落とした感じがした
　（既に画面に答えがあるのにSubmitする形式が違うとか、見る所が違うとか）
・ツールを事前に準備していたつもりだったけど、起動確認していないものだから.netが足りなかったりと残念な部分が目立った
　今回はレンタルパソコンだったせいにして、次回は自前パソコンでがっつりツール入れ込んで参加しようと思う



次回もあれば必ず参加したい。次は今回の1400点を最低ラインとして頑張る！（同じくらいのレベルだったら！）

**運営の皆様、参加者の皆様 お疲れ様でした！次回もよろしくお願いします！**
AtomでJSXファイルを扱う際にhtmlタグを補完させる方法



Atomで拡張子が`.jsx`のファイルを扱う際、デフォルトではhtmlタグを入力してもtabで補完がされません。補完を有効にするには以下のようにします。

まず、emmentというパッケージをインストールします。

```
$ apm install emmet
```

Atom -> Keymapを選択するとkeymap.csonというファイルが開きます。
ファイルに以下の記述を追加します。

```
'atom-text-editor[data-grammar="source js jsx"]':
  'tab': 'emmet:expand-abbreviation-with-tab'
```

すると以下のように例えば`div`と入力してtabを押すと`<div></div>`が補完されるようになります。

![hello.gif](https://qiita-image-store.s3.amazonaws.com/0/140792/1085759e-d22a-f8ad-233e-60d89bba3b27.gif)
jQuery3.x時代のページ遷移時「ふわっと」フェードイン/フェードアウト

# 今までのフェードイン

ページ遷移時にページ全体をふわっと表示(フェードイン)させる方法には、以下のHPのような方法がありました。

[【jQuery】ほんの少しのコードでページ読み込み時にフェードインのエフェクトを追加する方法。](http://on-ze.com/archives/341) (onzeさま)

```fadein_1.js
$('head').append(
  '<style type="text/css">body {display:none;}'
);

$(window).load(function() {
  $('body').fadeIn(800);
});

```

冒頭でCSSを記述して、ページ全体(```body```部)を```{display:none;}```で非表示にしています。これは、ブラウザの設定でJavaScriptが無効になっていた場合、画面に何も表示されないという事態を避けるためにjs内で記述しているのですね。
しかし、jQuery3.xでは動作しません。これは```hide()/show()```周辺の仕様が変更され、```fadeIn()```でCSSの```display```をクリアできなくなったのが原因らしい。詳細は[【翻訳まとめ】jQuery 3.0 alpha リリースノート](https://qiita.com/fmy/items/abdeeb9abaf56058c20e)でご解説されております。
(ちなみに上記コードの```.load```もjQuery3.xでは使用できません。)

# どうすりゃええねん

ページ全体を示す、例えば```body```あたりに新たに```class```を用意して、それの取り外しで表示/非表示を制御しましょう。
これは[jQuery 3.0時代のコーディングお作法 / show()/hide()編](http://blog.webcreativepark.net/2015/12/01-122931.html)(to-Rさま)を参考にさせていただきました。
まずhtmlで


```fadein_2.html
<body class="is-hide">
  なんか内容〜
</body>

```

としておきます。
そしてjQuery。

```fadein_2.js
$('head').append(
  '<style type="text/css">.is-hide{display:none;}</style>'
);

$(window).on("load",function() {
  $('body').fadeIn(800).removeClass("is-hide");
});

```

はいっ！ページ遷移時にフェードインできるようになりました。

# あとはフェードアウトだ！

ページ遷移時にふわっとページを消す(フェードアウト)のもやりましょう。
まずはhtmlでリンクを設定。

```fadeout.html
<a href=url class="fadelink">ボタンとか画像とか?</a>

```

上記で```fadelink```という```class```を設定しました。
これを使って、

```fadeout.js
$(function(){
  $('a.fadelink').on("click",function() {
    var url = $(this).attr('href');
    if (url != '') {
      $('body').fadeOut(800);
      setTimeout(function(){
        location.href = url;
      }, 800);
    }
    return false;
  });
});

```

とします。これで、0.8秒間(上記の800は800ミリ秒のこと)リンク先への移動を待ちつつ、ページ全体をフェードアウトさせることができました。
ついでにブラウザバック等をした時の挙動も設定しておきましょうか。

```pageshow.js
$(window).on("pageshow",function() {
  if (event.persisted) {
    window.location.reload();
  }
});

```

これでブラウザバック時もリロードされて、フェードインでページが表示されるようになりました。

#まとめ

「ページをふわっと表示させて、移動時にふわっと消す」まとめです。

```fade.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <script type="text/javascript" src="js/jquery-3.x.x.min.js"></script>
</head>

<body class="is-hide">
  なんか内容〜
  <a href=url class="fadelink">ボタンとか画像とか?</a>
</body>

</html>

```

```fade.js
$('head').append(
  '<style type="text/css">.is-hide{display:none;}</style>'
);

$(window).on("load",function() {
  $('body').fadeIn(800).removeClass("is-hide");
});

$(window).on("pageshow",function() {
  if (event.persisted) {
    window.location.reload();
  }
});

$(function(){
  $('a.fadelink').on("click",function() {
    var url = $(this).attr('href');
    if (url != '') {
      $('body').fadeOut(800);
      setTimeout(function(){
        location.href = url;
      }, 800);
    }
    return false;
  });
});

```

問題点・改善点等ございましたらご連絡ください。
[emscripten] 数値計算オンライン

数値計算をEmscriptenでオンラインで実行できるサイトを作りました。
以下から参照ください。

https://nicktominaga.github.io/

![caeonline.PNG](https://qiita-image-store.s3.amazonaws.com/0/213451/0ff1d38b-8158-8e6a-2665-266f7dfe1902.png)

内容は
・関数電卓
・連立方程式ソルバー
・常微分方程式ソルバー

の三つ。

関数電卓は入力された数式をパースして、evalする必要があるが、
これをjavascriptでやるのは面倒なので
C++のMITライセンスコードであるmuparserを使用した。
（http://muparser.beltoforion.de/ ）
emscriptenにより、C++をJavaScriptに変換している。
フレームワークは使わず。シンプルなデザインを目指した。

連立方程式はboost uBLASを利用している。また、常微分方程式はboost odeintを利用している。
同様にemscriptenにより、C++をJavaScriptに変換している。
グラフはNVD3で描画させている。
Pythonにおける可変長引数の関数

基本的なことだけど、忘れてきたので備忘録
任意の数の引数を取る関数は2つの方法で実現可能。

##シーケンス型
仮引数の前に\*をつけることで、複数引数を一つのタプルとして扱う方法。

```py:test.py
def test(*foo):
    print "Hello " + " and ".join(foo)

test("Jim", "Hiroshi")
```
*実行結果*
``Hello Jim and Hiroshi``

**つまりは「可変長引数は関数の仮引数群の中で1個だけ」かつ「仮引数群の最後に位置しなければならない。」ということがわかる。**

##辞書型
仮引数の前に\*\*をつけることで、複数引数を一つの辞書として扱う方法。
こっちのやり方は直感的だけど、実引数としてキーワード付き引数を使わなければならない。

```py:test2.py
def test(**foo):
    print "Hello " + foo.get("name1") + " "  + foo.get("name2")

test(name1 = "Jim", name2 = "Hiroshi")
```
*実行結果*
``Hello Jim and Hiroshi``

---

ちなみに可変長仮引数はfooFunc(\*foo2,\*foo)、fooFunc(\*\*foo2,\*\*foo)、fooFunc(\*foo,foo2)、fooFunc(\*\*foo,foo2)はSyntaxErrorなので注意。
fooFunc(foo2,\*foo)、fooFunc(foo2,\*\*foo)、fooFunc(\*foo2,\*\*foo)は問題ない。
エクセルの画像を取り出す。

エクセルの図を簡単に取り出す方法。
意外と使えるので、自身の備忘録として投稿。

【目的】
エクセルにある図や画像を取り出す。

【手順】
１．保存したい図をコピーして画像として適当な場所にペースト。
２．エクセルを「.xlsx」形式で保存してファイルをとじる。
３．２で保存したファイル名の拡張子を「.zip」に変更する。
４．リネームしたZIPファイルを解凍する。
５．解凍したフォルダからみてxl\media\に移動する。
６．５の移動先に１でペーストした画像が保存されてます。
以上


***
複雑な図形を画像として取り出したい時にとても重宝します。