OmniAICreator/Qiita-1.07M huggingface dataset:
Akka ActorをAkka StreamのSource/Flow/Sinkとして使う

AkkaのActorをAkka Streamと組み合わせて使いたかったので、簡易的な使い方を記載しています。

## Akka ActorをAkka StreamのSourceとして使う

```scala
val simpleSource = Source.actorRef[Int](bufferSize = 10, OverflowStrategy.dropHead)
val simpleSink = Sink.foreach[Int](number => println(s"my number is $number"))

val myActor: ActorRef = simpleSource.to(simpleSink).run()

myActor ! 100
myActor ! 200
myActor ! akka.actor.Status.Success("Stream処理が完了しました。")
```

実行結果

```sh
myActor ! 100
myActor ! 200
```

## Akka ActorをAkka StreamのFlowとして使う

```scala
// 以下のようなActorを定義する
class MyActor extends Actor {
  override def receive: Receive = {
    case number: Int => // Intのメッセージを受け取ったらStringで返す
      sender() ! s"Received number is $number"
  }
}
```

```scala
val myActor = system.actorOf(Props[MyActor], "myActor")

import akka.util.Timeout
import scala.concurrent.duration._
implicit val timeout = Timeout(5 seconds)

val simpleFlow = Flow[Int].ask[String](parallelism = 5)(myActor)
val simpleSource = Source(1 to 10)
val simpleSink = Sink.foreach[String](println)

simpleSource.via(simpleFlow).to(simpleSink).run()
```

実行結果

```sh
Received number is 1
Received number is 2
Received number is 3
Received number is 4
Received number is 5
Received number is 6
Received number is 7
Received number is 8
Received number is 9
Received number is 10
```

## Akka ActorをAkka StreamのSinkとして使う

```scala
// Sinkとして使うAkka Actorが受け取るメッセージを定義
object MyInit
object MyAck
object MyComplete
case class Fail(throwable: Throwable)

// 以下のようなActorを定義する
class MyActor extends Actor {
  override def receive: Receive = {
    case MyInit =>
      println("Stream initialized")
      sender() ! MyAck // Ackを返す
    case MyComplete =>
      println("Stream completed")
      sender() ! MyAck // Ackを返す
    case Fail(ex) =>
      println(s"Stream failed :ex")

    case message =>
      println(s"MyActor received message: $message")
      sender() ! MyAck
  }
}
```


```scala
val simpleSource = Source(1 to 10)

val myActor = system.actorOf(Props[MyActor], "myActor")

// actorRefWithAckを使うとバックプレッシャーが働く
val simpleSink = Sink.actorRefWithAck[Int](
  myActor,
  onInitMessage = MyInit,
  onCompleteMessage = MyComplete,
  ackMessage = MyAck,
  onFailureMessage = throwable => Fail(throwable)
)

simpleSource.to(simpleSink).run()
```

実行結果

```sh
Stream initialized
MyActor received message: 1
MyActor received message: 2
MyActor received message: 3
MyActor received message: 4
MyActor received message: 5
MyActor received message: 6
MyActor received message: 7
MyActor received message: 8
MyActor received message: 9
MyActor received message: 10
Stream completed
```
Rubyチュートリアル(Trello APIでTODO管理)

#　RubyでTODO管理

Rubyのチュートリアルとしてとだこうきさん（@cohki0305）の動画を参考にTrelloのボードからリストをコマンドライン上に表示させるプログラムを作りました。

動画：https://www.youtube.com/watch?v=4uYX5icZ9ao&index=2&t=8s&list=PLy23K3ncxGkb0eX_1ZWlG7dEP7jG0vysP
引用コード：https://gist.github.com/cohki0305/e54dccf2b925ad7b76e85a9b4044fd9b

##実行環境
ruby 2.6.1p33 (2019-01-30 revision 66950) [x64-mingw32]


##修正箇所
Windowsで作成したため、最初文字コードがUnicodeとなっておりコマンドプロンプト上で日本語を表示できませんでした。
コードの最初に`#! ruby -Ku`を追加しUTF-8に修正しています。

##実行結果
\--------------
【todo】
散歩
ランチ
買い出し
\--------------

##所感
動画でコードを最初から最後まで手を動かして作成できるのは、変なエラーで躓くこともなく成功体験ができ非常に効率よく感じました。
自分でもプログラミング講座を動画で作っていこうと思います。
jpドメインの移管記録（バリュードメイン→ スタードメイン）

執筆現在（2019/02/24）
jpドメインの利用料金を比較してみたら、スタードメインが最安値であった。（2,548/年、更新も同料金）

2019/03/06追記
・バリュードメインは管理画面のUIが💩なのが残念
・細かい質問のためサポセンの方と連絡したが、どちらのサービスでも対応は丁寧で◎だった

※ 下書き中です ※
WindowsからUbuntuをWake On Lanで起動する

#はじめに

自宅でファイルサーバやRedmine用として使用しているUbuntuマシンを、メインのWindowsマシンからLAN経由で起動できるようにしました。

#環境
Ubuntu 16.04
Windows 8.1 Pro

#手順

###NICの設定（Ubuntu）
1.ethtoolを使用してUbuntuの設定を行います。
　まず、下記のコマンドでethtoolをインストールします。

```
　sudo apt-get install ethtool
```

　※私の環境では、最新版がインストール済みでした。
2.NICの設定
　下記のコマンドでネットワークアダプタの名前を調べます。

```
　ifconfig
```

　ここでは仮にeth0とします。

　下記のコマンドでWake On Lanが有効になっているかを確認します。

```
　sudo ethtool eth0
```

　Wake-on : g　となっていれば有効になっています。

###BIOSの設定（Ubuntu）
1.BIOSの設定を確認します。
　私の環境では、再起動⇒F2でBIOSが立ち上がり、PCIEによる電源ONを有効にしました。

###Windows側の対応
1.マジックパケットを送信するツール
下記のツールをダウンロードします。

Wake on LAN for Windows
https://www.vector.co.jp/soft/winnt/net/se500992.html

ホスト名、IPアドレス、MACアドレスなどから対象PCを検索できます。
検索結果はリストに保存されているので、何度もアドレスを打ち込む必要はありません。
起動したいときは、対象PCを選択し、電球マークをダブルクリックするだけです。

#追加（自動ログイン）
私の環境では、PCを起動しただけでログイン前の状態のため、リモートデスクトップ接続できません。
自動ログインという機能があるようだったので、合わせて設定しました。

1.Ubuntuのデスクトップの右上の歯車アイコンからユーザーアカウントを選択します。
2.右上のカギマークをクリックしてロックを外し、自動ログインをオンにします。

#結果
Windowsから無事にUbuntuを起動することができました。
自動ログインもできていたため、[半年以上悩んでいた件](https://qiita.com/kazu3516/items/1cda7591a6f1dad53002)が解決しました。

##その他
自動ログインを設定する途中、コンフィグを触る方法も試したところ、起動しなくなり冷や汗を書きました。
なんとかコンソールログインにたどり着き、追加したコンフィグをviで削除したら直りました。

##参考
Ubuntu側の作業はほぼこちらのサイト通りでした。
http://d.hatena.ne.jp/adragoona/20130924/1380001302

バージョンは異なりますが、参考にさせていただきました。
https://linuxfan.info/ubuntu-1804-auto-login
pythonで骨格推定をするための準備

Mac環境で[tensorflow（tf-openpose）で画像から骨格推定](https://qiita.com/nanako_ut/items/974466acf065b95f984a)の準備をしてみたという記事です。

# swigのインストール
```
$ brew install swig
```
swigのバージョン確認

```
$ swig -version
```

# tf-pose-estimationのソースをクローンする
```
$ git clone https://github.com/ildoonet/tf-pose-estimation.git
```
# Python
## venvで仮想環境を作成
```
$ python3 -m venv testenv
```

## pythonの仮想環境に入る
```
$ source testenv/bin/activate
```

# setuptoolsのアップグレード
tf-pose-estimationのインストールをしようと思ったらsetuptoolsが古いよって怒られたのでアップグレードする。

```
$ pip install setuptools --upgrade
```

# tf-pose-estimationのインストール
```
$ pip install -r requirements.txt
```

# OpenCVのインストール
```
$ pip install opencv-contrib-python
```

# tensorflowのインストール

```
$ pip install tensorflow
```

# pafprocessのビルド

```
$ cd tf_pose/pafprocess/
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
```

# モデルデータのダウンロード
macにはwgetコマンドがないので事前準備としてwgetコマンドのインストールも必要。

```
$ brew install wget
```
モデルデータをダウンロードするシェルを実行する

```
$ cd models/graph/cmu/
$ sh download.sh
```

# 実行
元のディレクトリに戻って実行

```
$ python run.py
```
（備忘録）Facebook Messenger API

# 1. はじめに
2019年2月24日におこなわれた[Facebook Tools Day](https://facebookdevelopercircle.connpass.com/event/119195/)でのMessenger APIハンズオンについて、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. Messenger API 参考サイト

- [クイックスタートチュートリアル](https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start?locale=ja_JP)
- [GitHub messenger_quick_start_bot](https://github.com/f-teruhisa/messenger_quick_start_bot)
- [AWS Cloud9でHeroku CLIを使えるようにする](https://qiita.com/queq1890/items/1def659860416e2d90ff)

# 3. 開発環境
- Node.jsでwebhook（POST）が処理できる実行環境が用意できればどこでもよいかと思います。
- [Facebook Tools Day](https://facebookdevelopercircle.connpass.com/event/119195/)のハンズオンでは、以下の開発環境を用いてサンプルMessenger APIの作成をおこないました。

- 開発環境: AWS Cloud9（Node.js、heroku、git）
- 実行環境: heroku

# 4. おわりに
参考になれば幸いです。

2019/02/24 TAKAHIRO NISHIZONO
Rubyの配列の基礎

#配列要素の追加方法
超基本的なrubyの配列の扱いについて

##要素の変更
```ruby.rb
#[]で配列をつくる
irb(main):047:0> a = [1,2,3]
=> [1, 2, 3]

#添え字を使って追加する
irb(main):048:0> a[3] = 4
=> 4

irb(main):049:0> a
=> [1, 2, 3, 4]

#<<を使うと最後の要素に追加することができる
irb(main):050:0> a << 5
=> [1, 2, 3, 4, 5]
irb(main):051:0>

#元の大きさより大きな添字を入れると、間のよそはnilになる
irb(main):051:0> a[6] = 7
=> 7
irb(main):052:0> a
=> [1, 2, 3, 4, 5, nil, 7]

#要素を入れ替える
irb(main):053:0> a[5] = 6
=> 6
irb(main):054:0> a
=> [1, 2, 3, 4, 5, 6, 7]

#要素を削除する→delete_at
irb(main):055:0> a.delete_at(0)
=> 1
irb(main):056:0> a
=> [2, 3, 4, 5, 6, 7]
```

##配列の要素を削除する
```ruby
#配列の要素を削除する

irb(main):072:0> a = [1,2,3,1,2,3]
=> [1, 2, 3, 1, 2, 3]
irb(main):073:0> a.delete(1)
=> 1
irb(main):074:0> a
=> [2, 3, 2, 3]

#delete_ifメソッド
#delete_ifメソッドは配列の要素を順番に取り出し、その要素をブロックに渡す。
#ブロックの戻り値をチェックし、その戻り値が真であればブロックに渡した要素を配列から削除し、偽であれば配列に残したままにする。
a = [1,2,3,1,2,3]

a.delete_if do |n|
  n.odd?
end

puts a
=> [2, 2]
```

##ブロックを{}で各
```ruby
a = [1,2,3,4]
sum = 0
#do...endの代わりに{}を使う
number.each{|n| sum += n}
sum #=> 10
```


#配列の要素の取得方法
配列[位置,取得する長さ]

```ruby
a = [1,2,3,4,5]
a[1,3] #=>[2,3,4]
```

values_atメソッドを使うと取得したい要素の添字を複数指定ができる。

```ruby
a = [1,2,3,4,5]
a.values_at(0,2,4) #=>[1,3,5]
```

[配列の長さ-1]を指定すると最後の要素を取得


```ruby
a = [1,2,3,4,5]
a[a.size-1] #=>5
```

-1は最後の要素、-2は最後から2番めの要素というふうに指定が可能。

```ruby
a = [1,2,3,4,5]
a[-1] #=>5
a[-2] #=>4
```

lastというメソッドを使うと最後を取得できる。
引数に0以上の数字を入れると最後のn個の要素を取得できる

```ruby
a = [1,2,3,4,5]
a.last #=>5

a.last(2) #=> [4,5]
```

lastの反対にfirstもある。使い方は全く同じ

```ruby
a = [1,2,3,4,5]
a.first #=>1

a.first(2) #=>[1,2]
```

#要素の追加

```ruby
a = []
a.push(1) #=>[1]
a.push(2,3) #=>[1,2,3]
# <<　でも同じ
a << 4
```

#要素の削除

```ruby
a = [1,2,3,4,5]
a.delete(2) #=> [1,3,4,5]
```

#配列の連結

配列を連結したい場合はconcatか + を使う。
2つの違いは元の配列を変更するかどうか(破壊するかどうか)
contatを使うと元の配列(メソッドを呼び出した側の配列)が変更される。

```ruby
a = [1]
b = [2,3]
a.concat(b) #=> [1,2,3]

#aは変更される(破壊的)
#bは変更されない
a #=> [1,2,3]
b #=> [2,3]
```

+を使うと元の配列を変更せずに、新しい配列を作成する。

```ruby
a = [1]
b = [2,3]
a + b #=> [1,2,3]

#もちろんaもbも破壊されない。

```
CpawCTF Q.8 writeup

# file情報
開くアプリがわからないとか行っているので、まずfileコマンド。

```
> file open_me                                                                 
open_me: Composite Document File V2 Document, Little Endian, Os: Windows, Version 10.0, Code page: 932, Author: v, Template: Normal.dotm, Last Saved By: v, Revision Number: 1, Name of Creating Application: Microsoft Office Word, Total Editing Time: 28:00, Create Time/Date: Mon Oct 12 04:27:00 2015, Last Saved Time/Date: Mon Oct 12 04:55:00 2015, Number of Pages: 1, Number of Words: 3, Number of Characters: 23, Security: 0
```
上のように。
途中に、Microsoft Office Wordとかあるので、拡張子を.docxにして、開いたら、画像が出てくる。
ちょっと、読み取りにくい。
画像認識とか使うと、0がoとかに変わっちゃうので、自力で読み取る。
TypeScriptでモジュール参照関係を解決できていない人（自分）のためのメモ

# はじめに

Angularを使い始めて、「TypeScript簡単じゃん。他でも使うべ」と始めたら

```
Cannot find name 'hogehoge'.
```

とか

```
Namespace 'hoge' has no exported member 'fuga'.
```

とエラーが出てつまづきました。
さらに他のプロジェクトを覗いてみたら、`import`無しのtsファイルだったりしてわけわからない。


> 特にモジュールの参照や参照解決辺りで発生するエラーは、基本をしっかり理解できてないとトラブルシューティングするときかなりストレス感じます。
[TypeScriptのモジュール解決のデモ](https://qiita.com/yoshiwatanabe/items/1d03ce4d8fb08f1800bc)

と、まさにストレスを感じているわけでして、そんな人（自分）のためにまとめ直してみる次第です。


# 混乱を招く2種類のモジュール

TypeScriptで「モジュール」と言った時、意味としては2種類あります。

* 内部モジュール = 名前空間
* 外部モジュール = いわゆるモジュール

数多ある解説記事やQ&Aがどちらを話題にしているのか気をつけないと、混乱に拍車がかかります。


# 2種類のモジュールの見分け方

以下のような記述が見えたら、内部モジュールを話題にしていると思ってよいです。

* `module`
* `namespace`
* `/// <reference />`

逆に上記がないときは、だいたい外部モジュールを話題にしていると思ってよいです。


# 混ぜるな危険!? 内部モジュールと外部モジュール

内部モジュールと外部モジュールを組み合わせて使う方法です。

## 内部モジュールから外部モジュールを参照する

残念ながらできません。



```ts:
module X {
  import { Foo } from 'foo'; 
}
```

こんなプログラムを書くと、コンパイルエラーになります。

```
TS1147: Import declarations in a namespace cannot reference a module.
```


## 外部モジュールから内部モジュールを参照する

ファイルの先頭にトリプルスラッシュ`///`コメントを入れます。
`path`に内部モジュールを定義したファイル名を記述します。

```ts:foo.ts
module foo {
  export const X: number = 1234;
}
```

```ts:main.ts
/// <reference path="./foo.ts" />

export class Baz {
  public output() {
    console.log(foo.X);
  }
}
```

`///`はファイルの先頭にないと、ただのコメントになってしまいます。

# 参考リンク

* [次世代JavaScript系言語「TypeScript」の主要言語機能 (2/2)](https://www.atmarkit.co.jp/ait/articles/1302/01/news112_2.html)
* [Typescript and typings: A mystery to solve](http://geekdirt.com/blog/typescript-and-typings/)
* [Candy Cup Analogy](https://stackoverflow.com/a/30357635)
権限継承を切っているファイルをPowerShellで見つける

#背景

SharePoint Online には「リンクの取得」という、ファイルのURLを取得するとそのファイルに固有の権限を付与する（= 親からの権限継承を解除する）少し困った機能があります。

[SharePoint Online リンクの取得機能について](https://blogs.technet.microsoft.com/sharepoint_support/2017/06/26/sharepoint-online-get-a-link/)

# 何が困るのか？

｢リンクの取得｣機能をユーザーが使用する際に、この機能によってファイルの権限継承が切れることをユーザーに伝えるようなメッセージが表示されません。

また SharePoint はファイルサーバーに比べて、ファイル個々のフルパスを取得する方法が分かりづらいです。

そのため、アップロードしたファイルのパスをメールや Microsoft Teams に記載しようとしたユーザーによって

｢お、リンクが取得できる機能があるのか。どれどれポチっと。(*｀･ω･)ゞ ｣

と気軽にこの機能が実行されてしまいます。

  #もちろんこの場合ユーザーは悪くない！

# するとどうなる？

この機能がユーザーによって使われると、サイトの管理者が意図しないところでアイテムレベルでの固有の権限設定が発生してしまいます。

そのため、以下のようなことが起こりえます。

・投稿権限を持つ担当者がファイルをアップロード
↓
・担当者が「リンクの取得」を使ってファイルのURLを取得。このとき、知らずのうちにファイルの編集が可能なURLを生成してしまう。
↓
・メールにこのURLをコピーして配信
↓
・閲覧権限のみ付与されたひとが、メールを受け取ったURLからファイルを開くことでファイルの編集ができてしまう

この機能を知らなかったお客様から｢どのファイルに固有権限が付与されてしまったか一覧で把握したい｣と依頼されることがあります。

#SharePoint には固有の権限が付与されたファイルを一覧表示する機能がない

SharePoint には固有の権限が付与されたファイルを一覧表示する機能がありません。

なのでPowerShell を使って実現します。

SharePoint PnP Cmdlets にある「Measure-PnPList」を使うと、固有の権限が付与されたファイル(正確にはアイテム)を見つけられます。

Measure-PnPList で BrokePermissions パラメータと ItemLevel パラメータを合わせて使用すると以下の情報が返ってきます。

- 固有の権限を持っているフォルダのURL
- 固有の権限を持っているアイテムの親フォルダのURL + アイテムのID

![image.png](https://qiita-image-store.s3.amazonaws.com/0/357828/4c9617e6-5864-462b-cf03-4f40ae494a46.png)

#「Measure-PnPList」の結果をもとに欲しい情報を取得する

上記の通り、「Measure-PnPList」の結果だけでは該当ファイルのURLや実際に付与されている権限がわかりません。なので、以下のようにして該当の ListItem オブジェクトを取得します。

```powershell
foreach($web in $webs)
{
    $lists = Get-PnPList -Web $web -Includes "DefaultNewFormUrl"

    foreach($list in $lists)
    {
        #「固有の権限を持つフォルダ」と「固有の権限を持つアイテム」を取得
        $listItemThatHasUniqueRoleAssignments = @()
        $listItemThatHasUniqueRoleAssignments += Measure-PnPList -Web $web -Identity $list.Id.Guid -BrokenPermissions -ItemLevel

        if($listItemThatHasUniqueRoleAssignments.Count -eq 0){ continue }

        foreach($item in $listItemThatHasUniqueRoleAssignments)
        {
            if($item.Contains(":") -eq $false)
            {
                continue
            } 
            elseif($list.DefaultNewFormUrl.EndsWith("/Forms/Upload.aspx") -or $list.DefaultNewFormUrl.EndsWith("/Forms/UploadEx.aspx"))
            {
　　　　　　　　　$listItemID = $item.Split(":")[1]   
　　　　　　　　　$listItem = Get-PnPListItem -Web $web -List $list.Id -Id $listItemID

　　　　　　　　　## 【欲しい情報をCSVに出力】 ##
            }
        } #foreach($item in $listItemThatHasUniqueRoleAssignments)
    }#foreach($list in $lists)
}#foreach($web in $webs)
```
SSH接続の一定時間切断を解消する

**環境**

- Windows 7
- Git Bash

<font color="gray">※サーバーへのSSH接続に必要な準備・設定等はすでに済んでいるものとみなして話を進めます。</font>

SSH接続してしばらく作業せずにいると、以下の表示とともに接続が切れてしまうことがあります。

```
Connection reset by ~~~~~ port ~~~~~
```

何度も接続し直すのは面倒くさいため、設定ファイルを更新して接続の自動切断を解消しましょう。
その場合はまず「Git Bash」を起動し、以下のコマンドを実行してファイルをエディタで開きます。

注意点として「Git Bash」を開く際は「**C:\Users\[ユーザー名]**」となる位置で開いた上で下記コマンドを実行してください。

```vim:設定ファイルをエディタで開く
vi .ssh/config
```

「vi」はLinuxの標準テキストエディタを起動するコマンドです。
クライアント側の設定ファイルが開かれたら、以下の一行を追記しましょう。

```vim:サーバへの応答確認を15秒ごとに送る設定
ServerAliveInterval 15
```
追記が完了したら「:wq」で上書き保存し、ファイルを閉じましょう。
「:wq」キーは「ファイルを保存しviを終了する」ためのコマンドです。
設定はこれで以上です。

改めてSSH接続し、自動で切断されるか否か確認してみてください。

**以下のサイトを参考にさせていただきました**

- [ssh接続が一定時間で切れてしまうのを防ぐ
(https://qiita.com/nr81/items/0c2a19afbac742eae7a6)]
(https://qiita.com/nr81/items/0c2a19afbac742eae7a6)

- [viコマンドについて詳しくまとめました 【Linuxコマンド集】
(https://eng-entrance.com/linux-command-vi)]
(https://eng-entrance.com/linux-command-vi)
【Python】参照の落とし穴（リスト）

### はじめに

Pythonに限らずかと思いますが、参照には要注意です。
今回はその要注意と言う理由の一例を紹介します。

### 二重配列（リスト）の作り方2パターン

```python
list1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

sub_list = [1, 2, 3]
list2 = [sub_list, sub_list, sub_list]
```

これ、標準出力するとどちらも同じものが表示されます。
でも、一部の要素を更新しようとした際に違いが見えてきます。
例えば、次のコードを実行してみるとしましょう。

```python
list1[1][2] = 5
print(list1)
list2[1][2] = 5
print(list2)
```

実行すると、

```console
[[1, 2, 3], [1, 2, 5], [1, 2, 3]]
[[1, 2, 5], [1, 2, 5], [1, 2, 5]]
```

こうなります。
list2は他の要素まで更新されてます。

### なぜそうなるのか

list2はsub_listという同じリストが3つ並べられたリストだから。
最初にlist2を初期化したときに、sub_listの値がコピーされたのではなく、sub_listの参照がコピーされたため、list2の要素を更新しようとすると大元のsub_listの中身を更新し、その結果、sub_listを何度も参照しているlist2は他の部分まで書き換わるのです。

### まとめ
Pythonのリストは他の変数に代入すると値そのものではなく参照が代入されるので気をつけましょう。ちなみにリストの値そのものを代入したいときはcopy()関数を利用するそうです。

※ @shiracamus さんに指摘いただいたので記事を修正しました。
amazfit bip face作成 その2（月の表示を数字以外で表示する）

[こちらの記事](https://qiita.com/tpusuke/items/de8292c6b3b7408d9dfb)の続きです。

##月を数字以外で表示する例
###月に相当する文字盤のインデックスを白にします。

![analogNday_packed_animated.gif](https://qiita-image-store.s3.amazonaws.com/0/241305/8adfe46f-8056-cf65-9e12-17d868524ff1.gif)

###うまくいかない例
12個イメージを用意して下記の様に設定すると、10月は、12番目のイメージではなく、0と1のイメージが表示されます。
月、日、曜、時、分、秒は10進数固定ということです。曜は7種類なので問題ありません。

```xml
                "Month": {
                    "TopLeftX": -176,
                    "TopLeftY": 0,
                    "BottomRightX": 175,
                    "BottomRightY": 175,
                    "Alignment": "TopLeft",
                    "Spacing": -176,
                    "ImageIndex": 61,
                    "ImagesCount": 12
                }
```

###うまくいく設定方法
画面幅の横長2倍の画像を作成します。
1桁の時は右半分。2桁の時は右半分が10の位、左半分が1の位に表示されるようにXMLを設定します。
<TABLE><TR><TD width=100>0の画像</TD><TD><img src="https://qiita-image-store.s3.amazonaws.com/0/241305/0e3393e4-8da5-a971-a2ec-f289cabe6a30.png"></TD></TR></TABLE>
<TABLE><TR><TD>1の画像</TD><TD><img src="https://qiita-image-store.s3.amazonaws.com/0/241305/c02df2de-15b9-6766-e319-1575f39439b4.png"></TD></TR></TABLE>
<TABLE><TR><TD>2の画像</TD><TD><img src="https://qiita-image-store.s3.amazonaws.com/0/241305/47b238b0-1e53-2a29-1a10-aa6c99941513.png"></TD></TR></TABLE>
</TABLE>

10月は1の画像の右半分（1が白）と0の画像の左半分(1が青で上書き、10が白)
11月は1の画像の右半分（1が白）と1の画像の左半分(1が青で上書き、11が白)
12月は1の画像の右半分（1が白）と2の画像の左半分(1が青で上書き、12小さい白)
文字盤を消さないようにインデックス以外の背景を透明にしてます。
XMLの設定は下記です。

```xml
Month": {
    "TopLeftX": -176,
    "TopLeftY": 0,
    "BottomRightX": 175,
    "BottomRightY": 175,
    "Alignment": "TopLeft",
    "Spacing": -176,
    "ImageIndex": 61,
    "ImagesCount": 10
}
```

すごくトリッキーで、これを最初に考えたついた人はすごいなと思いました。
ちなみにこの方式だと19までしか対応できないので、日、時、分には使えないんです。
Swagger Editor: API開発

#API開発について
APIの開発は多くなってきています。
独自で作成する場合が多いですが、OpenAPI仕様にしたら統一感があり、
自動コード生成などで時間の短縮も可能になります。

#Swagger Editor
Swagger Editor: https://swagger.io/tools/swagger-editor/
Design, describe, and document your API on the first open source editor fully dedicated to OpenAPI-based APIs. The Swagger Editor is great for quickly getting started with the OpenAPI (formerly known as the Swagger Specification) specification, with support for Swagger 2.0 and OpenAPI 3.0. 

#Swagger Editorイメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/56cfb517-cff1-a49e-f16b-286118522d68.png)

#サーバサイドコード生成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/7f098424-687e-7fa9-2652-355990a90306.png)

#クライアントサイドコード生成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/c67bbcfb-e522-2a65-54b4-8c2285f27190.png)

以上
GASでbluma使ったらresponsiveにするのに一手間必要だった

# 経緯
サーバーサイドエンジニアが**cssとかよく分からないから簡単なのがいいな**と思いながら見つけたBlumaをgasにサクッと適用しようとしたらハマったのでめも。

## Bluma
とにかくシンプルに、cssだけで書かれているので、Reactでもvueでも壁なく導入できるよっていうcssフレームワークらしい。
> https://bulma.io/

### 導入してみる
#### インストール
こちらのページを見ながらインストールした。いくつか方法があるみたいだけど、gasなのでCDNから直接参照する事にした。
> https://bulma.io/documentation/overview/start/

#### 必須コードの追記
##### HTML5ですよ
```html
<!DOCTYPE html>
```

##### metaタグにviewportを追記
```html
<meta name="viewport" content="width=device-width, initial-scale=1">
```

##### その他は公式のサンプルコードを真似て書いておく
> https://bulma.io/documentation/overview/start/


### ここでハマった
ローカルでは動くのに、gasにあげると動かないという謎の現象にハマった。どうやらviewportが効いていないようで、`gas viewport`で検索したら次の記事を見つけた。

> GASでオンライン人狼的な何かを作る #2
> https://qiita.com/TakumaKawashiro/items/2b8a56d6f09da76ed8d5

あなたが神か！って事で、サクッと自分のコードに次の通り設定して、responsive対応完了。

```javascript
// GAS　HTML表示
function doGet() {
    return HtmlService.createTemplateFromFile("index").evaluate().addMetaTag('viewport', 'width=device-width, initial-scale=1');
}
```
awesome_nested_setを使った入れ子構造のDB設計

## 入れ子集合モデルとは

入れ子集合モデルとは、主にデータベースにカテゴリーなどの親、子、孫が入れ子のように紐ついているときによく使用する保存方法。
例:カテゴリーの情報をアプリケーション上で扱いたいとき。
メンズカテゴリー(親)の中にトップス(子)と時計(子)が入っており、トップスの中にテーラード(孫)が入っている。

## 図解してみた
先ほどの例を図解してみる。

[![Image from Gyazo](https://i.gyazo.com/ae3e79807803262aebb3b8fb8303a870.png)](https://gyazo.com/ae3e79807803262aebb3b8fb8303a870)

## どのようにしてデータベース上で扱うのか
この表をデータベース上で表現するには、右辺と左辺の番号を利用する。
先ほどの図に番号が示してある。
この番号を使用して、どこからどこのカテゴリーかを明示してあげることでデータベース上の扱いを可能にする。

入れ子集合モデルでは、「lft」「rgt」カラムに左辺と右辺の番号を保存する。
図でいうと

- メンズは「lft」→１、「rgt」→9
- トップスは「lft」→2、「rgt」→6
- テーラードは「lft」→3、「rgt」→5
でカラムに入れることができる。

メソッドについてはgithub参考。

## 使用手順
今回はgithubに書いてある通り、categoryモデルを作り、ミニアプリを作ってみた。

```ruby:マイグレーションID_create_categories.rb
class CreateCategories < ActiveRecord::Migration[5.2]
  def self.up
    create_table :categories do |t|
      t.string :name
      t.integer :parent_id, :null => true, :index => true
      t.integer :lft, :null => false, :index => true
      t.integer :rgt, :null => false, :index => true

      t.integer :depth, :null => false, :default => 0
      t.integer :children_count, :null => false, :default => 0
      t.timestamps
    end
  end

  def self.down
    drop_table :categories
  end
end

```

【必須のカラム】
- parent_id
    - これは子ノードがどの親なのかを示すid。一番大きい親の場合にはNULLになる。
- lft
    - 名前通り、カテゴリーの左側の数値を入れる。
- rgt
    - こちらも名前通り、カテゴリーの右側の数値を入れる。

【オプションカラム】
- depth
- children_count

model

```ruby:category.rb
class Category < ApplicationRecord
  acts_as_nested_set
end

```



・参考記事
Railsでawesome_nested_setを使って階層構造を作成する
https://ruby-rails.hatenadiary.com/entry/20150216/1424092796
mapアプリ（Swift4.2.1）



map アプリを作ってみました。

Googleマップと同じくテキストボックスに入力した位置がマップに表示されます。

下の画像が起動後の画面です。

<img width="353" alt="スクリーンショット 2019-02-24 19.25.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/9b6f79b7-676a-f497-61b0-1f47b2e6c928.png">

”東京”と入力してみます。

<img width="353" alt="スクリーンショット 2019-02-24 19.27.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/98572b6f-c931-8e61-4936-54cd214ae71c.png">

こんな感じです。

また、右下のボタンで航空写真にも切り替えることができます。

<img width="353" alt="スクリーンショット 2019-02-24 19.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/c00153ae-f668-5dfc-7ec4-bcc13fc3f0a4.png">

切替後の画面です。

以下にコードを記述します。


```

import UIKit
import MapKit

class ViewController: UIViewController ,UITextFieldDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        nyuryoku.delegate=self
    }
    @IBOutlet weak var nyuryoku: UITextField!
    
    @IBOutlet weak var map: MKMapView!
    
    func  textFieldShouldReturn(_ textField: UITextField) -> Bool{
        textField.resignFirstResponder()
        
        if let searchkey=nyuryoku.text{
            print(searchkey)
        
        
        
        let  geocoder = CLGeocoder()
        
            geocoder.geocodeAddressString(searchkey, completionHandler:{ (placemarks,error)in
                if let unwrapplacemarks=placemarks{
                    if let firstplacemark=unwrapplacemarks.first{
                        if let location = firstplacemark.location{
                            let targetcoordinate=location.coordinate
                            print(targetcoordinate)
                            
                            let pin=MKPointAnnotation()
                            pin.coordinate=targetcoordinate
                            pin.title=searchkey
                            self.map.addAnnotation(pin)
                            self.map.region=MKCoordinateRegion(center: targetcoordinate, latitudinalMeters:500.0,longitudinalMeters:500.0)
                        
                    
                        }
                    }
                }
    })
}
return true
}
    @IBAction func change(_ sender: Any) {
        if map.mapType == .standard{
            map.mapType = .satellite
        }else if map.mapType == .satellite{
            map.mapType = .hybrid
        }else if map.mapType == .hybrid{
            map.mapType = .satelliteFlyover
        }else if map.mapType == .hybridFlyover{
            map.mapType = .mutedStandard
        }else{
            map.mapType = .standard
        }
    }
}

```

以上になります。ありがとうございました。
aikoの曲名を2つ並べると、さらに味わい深いタイトルになるのではないか？（IBM CloudのCloudantにデータを保存して読み出す）

# 発端

aikoさんの曲名は、カブトムシとかアンドロメダとか目を惹くタイトルが多いので、2つ並べたらより魅力的になるのではないか？

# Cloudant
IBM Cloudが提供するNoSQLデータベースで、CouchDBなどと互換性がある。
無料のLiteプランで1GBまで保存できるので、テキストデータなどを保存する用途だと持て余すくらい多い。
30日何もしなければ消えるようです。

<img width="1129" alt="スクリーンショット 2019-02-24 18.39.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/360858/736dc72a-a480-e277-fdb9-eab63ba01c00.png">

IBM CloudのダッシュボードからCloudantのサービスを作成し、Cloudantのページに行く。
そしてDBを作成。
今回は、歌手aikoの曲名を保存することにしたので、aiko_songsというDBを作った。

<img width="1451" alt="スクリーンショット 2019-02-24 18.50.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/360858/3c0626d2-35e3-2e0c-9b0e-817d6a938d27.png">

## サンプルデータ

[こちら](https://raw.githubusercontent.com/zyamoji/add_data_cloudant/master/aiko.csv)のような曲名を列挙したcsvを用意する。

csvファイルにはヘッダは無い

| 番号      |   曲名      |
|-----------|------------|
| 1         |  あした     |
| 2         |  ナキ・ムシ  |
| 3         |  花火       |
| …         |  …       |

## プログラム

今回は[Rubyで書いた](https://github.com/zyamoji/add_data_cloudant/blob/master/aiko.rb)。

```ruby:aiko.rb
# cloudantの設定
cloudant_url =  "cloudant_address"
uri = URI.parse(cloudant_url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
```

`coudant_url` には、cloudantのURLを指定する。
`https://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-bluemix.cloudant.com/aiko_songs/`
こういう形式で、末尾にDB名を追加する。

```ruby:aiko.rb
req = Net::HTTP::Post.new(uri.request_uri)
req['Content-Type'] = "application/json"

# CSVの1行ごとに登録
csv_data.each do |data|
  payload = {
    "_id" => data[0],
    "song_name" =>  data[1]
  }.to_json
  req.body = payload
  res = https.request(req)
```

jsonを作って、postすれば登録できる。

ただ、先にCloudant側でPermissionを設定しないといけない。
上記URLはUUIDということもあり、流石に推測できないので、テスト用途ならすべてONにしても大きな問題にはならないと思う。
（テスト終了後にちゃんとOFFにすること）

<img width="1599" alt="スクリーンショット 2019-02-24 19.14.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/360858/df360d63-58fa-264f-5c22-774f705ed20e.png">

rubyファイルを実行すれば、Cloudantに登録される。

<img width="873" alt="スクリーンショット 2019-02-24 19.17.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/360858/13de644c-1340-af47-7b47-7848335b26fe.png">

これを、同じくIBM Cloud上のNode-REDから呼び出したものが[こちら](https://syamoji-mqtt-broker.mybluemix.net/aiko)

JavaScriptから呼び出すときは、jQueryを使うなら以下のような感じで、セレクタを書いて取得する。
以下の例では、単にランダムに取得しているだけ。

```js
$.post("/getAikoSong", 
  { "selector":  
    {"_id": 
      {"$eq": randomNum } // 乱数のIDの曲名を取ってくる。
    }
  }, function(data) {
    // 取得した曲名を表示
    mesDiv.innerHTML = data["docs"][0]["song_name"]
});
```

## 動作サンプル

[こちら](https://syamoji-mqtt-broker.mybluemix.net/aiko)

----

![Feb-24-2019 19-26-13.gif](https://qiita-image-store.s3.amazonaws.com/0/360858/f193cd1f-20fe-ebe2-fafc-4f541c552cf9.gif)


aikoさんが悪いんじゃなくて、私が悪かったです。
済みません。

### リポジトリ

[github](https://github.com/zyamoji/add_data_cloudant)
Stream  API  mapメソッド

#まとめ
mapは自身のstreamオブジェクトに格納された全ての要素を変換する
mapメソッドは2つの型変数を利用する
Streamインターフェースは`Stream<T>`を受け取り、mapメソッドは`Stream<R>`を返す。

#mapメソッド シグニチャー

```java
public interface Stream<T> ...
     <R> Stream<R> map(Function<? super T,? extends R> mapper)
```

###1行目
Streamインターフェースの宣言をしている。
ここでは、型変数のTを指定して、総称型のインターフェースにしている。
つまり任意の型を扱うことができる。

###2行目
mapメソッドのシグニチャーを定義している。

`<R>` 
-> 型変数の宣言
-> mapメソッドではTとRという2つの型変数を利用できるようにしている。

`Stream<R>` 
-> mapメソッドの戻り値の宣言
-> mapメソッドの戻り値はStream<R>型

**mapメソッドはStream\<T\>インターフェースに定義されているので、このメソッドは`Stream<T>`を`Stream<R>`に変換する役割を持つことになる。**

`map` 
-> メソッド名

`Function<? super T, ? extends R>`
-> 引数の型
-> FunctionはJava8から導入された関数型インターフェース
-> Functionインターフェースは、T型のオブジェクトを受け取り、R型のオブジェクトを返す
-> `? super`および`? extends`は境界ワイルドカードと呼ぶ記法
-> これで、mapメソッドに渡せる関数の範囲を広くしている。

`mapper` 
-> 仮引数名

#例
```java:sample.java
public List<String> collectEmpNames(List<Employee> employees) {
    return employees.stream()
                  .map(e -> e.getName())
                  .collect(Collectors.toList());
  }
```

###1行目
stream()メソッドを呼び出して、EmployeeのListをStreamに変換している。

###2行目
mapメソッドを呼び出している。
EmployeeのStream内の各要素から名前を取り出して、文字列のStreamに変換する。

`e -> e.getName()`
mapメソッドはFunction型の関数オブジェクトを引数にとる。
上記のラムダ式はFunctionインターフェースを実装したオブジェクトになる。

具体的にいうと...
mapメソッドが呼ばれた時点でStreamに格納されているのはEmployee。
つまり、型TはEmployee。
そのため式の右辺でEmployeeクラスのgetName()を呼び出すことができる。
getName()の戻り値はStringのため、mapメソッドの戻り値はStream\<String\>になる。

###3行目
collectメソッドを呼び出して、StreamをListに変換している。
解凍・圧縮ツールはどれが使いやすいですか

解凍、圧縮ツールは、普段の仕事では不可欠となってきています。

#解凍・圧縮ツール
窓の杜様のサイトのイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/47ec35b2-65b5-b78c-e192-cb26f6491ece.png)

#どういう問題があるか
数種類を使ったことがありますが、下記の２つ問題がありました。
問題１：あるツールは直接差し替えはできない。
　※解凍⇒差し替え⇒圧縮の手順になります。
　※WARなどのJSPを差し替えたい場合は時間かかります。

問題２：あるツールは深い階層のフォルダーがあると、エラーになる。
　※気付かずに加工したZIPファイルをお客様に送ってしまうと大変です。

#どれが使いやすいか
いままで、個人利用した経験によると、7-zipは上記の２問題とも問題ありませんでした。
完璧です。作者達に感謝します。

差し替えは、ZIPを開いて、フォルダーを探して、差し替えたいファイルをDrag&Dropに完成です。
とても便利で楽です。

7-zip: https://www.7-zip.org/

以上
情報処理安全確保支援士 平成29年度春 午後1 問2

**筆者はHTMLに関する知識がほとんどないため、設問2(4),設問3(1),(3)の開設は省略させてください**

#設問1
**L氏に確認した内容：L氏が今日ログインしたと言っている回数**
**ログイン記録：L氏の利用者IDを用いた今日のログイン回数**
不正ログインがあった場合、意図しないログイン結果が残る。
L氏がログインしたと言っている回数(時刻)と実際のログイン履歴を確認すれば不正ログインがあったかどうか判断できる。

自分は「ログイン回数」ではなく「ログイン日時」と回答したが、これで正解はもらえないのだろうか。

#設問2
**(1) a:クロスサイトリクエストフォージュリ**
表1の注記3に「taikai_tokenの値が0になることはない」と記載あるが、表2の「3」ではtaikai_tokenが指定されていないにも関わらず、退会完了のステータスになっている。ここに脆弱性がある。
L氏の発言で、ログイン後、サイトa内の掲示板に投稿していた人のプロフィール画面を見て、記載されたリンクをクリックしたとある。
このリンクに不正なスクリプト等が仕込まれており、表2の「3」の脆弱性を利用し退会処理が行われたと考えられる。
このような、ログイン済みのサイトで不正なリンク等をクリックさせユーザの意図しない処理を行う攻撃を**「クロスサイトリクエストフォージュリ(CSRF)」**と言う

**(2) b:3**
設問2(1)で説明した通り、表2の「3」には脆弱性がある。

**(3) c:現在のパスワード d:知り得ない**
Xさんはパスワード変更画面にCSRFの脆弱性がないか心配していますが、パスワード変更画面は「現在のパスワード」と「新しいパスワード」を入力する仕様になっている。
CSRFの特徴は「ログイン済み」での攻撃であるため、攻撃者は**「現在のパスワード(c)」**は**「知り得ない(d)」**情報である。

**(4) e:confirm f:submit**
解説無し

#設問3
**(1) カ、キ**
解説無し

**(2) g:セッションハイジャック**
Cookieの情報(セッションID)を盗み見て、その情報からgの攻撃を行い、プロフィール操作を行っている。
セッションIDを盗むことができれば、正規のユーザであるかのようにふるまえる。

**(3) h:タグの中で利用できる属性を制限する**
解説無し
Bootstrapで、必須入力のバッチ(ラベル)を出す

# ソースと実行結果

ヘッダーで、以下verのbootstrapを読み込み。

```html:sample
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap-theme.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
```
<br>
入力部分は以下の通り。

```html:sample
<label for="name">お名前 <span class="badge badge-danger">必須</span></label>
```

実行結果。
![必須バッチ.PNG](https://qiita-image-store.s3.amazonaws.com/0/303076/11364b3c-8dcb-6075-4687-aeb2c60804a6.png)



# 経緯
書籍でCSS/Bootstrapの勉強をしていたところ、赤い「必須」がうまく表示されず、ググってみても同じ書き方しか見つからなくて困っていました。
公式のドキュメントを調べたところ、結論としてはBootstrapのver違いでした。

書籍ではBootstrapのverが3.3.7で
"badge badge-danger"のところが"label label-danger"になっていたのですが、どうもBootstrap4.0へのレベルアップ時に、label→badgeへと定義名がRenameされたようです。

labelからbadgeへの変更
[https://getbootstrap.com/docs/4.0/migration/#labels-and-badges](https://getbootstrap.com/docs/4.0/migration/#labels-and-badges)

badgeの仕様
[https://getbootstrap.com/docs/4.0/components/badge/](https://getbootstrap.com/docs/4.0/components/badge/)
form_forにクラス名を持たせる　

form_forについて復習

form_forは特定のモデルに基づいたformを作る時に使う

・form_forにクラスを持たせる書き方

![form_for 型.png](https://qiita-image-store.s3.amazonaws.com/0/333735/3905de99-080f-503c-0b64-1038011663ef.png)

これで自分の場合はform class= form-contentとなった
ChromeのQRコードプラグインの活用

Web開発にてよくあるテストは、PCで確認したら、いろんなスマホで確認するとなります。
スマホにてPCで表示したURLを手入力する方は多いと思います。
手入力では間違いやすいし、お時間もかかります。

簡単な方法がないかという問題ですが、もちろんいろいろのやり方があります。
下記は、Chromeのプラグインをご紹介します。

#「The QR Code Extension」プラグインのインストール
１、Chromeのアドレス欄に「https://chrome.google.com/webstore/category/extensions?hl=ja」を入力
２、検索欄に「The QR Code Extension」で検索
複数のものがありますが、今回は一番上のものを利用。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/c46a9a57-0f0c-8b26-bb50-f82e8a7a5831.png)

３、「Chromeに追加」を押す

#使い方
１、PCでテストしたいページにアクセスする
２、Chromeの右上のQRコードアイコンをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/64f6c70c-4bdb-9609-31f0-201812ab40fb.png)
３、スマホのQRリーダアプリで読んだらミスなく、そのページに遷移できる

以上
最近の技術（主にフロント）について軽く調べておいた

<h2><a href="https://graphql.org/" target="_blank">GraphQL</a></h2>
<div>2012年にFacebookによって内部開発され、2015年に公開されたオープンソースのクエリ操作言語。クライアントとサーバー間でのデータのやりとりにおいて用いられる。特徴は、必要なデータ構造をクライアントが定義することで、まったく同じデータ構造をサーバーが返してくるため、過度に大量のデータが返されることを防ぐ。またRESTAPIに比べ、単一のリクエストで取得するため、高速である。</div>

<h2><a href="https://nextjs.org/" target="_blank">next.js</a></h2>
<div>SSR(Server Side Rendering)をするアプリケーションのためのJavaScriptフレームワーク。
<img src="https://student-engineer.net/wp-content/uploads/2018/04/CSR.png" />
CSR(Client Side Rendering)は、サーバーにリクエストを送り、返ってくる、それからレンダリングを始めるという流れとなる。
<img src="https://student-engineer.net/wp-content/uploads/2018/04/SSR.png" />
一方SSRは、サーバーサイドでレンダリングを行い、生成されたHTMLをブラウザに渡すため、CSRに比べて高速である。
<p>(参照： <a href="https://medium.com/walmartlabs/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8" target="_blank">Walart Labs</a>)</p></div>

<h2><a href="https://ja.nuxtjs.org/" target="_blank">nuxt.js</a></h2>
<div>こちらはnuxt.js（ナクストジェーエス）。Vue.jsのSSRをするためのオープンソースフレームワーク。</div>

<h2><a href="https://storybook.js.org/" target="_blank">Storybook</a></h2>
<div>SPAで用いられるコンポーネントのUI管理ツール</div>

<h2><a href="https://prettier.io/" target="_blank">Prettier</a></h2>
<div>Prettier（プリティア）はコードフォーマッター（ソースコードを整形してくれるツール）。共同開発における環境のdiffを吸収して整地してくれる。</div>

<h2><a href="https://developers.google.com/web/fundamentals/primers/service-workers/?hl=ja" target="_blank">Service Worker</a></h2>
<div>1度のキャッシュを用いてオフラインにおいてもネイティブアプリケーションのような動作を提供する機能。AppCacheの進化版。</div>

<h2><a href="https://expressjs.com/" target="_blank">Express</a></h2>
<div>Node.jsのWebアプリケーションフレームワーク。Node.jsの開発をより簡易的に行えるようにするもの。</div>

<h2><a href="https://developer.mozilla.org/ja/docs/WebAssembly" target="_blank">WebAssembly</a></h2>
<div>C/C++などをコンパイル対象とし、web上で実行することが可能なアセンブリ（機械語）の言語。javaScript と並行して動作するように設計されている。</div>
Javaでアノテーションを作ってみた。

## はじめに
業務をしていて、アノテーションについて理解できていないことに気が付きました。
@Override, @Duplicate, @Test とか付与するのはわかるんですが、仕組みがわかっていないので調べてみました。

### 環境
- OS Windows10
- Java 11.0.1
- Pleiades All in One Eclipse (2018-12)


### Javaにおけるアノテーションとは
以下はwikipediaより。
>Javaのアノテーションはクラスやメソッド、パッケージに対してメタデータとして付加情報を記入する機能で、Java SE 5 で追加された。 アノテーションはjava.lang.annotation.Annotationインタフェースを実装することで自作することもできる。

### Javaにおけるアノテーションの種類
アノテーションの種類は、以下の3つに分類されます。

- マーカー・アノテーション – データが無く名前だけを持つアノテーション。  
例:@Override, @Duplicate  
- 単一値アノテーション – データを一つだけ持つアノテーション。見かけはメソッド呼び出しに似ている。
例:@SuppressWarnings 
- フル・アノテーション – 複数のデータを持つアノテーション。


## 習うより慣れろで作ります

### アノテーションクラスを作成します
```Info.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Info {
	String value();
}
```
アノテーションクラスを定義するには以下のアノテーションを付与します。 

- @Retention
アノテーションの読み込みタイミングを指定できます。  
`java.lang.annotation.RetentionPolicy`から選択します。

`CLASS` : コンパイル時にクラスファイルに記録される。実行時にVMに読み込まれない。
`RUNTIME` : 実行時にVMに読み込まれる
`SOURCE` : コンパイル時に破棄

- @Target
注釈型が適用可能なプログラム要素の種類を示します。  
`java.lang.annotation.ElementType` から選択します。

`ANNOTATION_TYPE` : アノテーションに適用可
`CONSTRUCTOR` : コンストラクタに適用可
`FIELD` : フィールドに適用可
`LOCAL_VARIABLE` : ローカルに適用可
`METHOD` : メソッドに適用可
`PACKAGE` : パッケージに適用可
`PARAMETER` : 引数に適用可

今回は、メソッド実行時にアノテーションの値を取得する処理を作成したいので、
@Retentionを`RUNTIME`、@Targetを`METHOD` に指定します。

### アノテーション付与クラスと呼び出しクラスを作成します

呼び出すクラスになります。
作成したInfoアノテーションをメソッドに付与します。  

```AnnotationInstance.java
public class AnnotationInstance {
	@Info("hoge")
	public void execute() {
		System.out.println("Hello World!!");
	}
}
```

`@Info("hoge")`
@Infoアノテーションに値を設定しています。
valueにhogeが設定されます。

呼び出す側のメインクラスになります。

```AnnotationMain.java
import java.lang.reflect.Method;

public class AnnotationMain {

	public static void main(String[] args) {
		try {
			Class<?> clazz = Class.forName("AnnotationInstance");
			Method method1 = clazz.getMethod("execute", new Class<?>[] {});
			Info info1 = method1.getAnnotation(Info.class);
			System.out.println(info1.value());
		} catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
		}
	}
}
```

リフレクションでメソッドを取得し、その先でアノテーションクラスを取得します。

### 実行してみます
上記で作成した `AnnotationMain.java` クラスを実行すると以下の結果が出力されます。


##### 実行結果

```
hoge
```

`AnnotationInstance` の`execute()`メソッドに指定された@Infoアノテーションの値が取得されていることが確認できました。

## さいごに

使ってみると意外と簡単にできました。
この記事を書く過程で、アノテーションクラスの実装を改めていくつか見ることになりました。
普段あまり触れるものではないですが、フレームワークやパッケージ開発なので使われてるんでしょうね。
今まで読めていなかったので、今後は苦手意識を持たずに読んでいこうと思います。
リフレクションも久しぶりに触りました。そちらもあまり理解できていないので、またじっくり調べてみようと思います。

## 参考にしたサイト
アノテーション - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3#Java%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
ちょっと特殊なJavaのアノテーション - Qiita
https://qiita.com/kashira2339/items/6450714e42c37b441514
独自のアノテーションを作成して値を取得するサンプル | ITSakura
https://itsakura.com/java-annotation-make
プログラミング学習記録8〜関数の便利さにようやく気づけた（気がする）〜

##今日やったこと
- Progate Command Line リセット復習
- Progate JavaScript1~3 リセット復習
- Progate Git １周

ProgateのJavaScriptのリセット復習は、今日で終わりにします。

Rubyのレッスンをしっかりやっておけば、3周くらいで十分ですね。

##for文・while文とアロー関数
for文はwhile文とできることが同じだが、for文の方がシンプルに書けることを知り、自分で書くときはfor文で書こうと思いました。

あと、関数の書き方で通常バージョンとアロー関数バージョンの２種類を学んだのですが、アロー関数の方が見た目がシンプルでいいですね。

「アロー」とは、英語で書くとarrow、矢という意味らしいです。

見た感じ弓矢に見えるので、覚えやすくでいいですね。

```javascript
()=>
```

##JavaScript3の最後だけちょっと難しかった(Progate)

Rubyをしっかりやっていたので、基本的にJavaScriptは3まで簡単に感じたのですが、3の演習２だけ難しく感じました。

ただ、英語の構文解釈のように一つずつ順番に読んでいったら理解ました。

具体的な内容はProgateの有料コンテンツのため、詳しくは書けないのですが、**「関数を使って、アメリカドルから日本円への換算システムを作りましょう。」**というものです。

１回関数を作ってしまえば

```javascript
関数名(商品名、価格(ドル));
```
という１行でドル→円の換算ができるもの

最初関数を作るのはちょっと面倒なのですが、後でいちいちかけ算をしなくてもいいので、作ってしまえばあとは楽です。

関数の便利さを身をもって実感できた回でした。

Gitは今日初めて手をつけて、まださらっと１周しかしてないので、理解が浅いです。

なので、引き続き明日からもプログラミング学習を頑張り、Gitを理解していきたいと思います。

おわり
Python機械学習プログラミング 2.4 ADALINE 2.5勾配降下法

この記事は過去の学習の際に書き残された備忘録です。

# 2.4 <br>ADALINEと学習の収束

続いてもう一つの単層ニューラルネットワークに**ADALINE**がある

## ADALINEとパーセプトロンの違い

|ADALINE|パーセプトロン|
|:--------------|:----------------|
|線形活性化関数で重み更新|ステップ関数で重み更新|
|真のクラスラベルと線形活性化関数の連続地の比較|真のクラスラベルと予測されてクラスラベルから比較|

線形活性化関数によって得られた連続的な値で重みを再計算する<br>
(大誤算だったら大きく重みを更新するとかそういう感じかな)
## ADALINEの特性
連続値のコスト関数(?)の定義とその最小化(多分誤差を０に近づける意?)に関する重要な概念(?)を具体的(?)に示す

# 2.5<br>勾配降下法によるコスト関数の最小化

## コスト関数とは

わからない

## 目標

目的関数の中にコスト関数というものがある。それを最小化したものがモデルとなる
コスト関数$J(w)$は

$
J(w)=\frac {1}{2} \sum_i(y^i-\phi(z^i))^2 
$

と定義される。真値と活性化関数によりはじき出された結果の差(誤差)を二乗した和である。
この値を小さくすればそれはつまり真値に近いということになる(線形回帰のイメージでいいのかな)
## 重みの更新

w += dwの要領で

$
w := w + \Delta w
$

$\nabla J(w)$はコスト関数$J(w)$の偏導関数(勾配)。
$\eta$は学習率。コスト関数は凸のグラフなので最小値から離れているほど勾配が大きいという特徴がある。それを利用している。
この関数の極小値を求めるために勾配を下り、勾配が0である底を求めることから**勾配降下法**という名前がついている。

$
\Delta w = -\eta \nabla J(w)
$

偏微分の説明と計算は省略。勾配の計算にはそれぞれの重み$w_j$に対してコスト関数の偏微分係数を計算しないといけない。導関数$\Delta w_j$は次のようになる。偏微分はやったことないのでわからない

$
\Delta w_j = -\eta \frac {\delta J}{\delta w_j}  = \sum_{i} (y^i - \phi(z^i))x_j^i
$

今までのパーセプトロンと異なり、サンプルごとに小刻みに重みを変更しているのではなく、トレーニングデータセットのすべてのサンプルに基づいて計算されている。

## 感想
ちょっとわかった
最小二乗法とつながる気がするが、勾配降下法の使い所がわからないのでまだなんとも言えない
Articulateでビジネスチャットボットをつくる

チャットボットをはじめとした会話型サービスの開発に関心がある方向けに、この分野のオープンソースをざっくりレビューしていきます。

今回は Articulate https://github.com/samtecspg/articulate です。

## Articulateとは

<a href="https://github.com/samtecspg/articulate">Articulate</a>は、自然言語理解エンジン <a href="https://github.com/RasaHQ/rasa_nlu">Rasa NLU</a> をベースにした「ビジネスチャットボットCMS」とでもいえるアプリケーションです。Apacheライセンスで、Smart Platform Groupが開発しています。

![Articulate 2019-02-24 19-13-07.png](https://qiita-image-store.s3.amazonaws.com/0/356716/dd1d2098-10dd-c8c4-132f-2d635c9d1afa.png)

<a href="https://github.com/RasaHQ/rasa_nlu">Rasa NLU</a>は、Rasa Technologiesが開発するオープンソースの<a href="https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E7%90%86%E8%A7%A3">NLU</a>です。オープンソースのNLUではデファクトスタンダードのようなポジションで、Rasa NLUを使ったOSSが数多くあります。

ただし、Rasa NLUは残念ながら **日本語に未対応** です。（取り組んでみている人もいるようですが精度は不明）そのため、Articulateに日本語のトレーニングデータを登録しても、日本語を理解するボットを作ることは（現時点では）できません。

## Articulateの特徴

### チャットボットを構成するためのCMS＆コンパネ

一般的に、チャットボットは様々なソフトウェアコンポーネントで構成されていますが、大きく分けて「表側」と「裏側」があります。

表側は、チャットユーザーに直接対応するアプリケーションです。質問や要求に答えたり、プロアクティブにメッセージを送ったりします。このとき「チャットユーザーの発言の意味」を理解するという過程でNLUを利用します。（NLUがチャットボットそのものであるかのように語られることもありますが、ソフトウェア全体としては部品の１つにすぎないのですよね）

裏側は、表側のアプリケーションのためのいわゆる「管理画面」です。チャットボットが回答に使用するコンテンツの登録、どのように回答するかのロジックやフローの登録、そしてNLUを訓練するためのトレーニングデータの登録などができます。

**Articulateは、この「裏側」にフォーカスしたアプリケーションです。**

オープンソースのチャットボットフレームワークやアプリケーションには、「表側」にフォーカスしたものが比較的多くあります。もちろん「裏側」が全くないチャットボットは成立しないので、いずれも多少なりとも機能をもってはいるのですが、裏側に「フォーカス」して作られているところが特徴的です。

### エンタープライズで「運用される」ことが考えられた設計

Articulateは、エンタープライズでのチャットボット利用を意識して設計されているように見えます。設計者に知見があるのでしょう。

チャットボットは、実際に企業で利用すると「運用」が重要であることが分かります。構築段階から運用期間を通して、QA集め、コンテンツのチャット最適化、トレーニングデータ作成、チューニングなどの業務を繰り返し行うことになります。もちろん、自動化の余地は多いにあるものの、チャットボットの管理画面は半分「業務システム」みたいなところがあります。

オープンソースのプロダクトではこの「運用」というものが軽視されがちというか、エンジニアが作る前提であることが多いのですが、**Articulateは、これをエンジニアでない人が継続的に行うために使うアプリケーションとして、概念や画面が整理されています。**

同じポジションのソフトウェアにRasa Coreがありますが、Rasa Coreよりも「ease of useを維持する方針」だそうです。(<a href="https://github.com/samtecspg/articulate/issues/183#issuecomment-385253261">コメント</a>)

## 開発者向けアクションアイデア

エンジニアの方向けに、このOSSの活用アイデアや、コントリビュートしたいことについてのアイデアも残します。

* 日本語対応（表側）
    * 前述したように、Rasa NLU（および<a href="https://github.com/facebook/duckling">Duckling</a>）を前提としたソフトウェアなので、Rasa NLUで日本語を扱えるようにするようにしないと始まりません。
    * Articulateにおけるコンテンツやトレーニングデータで日本語テキストを扱うことは可能なので、Rasa NLUにコミットするか、あるいはオルタナティブを作るか。
* 日本語対応（裏側）
    * せっかく非エンジニア向けに設計された管理画面でも、日本人が運用できるようにするには、管理画面の文言も日本語にしないと厳しいですよね。
    * 管理画面の多国語化はサポートされていて、現時点で英語とスペイン語に対応しています。なので、日本語の言語リソースファイルさえあればできるのではと思います。（まず表側が対応しないと意味ないですが）

企業が開発しているということもありますが、質のよいOSSだと思うので、ぜひ試してみてください。UIはNode.jsで動くReactアプリケーションです。

## We're hiring!
AIチャットボットを開発しています。
ご興味ある方は[採用ページ](https://www.relia-digital.com/careers/)からお気軽にご連絡ください！
Laravelで保存済みのチェックボックスをViewに反映させる

CategoryとCompanyが多対多の関係です。
ピボットテーブルはCategoryCompanyです。
一度保存したCompanyのCategory情報が編集の際にチェックボックスへ反映させる方法が見つからなかったため、自分なりにやってみた方法です。

要はCategory一覧と保存済みのCategoryをチェックする形です。

## コントローラー
```php:CompaniesController
//保存画面
public function edit($id)
{
	//companyに関連したcategoriesを取得
	$company = Company::with('categories')->findOrFail($id);
	//カテゴリー一覧を取得
	$categories= Category::all();
	//dd($company->categories);
	return view('companies.edit', compact('company','categories'));
}

//保存処理
public function update(Request $request, $id)
{
	
    $requestData = $request->all();
    $category_id = $requestData['category_id'];
    $company = Company::findOrFail($id);
    $company->update($requestData);
	//syncする
	$company->categories()->sync($category_id);

	return redirect('companies')->with('flash_message', 'Company updated!');
}
```

## ビュー
カテゴリー一覧のidと保存されているidが同じだったらチェックボックスにcheckを入れます。

```php:form.blade.php

<?php
//すでに保存されているデータを取得してidを$categorySavedIdに入れる
$categorySavedId = array();
foreach($company->categories as $category) {
	$id = $category->id;
	array_push($categorySavedId,$id);	
}
?>
<ul>
<?php foreach ($categories as $category): ?>

<?php
//カテゴリー一覧にcategorySavedIdがあるかチェック
$check = in_array($category->id,$categorySavedId);
?>

<?php if($check == true): ?>

<li><input type="checkbox" value="{{$category->id}}" id="category_{{ $category->id }}" name="category_id[]" checked="checked">
<label for="category_{{ $category->id }}">{{ $category->name }}
</label></li>
<?php else: ?>
<li><input type="checkbox" value="{{$category->id}}" id="category_{{ $category->id }}" name="category_id[]">
<label for="category_{{ $category->id }}">{{ $category->name }}
</label></li>
</label></li>
<?php endif; ?>

<?php endforeach; ?>
</ul>
```
Ruby の無名(匿名)関数のごく短いサンプル

#要点
Ruby には無名関数(匿名関数)という用語はなく、ブロックがそれに対応する。
ブロックはコードの塊で関数のパラメータとして使うことができる。


#サンプル

次の readAllLines 関数のパラメータ &callback に無名関数を使うことができる。& は proc や lambda を関数のパラメータとして使えるブロックに変換する演算子。

```Ruby
# ファイルを１行づつ読んで、その行を callback に渡す。
def readAllLines(filePath, &callback)
  File.foreach(filePath) {|line|
    callback.call(line.chomp)
  }
end
```

&callback 部分はブロックなので () の外側に書く。ブロックの引数 line は | で囲む。


```Ruby
filePath = ARGV[0]
readAllLines(filePath) {|line| puts line}
```
Go言語のiota

Go言語の世界では、iotaの独自色は強いです。

#Goの定数定義
Goの定数を定義する際に、明示的に値を設定しない場合は、一つ前の定数の値で設定されます。
例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/2c87c9df-bd6a-9b98-d9d0-368fc82260b2.png)

結果：
>go begin
>This is a.
>This is a.
>This is a.
>go end

#iotaについて
iotaは、連番でプラス１となります。
典型的なサンプルは下記です。
https://golang.org/doc/effective_go.html#variables

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/1eb74d35-01a7-c7c7-f063-74aa604d4c80.png)

結果：
>go begin
>1024
>1.048576e+06
>1.073741824e+09
>1.099511627776e+12
>go end

#iota値のリセット
次のconst定義にてリセットされます。
例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/8bd62db6-3e86-8f8d-9324-40bd808236ef.png)

結果：
>go begin
>0
>1
>0
>1
>go end

0,1,2,3ではなく、0,1,0,1となります。

以上
Fabric beta + fastlane + slackでStockey Adhocを自動化

# 課題

プライベートで[Stockey][1]というiOSアプリを開発しており、Adhoc版ipaのビルドから配布までを[Bitrise][2]を使っていました。
しかし、機能が増えるに従ってビルド時間が長くなり、無料の範囲内のワークフロー10分制限を超えるようになってしまい、最近はテストフライトを使っております。
テストフライトでは、本番アプリに上書き・配布までに時間が掛かるなどの問題があるため、他の方法を調べたところ、[Fabric][3]にipaの配布を行う機能があることを知りました。ただこれだけだと何かと手間なため、最近流行りのfastlaneを使って、ビルドからslackへの通知まで1コマンドで実行できるように対応しました。

# セットアップ手順

## fastlaneのインストール

```
$ sudo gem install fastlane
```
私のPCではsudoをつけないとパーミッションが足りないと怒られたのでつけてます。
これでインストールできたバージョンが2.116.0で、最新は2.116.1でした。
新規インストールでしたので、2.116.1までアップデートします。

```
$ sudo gem update fastlane
```
これで完了

## fastlaneの初期セットアップ

```
$ cd <Xcodeのプロジェクトファイルがあるフォルダパス>
$ fastlane init
```

1〜４までの選択肢が表示され、4を選択しました。
4. 🛠  Manual setup - manually setup your project to automate your tasks

あとはなにか聞かれるたびに、Enterで完了。
フォルダ内にfastlaneフォルダや設定ファイル類が生成されます。

## ./fastlane/Fastfileの編集

Stockey用にしてありますので、もし参考にされる方がおりましたら、各プロジェクト用に最適な設定に変更してください。
※見せられないところは<コメント>にしてあります。

```
default_platform(:ios)

platform :ios do
  desc "<任意の説明文>"
  lane :up_adhoc_dev do

    scheme = "StockeyDev"
    info_plist_path = "./Stockey/Info-Dev.plist"
    version_number = get_info_plist_value(
        path: info_plist_path,
        key: "CFBundleShortVersionString"
    )
    build_number = get_info_plist_value(
        path: info_plist_path,
        key: "CFBundleVersion"
    )

    xcode_select("/Applications/Xcode.app")
 
    gym(
      configuration: "Release",
      scheme: scheme,
      export_method: "ad-hoc",
      output_directory: "./build/ipa/" + Time.new.strftime("%Y/%m/%d/%H%M"),
      output_name: "StockeyDev.ipa",
      include_bitcode: false,
      clean: true,
      export_options: {
        compileBitcode: false,
        uploadBitcode: false
      }
    )
 
    crashlytics(
      crashlytics_path: "./Vendor/Fabric/Crashlytics.framework/submit",
      api_token: "<APIトークンを設定>",
      build_secret: "<シークレットキーを設定>",
      notes: "<任意の説明>",
      groups: "<Fabricで設定したテスターグループ名を設定>"
    )
 
    slack(
      message: "インストールページ v" + version_number + "(" + build_number + ")\n" + "<Fabricでのipa配信ページのURL>",
      slack_url: "<slackのURLを設定>"
    )
  end
end
```

# 実行

```
cd <Xcodeのプロジェクトファイルがあるフォルダパス>
bundle exec fastlane up_adhoc_dev
```

# 参考文献

[[iOS] アプリをAd Hoc配布可能にする手順について][6]
[[iOS] fastlaneを導入する手順について][5]

[1]:https://itunes.apple.com/jp/app/stockey/id1407877357?mt=8
[2]:https://www.bitrise.io/
[3]:https://get.fabric.io/
[4]:https://github.com/fastlane/fastlane
[5]:https://dev.classmethod.jp/smartphone/iphone/prepare-for-ios-app-distribution-part-2/
[6]:https://dev.classmethod.jp/smartphone/iphone/prepare-for-ios-app-distribution-part-1/
【さくらVPS】【CentOS7】MySQL(phpMyAdmin)、Railsの開発環境構築(1)：初期設定

# 背景
WordPressと、BaserCMSのデモサイト、Ruby on Railsのデモアプリケーションを作るべく、さくらのVPSを契約しました。

上記を実現するため、CentOS7で、Apache、MySQL(phpMyAdmin)、PHP、Ruby on Railsの言語・フレームワークの開発環境構築を試みます。


# 目的
開発環境構築を構築するために、さくらのVPS、CentOS7の最初の初期設定を完了させます。
この記事でいう初期設定は以下です。
・アップデート
・日本語化
・rootユーザーのパスワード変更

※間違いなどあれば、加筆修正します。

手順は以下になります。

# さくらVPSに、rootユーザーでSSH接続

```
mbp:~ user$ ssh root@111.222.333.444
```
※OS再インストールした後は、下記のコマンドを実行してからでないとssh接続できない

```
mbp:~ user$ ssh-keygen -R 111.222.333.444
```


# Linuxパッケージを最新にアップデート

```
[root@ ~]# yum update
```

※yum→VPSの中にあるアプリケーションを管理するためのコマンド。
※最新じゃないと、セキュリティに問題があるため、必ず行う。


# VPSサーバーの日本語化

```
[root@ ~]# localectl set-locale LANG=ja_JP.UTF-8
```

※locale(ロケール)→システムやソフトウェアにおける言語や国・地域の設定

## ロケール確認

```
[root@ ~]# localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
```



# rootユーザーのパスワード変更

```
[root@ ~]# passwd
```
「New password:」と表示後、希望のパスワードを入力します。


# さいごに
次は一般ユーザーの追加とその諸設定について書いていきます。
https://qiita.com/jung_issei/items/e5a1d6b0507d158debee