OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでGitのサーバーを作った話

# Git server on python3

Git Advent Calendar 20日目にも続いているような記事です。
[Markdown対応GitバックエンドのWikiシステム - Qiita Git Advent Calendar 20日目](https://qiita.com/beckorz/items/b2abf9e22c45440d05b1)

Python で使えるSmart HTTPに対応した簡単なGitサーバーを作りたいなと思いました。まず成果物はこちら。[リポジトリ](https://github.com/beckorz/git-server)
と言っても、Gitサーバーのサンプルとしての目的なので、大したことしていませんし、参考程度にどうぞ


## 動機
もともとGitのバックエンドなwikiを作りたいと思っており、今回参考になる物を・・・と思って探したらありました。[git-server.py](https://gist.github.com/stewartpark/1b079dc0481c6213def9)
ただ、Python2向けで作られていたので、今のPython3で動かしたく若干手直ししないといけない部分がありました。
ついでに、どこでも簡単に動かしやすいサンプルとして作りました。


## 必要な物
- Python3(Python3.5で確認しています。)
    - flask
        - `pip install flask` あたりでFlaskをインストールしてください。
- git client(1.8以降で確認しています。)
- Linux, Windows で動くことを確認しております。


## 元からの修正点
- Python 2 to Python 3
    - StringIO ・・・ Python2 to Python3 のアルアル
- PackStreamReader の廃止
    - 元々は、receive packを取得する際に使っている模様ですが、そこまでする必要が無ければ参照する必要もないという事で消しています。
- HTTPBasicAuth 
    - サンプルとして作るうえでは不要かなと思って削除しております。
- Subprocess のブロッキング処理周りを若干修正して動くようにしました。
- gzip対応
    - git clientは大きいサイズのデータをpushする際は、gzipな圧縮形式で送ってきますので、リクエストヘッダーを判断して送られてきたgzipをunpackします。
- サーバー設定ファイル化
    - `config.ini` から設定情報を読み取るようにしています。
- ログ出力対応
    - logs ディレクトリにログを出力するようにしています。


## その他
- nginx等Webサーバーのリバースプロキシー(SSL)を使っても動作する事を確認しています。
- `git-http-backend` も使えばいけそうですが、後々Git clientをラッピングした物の方が、その他の処理で幅が出るなと思って git clientを使っています。
- 後日書く予定のGitバックエンドのwikiシステムのGitサーバー部分だけの機能のものです。


## 参考
- [git fetch の裏側では何が起こっているか - 詩と創作・思索のひろば](https://motemen.hatenablog.com/entry/2016/03/git-pack-protocol-explained)
    - gitの内部処理を日本語で分かりやすく説明しております。
- [Git - Packfile](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Packfile)
    - gitのPackfileの説明。
アジャイル開発での朝会夕会が立ち疲れるし辛い？対策 スタンドアップミーティングは楽しくやろう

# つま先立ち

意外とエネルギーが発散されて良い。背が高く見えるのでかっこいいエンジニア。

# L座り

チームや周りさえ許容してくれればDEATHノートのLになって、天才肌チックな遊びをすると共に、血流の流れを変える。

# ずぼらヨガ

人には分からないぐらいのレベルで後ろで手を組んだりして体を伸ばす。

# 明石家さんまになる

自分がしゃべらないミーティングは疲れる。癒やしのために積極的に発言するようにする。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
バージョン管理システムの導入に関する検討

# はじめに
個人的な見解をまとめたものであり、所属する組織とは無関係です。
また、現在の部署に着任して日が浅いため、事実と異なる点があるかもしれません。悪しからず。

Markdownでの資料が市民権を得ることができれば、PowerPointの資料作成から脱却できるのになぁ…

# 要件定義
個人的なイメージで書いています。

## 1. セキュリティ
**「社内OAや検証用NWなど、クローズドな環境で運用できること」**

インターネット上に情報を置くことは情報流出やウイルス感染の危険があるためNG。これまでに社内LAN内にRedmineを導入しているため、新しい手続きなどはいらない？

~~何か調べようとしても、閲覧禁止サイトに登録されており、自分のスマホで調べることもしょっちゅう。バージョン管理システムについて検討している際も何度もフィルタリングされた。閲覧禁止理由が「Information Technology」とか、もう…~~

## 2. 導入事例＆ナレッジ
**「何か困ったときすぐ検索できるように、導入事例やナレッジが豊富にあること」**

何かOSSやLinuxのコマンドでエラーが出力された際、「エラーメッセージやログを追いかける」「マニュアル(manコマンドやhelpオプション)を読み返す」よりも先に「エラーメッセージをそのままググる」ことが多いです。また、何かプラグインを導入する際も、プラグインの公式サイトよりも導入事例の記事を先に読むことがほとんどです。公式マニュアルをもとに導入してみた記事などがあるとイメージがつかみやすくていい。

## 3. 機能
**「WebGUIである程度のリポジトリの操作ができること」**
自分を含めて、Gitをバリバリ使ったことがない人ばかりのため、WebGUIは必須かなと思います。

**「各自のネームスペースを持てること」**
ローカルフォルダの作業を防ぎ、必ず他のメンバーに共有できるようにするためです。

**「カンバンなどコードを書く人にとって、便利なツールがビルドインされていること」**
これまで、個人フォルダでツールを作っていた人にとっては、新たにバージョン管理システムを利用の習熟が必要になるため、ネガティブな印象を持たれると思っています。そのため、習熟コストを上回るメリットとして、WebIDEや、カンバンといった便利な機能も必要だと考えます。

直近では、ソフトウェア開発を受託しているわけではないのでマネージャに対して、ソースコードの中身について報告する必要はないと思いますのでツール開発者にとって使いやすいものを優先すればいいと考えます。マネージャへ報告する必要があるものRedmineでいいかと。
https://about.gitlab.com/2018/08/02/4-ways-to-use-gitlab-issue-boards/

## 4. システム連携
**「CIツールやすでに社内で導入されているシステムと連携する仕組みがあらかじめ備わっていること」**

2,3年後に今回導入するバージョン管理システムがどれだけ利用されているかわかりません。既に社内LAN上に導入されているRedmineも導入直後は周囲の目は冷ややかでしたが、現在では無くてはならないツールになっています。また、新たなツールを導入していく際に本バージョン管理システムが足かせにならないよう、他のシステムと連携する仕組みは必須だと思います。

## 5. コスト
**「費用対効果を算出するには根拠が乏しすぎるため、ひとまず無料であること」**

所属する部署では、ボスや他の部署の取り組みの影響により、ここ1,2年でPython、Javaによる開発/検証/維持管理業務などの効率化の流れが来ていますが、ソースコードをばりばり書く文化はなく、一部のメンバーがTeratermマクロやExcel関数を用いたツールを作っていた程度です。

そのため、Javaで作成したプログラムにより削れる稼働は算出できても、バージョン管理システムの有無によるプログラム作成にかかる稼働や品質の違いを「自分」が説明できないためです。使い慣れている人に話を聞きたい…

## 6. 環境構築、メンテナンス
**「クローズドな環境に構築するため、必要なものが全てパッケージングされており、インストールやアップデートが簡易であること」**

環境構築時にあわよくばDevOpsに実現に必要なツール郡の導入と連携がまとめてできると言うことなしです。
メンテナンスとしては、「2.導入事例&ナレッジ」と相反しますが、公式マニュアルが充実していれば、新たに手順書などを作成しなくていいので楽かと思います。

## 7. 認証/権限付与
**「ActiveDirectory or LADP連携が可能で、ロールによる権限の管理が可能であること」**

これは、組織で利用する上では必須項目だと思います。

   https://www.ossnews.jp/oss_info/GitLab#Div0
   https://developers.gnavi.co.jp/entry/gitlab

# 導入検討

GitHub、GitLab、BitBucketを比較した結果、**GitLab**を選定！
https://www.gitlab.jp/comparison/gitlab-vs-github.html#dropdown
https://www.gitlab.jp/comparison/gitlab-com-vs-bitbucket-org.html#dropdown
https://qiita.com/developer-kikikaikai/items/3fd1277a9a5778000638

# 課題事項 
これまでソフトウェア業界では当たり前に利用されてきたバージョン管理システムは、非常に便利な反面、運用ルールの策定や初心者の習熟など利用する側の課題が多いかと思います。
https://techracho.bpsinc.jp/morimorihoge/2014_04_25/16856


## 1. 組織に適応したバージョン管理ツールの運用ルールを策定すること。

担当している案件や組織の文化に応じたルールを設定する必要があるため、我々で運用ルールをどこまで決めて他部署に展開することが適切か正直わかりません。

## 2. 初心者の習熟が困難であること。

ドキュメントを単純に保存するだけでは問題ありませんが、ツールやソフトウェアを”複数人”で”同時”に開発する(=ブランチやマージを利用する)上では、ソースコードをコミットする全員がGitについてよく理解していないとリポジトリが崩壊します。自分もSVNしか利用したことがないですが、何度も誤コミットがありました。

ソフトウェア開発が主業務であれば、嫌でもそのうち習熟するかと思いますが、主業務ではないのでどうやって慣れてもらうかは課題です。マニュアルも大事ですが、実際に触って覚えるしかないため、部署内アプリコンペなどいろいろと触る機会を作っていく必要があるかと思います。
リファクタリングでコードの記述量がめっちゃ減ったお話

先日[キャプチャ数が動的に変化する正規表現の具体例](https://qiita.com/hirasyo/items/c9b2d55dfaebadb61020)の記事をあげたところ、@scivola様より丁寧にアドバイスいただき、リファクタリングを行いました。

# アルファベットとハイフンから構成される文字列を、ハイフンで区切って単語部分についてcapitalizeする
### これまでのコード（splitを使用）

``` rubypractice.rb
def word_capitalize_split(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  nstr = []
  result_split = ""
  nstr = str.split(/-/) # ハイフンで分割し配列に格納
  nstr.each do |word|
    result_split << word.capitalize + "-" # 単語をCapitalizeしハイフンと一緒に文字列に入れる
  end
  return result_split.chop # "Ruby-Php-Python-Cobol-Javascript-Java"
end
```

### リファクタリング後（@scivola様を参考）

``` rubypractice.rb
def word_capitalize_split(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  str.split(/-/).map(&:capitalize).join("-") # "Ruby-Php-Python-Cobol-Javascript-Java"
end
```

一行で済ませることができました。
やることの考え方はほぼ一緒ですが、mapやjoinを有効活用すると圧縮できました。すごい。

### これまでのコード（正規表現を使用）
```rubypractice.rb
def word_capitalize_regexp(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  count = 0
  str.each_char do |n| # 単語の中のハイフンの数を数える
    if n == "-"
      count += 1
    end
  end

  if count > 0
    separator = "(.+)"
    for i in 1..count
      separator << "-(.+)" #ハイフンの数だけセパレーターに追加する
    end

    Regexp.new(separator) =~ str # ハイフン区切りで単語をキャプチャ
    result = $1.capitalize # 一つ目のキャプチャした単語をCapitalize
		# ex.1 ハマったところここから
    for i in 2..count + 1
      result << "-" + eval('$'+i.to_s).capitalize # 二つ目以降のキャプチャした単語をCapitalize
    end
		# ex.1 ここまで
    return result # "Ruby-Php-Python-Cobol-Javascript-Java"
  else
    return str.capitalize
  end
end
 
```

### リファクタリング後（@scivola様のアドバイスより組み直し）

```rubypractice.rb
def word_capitalize_regexp(str)　# str = "ruby-php-Python-COBOL-JavaScript-javA"
  Regexp.new(Array.new(str.count("-") + 1){"(.+)"}.join("-")) =~ str
  return $~.captures.map(&:capitalize).join("-")　# "Ruby-Php-Python-Cobol-Javascript-Java"
end
```

カウントしたり正規表現用の文字列を作ったりするところが全て一行で収まりました。
String#countとかあったんですね・・・勉強になります。


### gsubを使ってリファクタリング（@bogo様を参考）

``` rubypractice.rb
def word_capitalize_gsub(str) # str = "ruby-php-Python-COBOL-JavaScript-javA"
  str.gsub(/([A-Za-z]+)/){ $1.capitalize } # "Ruby-Php-Python-Cobol-Javascript-Java"
end
```

gsubでもできるというコメントをQrunchで@bogo様からいただきました。
gsubってブロック変数も使えるんですね、もっと勉強しときます。

#　まとめ
工夫することにより、２１行かけて書いたコードも２行に抑えることが可能という知見を得ました。
処理速度がかなり変わるはずなので、今後は徐々にコードの質にも気をつけていこうと思います。
コメントくださった方々本当にありがとうございました！
force cli : force field creatの改造

#はじめに
force cliを使ってカスタムオブジェクトにカスタムフィールドを追加します。
ただし、picklistの場合にうまくいかなかった。
そこでforce cliを少し改造しました。その時の備忘録です。


#変更前の挙動
picklist型の項目を追加するコマンドの例

```
$force field create CustomObject__c "CustomField":picklist picklist:"1,2" label:区分
```

実行結果の例

```
Options:  map[label:区分 picklist>picklistValues:1,2]
Key label
Options:  map[picklist>picklistValues:1,2 label:区分]
Key picklist>picklistValues
ERROR: Property 'picklist' not valid in version 40.0
```
とversion 40.0ではpicklistは使えないと出てきます。

#エラーの中身は？
https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_picklist.htm
を見てみると　この型は、API バージョン 37.0 以前でのみ使用します。
となっています。どうもversion 40.0では異なっているようです。

そこで、既にpicklistを指定しているカスタムオブジェクトのmetaデータを確認します。
valueSetというタグに変わっているようです。

#変更内容
field createで実際にmeta データを作っているプログラムは
go/src/github.com/ForceCLI/force/lib/metadata.goにありますので確認。
ちょうど866行目あたりにありました。
この部分を改造すればなんとかなりそうです。

```
soapField += "<picklist>\n"を
soapField += "<valueSet>\n<restricted>true</restricted>\n<valueSetDefinition>\n"に変更。

soapField += fmt.Sprintf("<picklistValues>\n<fullName>%s</fullName>\n<default>false</default>\n</picklistValues>\n", strings.Trim(k, " "))を
soapField += fmt.Sprintf("<value>\n<fullName>%s</fullName>\n<default>false</default>\n<label>%s</label></value>\n", strings.Trim(k, " "), strings.Trim(k, " "))に変更。

soapField += "</picklis>\n"を
soapField += "</valueSetDefinition>\n</valueSet>\n"に変更。
```

以上３行を変更すればできそう。

実際に確認してみます。
force cliのmain.goがあるディレィトリーに移動して

```
$go run ./main.go field create CustomObject__c "CustomField":picklist picklist:"1,2" label:区分
```

を実行すれば、実際に動くかを確かめられます。（うまくいけば項目が追加されます）
[Oracle] My Oracle Supportのナレッジ記事がWeb検索可能になった話

このエントリは <a href="https://adventar.org/calendars/3525">Oracle Database or GoldenGate Advent Calendar 2018</a> の Day 3 の記事となります。

前日はcharade_oo4oさんの「<a href="http://charade.seesaa.net/article/462984231.html">Data Guard 奮闘記</a>」という記事でした。

Data Guardは構成によってハマりポイントが色々とありますよねー。

&nbsp;

3日目の本日はタイトルの通り、「My Oracle Supportのナレッジ記事がWeb検索可能になった話」について書いてみます。

&nbsp;

&nbsp;
<h3>My Oracle Supportとは？</h3>
この記事に辿り着いた方で、「My Oracle Support(MOS) って何？」という方はいないとは思いますが、念のため<a href="https://support.oracle.com">support.oracle.com</a>のTOPページを引用しておくと、、
<blockquote>Oracle Premier Supportのお客様向けのワンストップ・サポート・ソリューションです。
・ソリューションを検索
・パッチと更新をダウンロード
・プロアクティブなサポート・ツールにアクセス
・My Oracle Supportコミュニティでコラボレーション
・サービス・リクエストを作成</blockquote>
特に、豊富な技術情報を含むナレッジ記事（いわゆるDocとかNote、昔ならKROWNと呼ばれているもの）が参照できて便利なわけですが、上記の説明にもある通り、「Oracle Premier Supportのお客様向け」に提供されているという前提があるので、ブログなどで記事を書く際に参照しづらいという制約がありました。

・・・これまでは。

&nbsp;

&nbsp;
<h3>Web検索でヒットするようになった！</h3>
本家オラクル社からのアナウンスを見た覚えがないので、いつからなのか正確には分からないのですが、これまではMOSにログインしてからでないと参照できなかったナレッジ記事がWeb検索でヒットするようになっています。

例えば「oracle database 18c」で検索すると、こんな感じ↓

<img class="alignnone size-medium wp-image-1946" src="http://itedge.stars.ne.jp/wp/wp-content/uploads/2018/12/MOS1-300x169.jpg" alt="" width="300" height="169" />

ヒットしたページにアクセスすると、こんな感じ↓

<img class="alignnone size-medium wp-image-1948" src="http://itedge.stars.ne.jp/wp/wp-content/uploads/2018/12/MOS2-300x186.jpg" alt="" width="300" height="186" />

&nbsp;

Web検索でヒットしたページには、MOSで公開されているナレッジの内容の一部のみが記載されているようで、全文を確認するためにはMOSへのログインが必要なのですが、それでも相当に便利だと感じます。

しかも、MOSで見るより、なんだかカッコいい。

&nbsp;

同僚が教えてくれてこの事実を知ったときは、軽く感動してしまいました。

&nbsp;

ちなみに、上記検索例では「site:support.oracle.com」と検索対象ドメインを絞っていますが、これは検索ページランクを考慮したものです（現状だと、まだまだ上位には表示されないようなので）。

今後、世の中のブロガーなどが外部公開されているMOSナレッジページをリンクしてWeb記事を書いていくことで、おのずとページランクは上がっていくものと期待してます。

&nbsp;

&nbsp;
<h3>おまけ</h3>
MOSナレッジがWeb検索できるようになったことを記念して、最後におすすめDocを２つほど紹介しておきます。
(Oracle Databaseに関連するAdvent Calendarっぽさを演出）



・<a href="https://support.oracle.com/knowledge/Sun%20Microsystems/1632115_1.html">Oracle Japan : Database 技術情報トップページ (ドキュメントID 1632115.1)</a>


Oracle Databaseに関する技術情報のポータルページ。

日本のサポート・エンジニアが、お奨めの技術情報やホット・トピックを紹介してくれてます。

普段のMOSの使い方としては、調べたい機能やエラーなどを「キーワード検索」することが多いのですが、たまにこのDocを眺めてみると、役立つ情報に出会えたりします。

&nbsp;

・<a href="https://support.oracle.com/knowledge/Oracle%20Cloud/2413744_1.html">現在のデータベース・リリースのリリース・スケジュール (ドキュメントID 2413744.1)</a>



現在リリースされているOracle Databaseの基本リリースおよびパッチ・セットのスケジュールおよび関連サポート情報がまとまっているDoc。

あのプラットフォームに対する最新バージョンはいつ出るんだ？と毎日チェックしているマニアな人もいるのでは？！

ちなみに、このページでは相当の情報がMOSログインなしで確認できるようになってました。

&nbsp;

Docによって、タイトルだけしか公開されていないもの、目次まで公開されているもの、かなりの情報が公開されているものなど、色々なタイプがあるようです。
<h3></h3>
&nbsp;
<h3>まとめ</h3>
<a href="https://adventar.org/calendars/3525">Oracle Database or GoldenGate Advent Calendar 2018</a> の Day 3 の記事として、「My Oracle Supportのナレッジ記事がWeb検索可能になった話」を紹介しました。

明日は@ch0c0bana0さんの「<a href="https://qiita.com/ch0c0bana0/items/0567de420c2a40128e94">GoldenGate布教活動①　～GoldenGateの基本のキ～</a>」です。

&nbsp;

~~Advent Calendarの登録枠はまだ若干余っているようです。~~

~~何をネタにして書こうか迷ってる方は、思い入れのあるDocを参照しつつ記事を書いてみてはどうでしょうか？~~

&nbsp;

QiitaのSEOがすごいと聞いて、ためしにダブルポスト。
VBAという選択肢

　VBAをご存じだろうか。VBAとは「Visual Basic for Applications」の略でMicrosoftがMSOfficeの拡張機能として提供しているプログラミング言語である。Excelにはマクロがあり設定を少しいじると簡単に使うことができる。どんなことができるのかというと特定のセルへの数式の入力やグラフの作成マクロを使わなければできないようなループを用いた値の計算など様々なことができる。正直僕自身もかなりのにわかであるのでまだまだできることが多くある。詳しくはWebで。

　正直、Excel自体が感覚でできるというか便利なのであまり日常的に使う必要はない。Excelで何か開発をする際に、
![IMG_0958.jpg](https://qiita-image-store.s3.amazonaws.com/0/320458/e1e70ae8-5013-17fe-45a8-040092cc294a.jpeg)
　業務の発生する頻度が高く、業務にかかる手間が多いものや
![IMG_0957.jpg](https://qiita-image-store.s3.amazonaws.com/0/320458/57fe2577-0e12-5a8e-325c-834984197918.jpeg)
　開発を行うメリットが高く、開発にかかる工数が少ないものなどを開発する際は使ってみてもよいと思う。数値解析の一部の問題はプログラムを書かないと解きにくい問題があると思う。それは上図の開発のメリットが高く開発にかかる工数が少ないので「すぐにでも開発すべき」に該当すると思う。


　VBAはExcel単体で完結しますし、非常に簡単であるのでC言語をある程度かけるような人であれば、簡単すぎてこんな簡単な言語やりたくねえって思うくらい簡単です。だからこそやってみてもそこまで時間食わないのでぜひExcelで数値解析の課題をやるときだとか一度やってみてはいかがでしょうか。

参考文献
https://vbae.odyssey-com.co.jp/column/no11_2.html
アプリ公開のためのプライバシーポリシー 

タイトルのままだし、
メモ書き程度のもので、ほぼ技術的な内容はないです。

###経緯
2017年にiOS端末で位置情報を取得し、ログとしてサーバに送信するアプリを作ったんですが（Web側でそれを地図にマッピングして照会）
当初はプライバシーポリシー設定が任意だったので作成も設定もしていませんでした。

ところが今年の10月からAppStoreに公開するためにはプライバシーポリシーの設定が必須になっていたことを上記アプリの12月アップデートを審査に提出する段階で知り、さてどうしようかな、と。

###結論
会社のプライバシーポリシー（個人情報保護方針）のリンクを貼って提出すれば、問題ありませんでした。

###杞憂だったけど、懸念していたこと
アプリのプライバシーポリシーは、
アプリの機能概要や取得・収集する情報の種類や目的を具体的に書く必要がある、
という情報をまとめサイト等で見かけていたので、
会社全体としての個人情報保護方針ではそれにはそぐわないだろう、とビクビクしていました。

ただ、リリース予定日が近いこともあり、今からアプリ用のプライバシーポリシーを作るのも、それを公開する場所を準備するのも正直つらい。
で、イチかバチかで試してみたところ、問題なく審査完了したのでよかったです。
高速コレクション操作ライブラリ「Koazee」

この記事は[Go2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/go2)の17日目の記事です。

# コレクション操作ライブラリ Koazee

12月はじめのこと、go-nutsに「速いコレクション操作ライブラリを作ったぜ」という投稿がありました。

* [[go-nuts] Koazee vs Go-Linq vs Go-Funk](https://groups.google.com/d/msg/golang-nuts/BfGPIzNsxsM/KyMXvD93BwAJ)

彼のベンチマークによると類似のライブラリに比べてかなり速いという結果が示されています。ここでは彼が作ったコレクション操作ライブラリ Koazee を紹介しつつ、高速化の一端に触れてみます。

* [github.com/wesovilabs/koazee](https://github.com/wesovilabs/koazee)

> Lazy like a koala, smart like a chimpanzee (原文ママ)

Koazeeの特徴は

* イミュータブル
* ストリームスタイル
* 遅延ローディング
* ジェネリックス
* 速い！

とのことでここでは「ジェネリックス」と「速い！」という点を見ていきます。

# ジェネリックス

Koazee を使うとストリームの操作をより自然な形で記述することができます。

まず、Koazee の使い方を見る前に、類似ライブラリの [go-linq](https://github.com/ahmetb/go-linq) のサンプルを見てみます。

```golang
import . "github.com/ahmetb/go-linq"
	
type Car struct {
    year int
    owner, model string
}

...


var owners []string

From(cars).Where(func(c interface{}) bool {
	return c.(Car).year >= 2015
}).Select(func(c interface{}) interface{} {
	return c.(Car).owner
}).ToSlice(&owners)
```

`Where`や`Select`に渡される関数リテラルの中で、型アサーションしています。なんだか面倒くさい。go-linqには`WhereT`や`SelectT`といった、関数リテラル自体を`interface{}`で受けるものも用意されていますが、「オーバーヘッドがあるよ」と注意書きがされています。

一方、Koazeeのサンプルを見てみると

```golang
package main

import (
	"fmt"
	"github.com/wesovilabs/koazee"
)

var numbers = []int{1, 5, 4, 3, 2, 7, 1, 8, 2, 3}

func main() {
	fmt.Printf("input: %v\n", numbers)
	stream := koazee.StreamOf(numbers)
	fmt.Print("stream.Reduce(sum): ")
	fmt.Println(stream.Reduce(func(acc, val int) int {
		return acc + val
	}).Int())
}

/**
go run main.go

input: [1 5 4 3 2 7 1 8 2 3]
stream.Reduce(sum): 36
*/
```

型アサーションをしない形で書かれています。実際に`Reduce`は関数リテラルを`interface{}`で受け取っています。

go-linqでは遅くなるとされていた方式で、なぜKoazeeは速いのか？

# 速い！

[本人の解説](https://groups.google.com/d/msg/golang-nuts/BfGPIzNsxsM/ovqO5R-DBwAJ)によると、「キャッシュをうまく使っている」とのこと。例として、`Filter`の実装にあるバリデーションを見てみると、

* [internal/filter/filter.go](https://github.com/wesovilabs/koazee/blob/master/internal/filter/filter.go)

```golang
func (op *Filter) validate() (*filterInfo, *errors.Error) {
   item := &filterInfo{}
   fnType := reflect.TypeOf(op.Func)
   if val := cache.get(op.ItemsType, fnType); val != nil {
      return val, nil
   //...... Validations for input
   item.fnInputType = fnIn.Type()
   cache.add(op.ItemsType, fnType, item)
   return item, nil
}
```

`cache`にバリデーション結果を保存しているのがわかります。`cache`の実態はただの二次元`map`です。

また、他の点でもパフォーマンスに気を使っているとのことで、`Reverse`ではちょっと工夫して

```go
func reverseInt16Ptr(itemsValue reflect.Value) interface{}{
   input := itemsValue.Interface().([]*int16)
   len := len(input)
   output := make([]*int16, len)
   for index := 0; index < (len/2)+1; index++ {
      output[index], output[len-1-index] = input[len-1-index], input[index]
   }
   return output
}
```

ループ処理が半分で済むように実装されていたりします。

# まとめ

年末に彗星のごとく現れたKoazee、使いやすく、それでいて高速！

キャッシュまわりはgoroutineと併用されたときにどうなるのーとか気になりますが、今後に注目です。
casTableのクエリで文字列を変換する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルオブジェクト（Python版）で文字列を加工する方法を解説します。

## テーブルの作り方

テーブルはCSV、HTML、他のデータベースなどから作れます。

```py
out = sess.upload('Jupyter_Saved_Work/Data/iris.csv')
```

ファイルをアップロードした後、casTableとして取得します。

```
tbl = out.casTable
```

## カラムを追加する

例えばカラム同士の計算結果を追加したい、レポート用に特定の文字列を出したいなど、様々な用途が考えられます。これは tbl にキーを追加するだけです。例えば以下は文字列として指定しているので、同じ文字が表示されます。

```py
tbl['newColumn'] = 'SepalLength * 2'
```

計算を伴う場合は以下のようにtblを使います。

```py
tbl['newColumn2'] = tbl.SepalLength * 2
```

## カラムを加工する

そしてカラムの加工方法です。例えば title というメソッドを使うと単語の最初の文字を大文字に、後は小文字に変換できます。

```python
tbl['NameTitle'] = tbl['Name'].str.title()
```

| SepalLength | SepalWidth | PetalLength | PetalWidth | Name | NameTitle
|---|-----|-----|-----|-----|-------------|------------|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | Iris-Setosa
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | Iris-Setosa
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | Iris-Setosa
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | Iris-Setosa
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | Iris-Setosa

### 特定の文字を探す

カラムの中にある文字を検索する際には find を使います。

```python
tbl['NameFind'] = tbl['Name'].str.find('-')
```

| SepalLength | SepalWidth | PetalLength | PetalWidth | Name | NameFind |
|---|-----|-----|-----|-----|-------------|-----|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | 4.0 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | 4.0 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | 4.0 |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | 4.0 |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | 4.0 |

### 大文字化

セル内の文字列を大文字化します。


```python
tbl['NameUpper'] = tbl['Name'].str.upper()
```

| SepalLength | SepalWidth | PetalLength | PetalWidth | Name | isNameUpper
|---|-----|-----|-----|-----|-------------|-------------|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | IRIS-SETOSA |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | IRIS-SETOSA |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA |

### 追加したカラムを処理に利用する

新しいカラムを追加する際には、計算したカラムを利用することもできます。以下の例では大文字化したカラムがすべて大文字かどうかを判定するカラムを追加します。

```python
tbl['isNameUpper'] = tbl['NameUpper'].str.isupper()
```

| SepalLength | SepalWidth | PetalLength | PetalWidth | Name | NameUpper | isNameUpper
|---|-----|-----|-----|-----|-------------|-------------|-----|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA | 1.0
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA | 1.0
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | IRIS-SETOSA | 1.0
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | IRIS-SETOSA | 1.0
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | IRIS-SETOSA | 1.0

----

文字列向けの関数としては他にも count / index / slice / len / contains など多数用意されています。閲覧時の簡易的なデータ加工としてご利用ください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
AndroidユーザーならXperia Ear Duoすごいぞ

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の17日目の記事です。

本日はXperia Ear Duoの話です。

■SONYさんのサイト
https://www.sonymobile.co.jp/product/smartproducts/xea20/


上記だと約3万円ですが、僕が秋葉原のヨドバシさんで買ったときは25000円しないくらい。
ヨドバシのポイントが溜まってたので1万円未満でした。

Xperia Ear Duoがスマートスピーカーなのか否かですが、音声アシスタントが呼び出せればスマートスピーカーに部類されると僕は考えています。
セットアップ時にGoogle Assistantもでてきました。

ただ、Xperia Ear Duoの僕にとっての最大の魅力はLINE社のClovaを呼び出すことができ、会話できます。
右耳側を押したら起動するのでその後は声で操作できます。

モバイル端末で外でClovaが呼べるのは非常に大きなアドバンテージです。

スマホでGoogle、Alexaも呼び出すことはもちろん可能ですが、いちいちスマホを取り出す必要がないのは強いです。

#使ってみた系の記事

様々なサイトで賛否両論に使ってみた系の記事があります。

https://e-earphone.blog/?p=1270534

https://estpolis.com/2018/07/46687.html


#実物

こんな感じです。

![DSC_1818.JPG](https://qiita-image-store.s3.amazonaws.com/0/67398/7f83415e-39dd-4a2c-1119-da5d554825d1.jpeg)

![DSC_1819.JPG](https://qiita-image-store.s3.amazonaws.com/0/67398/93a9a6bb-5cd3-2f79-01c1-d8ae22b65f54.jpeg)

![DSC_1820.JPG](https://qiita-image-store.s3.amazonaws.com/0/67398/ee79d3f5-87bc-4de4-de85-84261b361e4c.jpeg)

丸いケースが充電器も兼ねていて、USB接続で給電します。


#iPhoneではClovaが使えないっぽい

僕はiPhoneを所有していないのでわからないですが、当初は以下のような記事でした。

■LINEのAIアシスタント「Clova」がソニーモバイル「Xperia Ear Duo」に対応
https://prtimes.jp/main/html/rd/p/000001044.000001594.html

上記サイトに4月11日時点で
**LINEのAIアシスタント「Clova」に対応はAndroidのみ**
と記載されています。

ともあれセットアップガイドにはiPhoneでのセットアップマニュアルもあります。

![DSC_1821.JPG](https://qiita-image-store.s3.amazonaws.com/0/67398/67ce0305-43b2-ef50-90d0-7a76e2396e93.jpeg)

LINE BOOT AWARDがあったんだからiPhoneでも今ならClovaは動くだろう。
と思いましたが、公式サイトをみるとダメっぽいですね。。

Siriに引っ張られてるのでしょうか。。

他の部分は「対応予定」とはありますが、Clovaの対応予定がないので、Xperia Ear DuoではAndroidになりそうですね。

![公式サイト.png](https://qiita-image-store.s3.amazonaws.com/0/67398/582d0f51-191e-45f2-92d8-031329e41d3e.png)


#ともあれ

僕個人が作っているClovaスキルを耳元で起動できています。
もちろん公開されているスキルも使えます。
ボイスアップラボさんの「ゾンビの街」とかすごいです。

AndroidのユーザーでClovaを屋外で呼び出すなら要検討かと。
ただ、**下手したらEcho Showよりお高い** ですけど。


以上
『migemo』という便利なツールをオススメしたい

この記事はLivesense AdvendCalendar 18日目の記事です。

昨日は @yubessy さんの「[sqlcsv で RDB ↔ CSV の I/O をお手軽に](https://qiita.com/yubessy/items/3ef3cf7bd56e531955e55773ced0d)」でした。

# migemoってなに？
エディタで**日本語をローマ字入力のままでインクリメンタルサーチ[1]できるようにするツール**です。
`kaihatsu`と入力すると文中にある「開発」を検索することができます。

このツールを使うと、日本語を検索するときに**IMEを日本語に切り替えたり、漢字に変換する必要がなくなって**、とても便利です。

文章でくどくど説明するのも大変なので、使ってる場面を動画を撮りました。

![migemo-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/97363/e99717cf-b4d5-650c-8772-913ec660e5fe.gif)
(※ 検索対象の原文は[こちら](https://qiita.com/otakumesi/items/2ce39b7b2d5bd0e4684e)です)

# 自分が使っている環境で使える？
migemoはもともとRuby製のEmacsのプラグインとして作られていたものでした。
しかし、現在ではC言語に移植され、いくつかのエディタのプラグインが開発されているため、様々な環境に対応しています。

以下、私が知っている限りの情報[2]です。

##### 対応OS
- **Windows**
- **Mac**
- **Linux**

##### 対応エディタ
- **Emacs**
- **Vim / NeoVim**
- **サクラエディタ**
- **秀丸エディタ**

AtomやVisualStudioCodeのプラグインを、調べてみましたが存在しないようです...。

# 導入方法
#### 1. migemoをインストールする
##### Mac / Linuxの場合
```sh
# Mac
brew install cmigemo
# Linux(ここでもUbuntuの例)
# お使いのディストリビューションのパッケージ管理ツールでお探しください
apt-get install cmigemo
```

##### Windowsの場合
[KaoriYaさんが配布しているDLL](https://www.kaoriya.net/software/cmigemo/)をダウンロードしてご利用ください。
基本的にはDLLをエディタの実行ファイルと同じディレクトリに置くという使い方で問題ないはずです。

#### 2. エディタのプラグイン
各種エディタのプラグインをまとめました。
お使いのエディタのプラグインで、migemoを試していただけたらと思います。

##### Emacs
* [migemo.el](https://github.com/emacs-jp/migemo)

##### Vim / NeoVim
* [migemo-search](https://github.com/rhysd/migemo-search.vim)
* [vim-migemo](https://github.com/haya14busa/vim-migemo)

Vim / NeoVimの場合は、まずインクリメンタルサーチを有効にする必要があります。

```vimscript:.vimrc(init.vim)
" NeoVimの場合は、ビルトイン機能にインクリメンタルサーチがあります。
" 下記の設定で、インクリメンタルサーチが有効になります。
set incsearch

" Vimの場合は下記のプラグインをいれると良いです。
" https://github.com/haya14busa/incsearch.vim
```

##### サクラエディタ
サクラエディタにはmigemo検索の機能がビルトインされています。
以下の記事を参考に、cmigemoを使えるようにしてください。
http://sakura-editor.sourceforge.net/htmlhelp/HLP000008.html#migemo

##### 秀丸エディタ
* [ローマ字のまま日本語をインクリメンタルサーチ(新版)](https://hide.maruo.co.jp/lib/macro/migemo.html)

## 公式情報
* http://0xcc.net/migemo/
* https://www.kaoriya.net/software/cmigemo/

---

以上となります。
今日からmigemoを使い始めた方の開発効率が上がったら、とても嬉しいなと思います。
明日は @p1na9uattr0 さんです。

[1]: インクリメンタルサーチとは、候補から検索対象を絞り込んでいくような検索方法のことを言います。
[2]: 他にあったら、コメント等で教えていただければと思います。:thumbsup:
ほぼゼロからPHP7を勉強して大変だったところ

# 自己紹介
はじめまして、株式会社シーエー・アドバンス技術統括本部の@ihahajimeと申します。　
開発知識を身に付けよう！という研修の一環で、PHPを勉強してます。
開発言語は学生時代にJavaを講義で勉強した程度で、
卒業してからはほぼ触ることすらなかったくらいの初心者です。
こういう記事を書くのも初めてですが、どうぞ宜しくお願い致します。


# はじめに
今回は研修で勉強しているPHP7で個人的につまづいたところを、書いていきたいと思います。
PHP7を動かす準備はMAMP、Githubを使い更新箇所などの管理を行い勉強していってます。
下記の書籍を参考にしています。

* [ 詳細!PHP7+MySQL 入門ノート ](http://www.sotechsha.co.jp/pc/html/1130.htm)

# つまづいたところ
自分が勉強してつまづいた箇所、理解するのに特に大変だった箇所です。

* 連想配列
* プリペアドステートメントとプレースホルダ

### 連想配列
Javaを習っていた頃から配列が苦手だったのでイメージするのに苦労しました・・・。

```php:php
$Array = [
  "id" => 000,
  "name" => "あああ",
   "age" => 27,
  ...
]
```


上記Array配列は、以下の内容となります。

* Array[id]に000を格納（"id"キーの値は”000"）
* Array[name]に"あああ"を格納（"name"キーの値は”あああ”）
* Array[age]に27を格納（"age"キーの値は”27”）

<b>→"名前の付けれる容器”に”値”を格納できる配列</b>


### プリペアドステートメントとプレースホルダ
こちらもイメージするのに苦労しました・・・。

```php:php
// SQL文を作る
$sql =  "SELECT  *  FROM users WHERE id = :id";
// プリペアドステートメントを作る
$stm = $pdo->prepare($sql);
// プレースホルダに値を格納する
$stm->bindValue(':id', $s_id, PDO::PARAM_INT);
// SQL文を実行する
$stm->execute();
```
2行目と4行目で、"SELECT  *  FROM users WHERE id = :id";というSQL文を用意しておき、
6行目では、先ほど用意したSQL文内の:idに変数$s_idの値が適宜代入されていく。

SQLを使用しデータを取得するとき、同じSQLを何度も行うことがあります。
先に変数として当てはめたSQL文を用意しておき、
そのあとに、変数に当てはめる値だけを送り、SQLを実行する。 
そうすることで、SQL文を繰り返し使うことができ、処理が効率的になる。  

<b>→このような仕組みがプリペアドステートメント</b>

SQLインジェクション対策として、SQL文のシングルクォートのような特別な意味をもつ記号文字を取り除く「エスケープ処理」を行う必要があり、プレースホルダにいったん値を格納することにより、エスケープ処理を自動で行ってくれるもの。

<b>→このような仕組みがプレースホルダ</b>

# まとめ
とにかくはっきりとイメージして、流れを理解することが大切ということでした。
頭の中で考えるだけでなく、実際に紙にフロー図を描くなどしてみると、
コードの流れもすぐイメージできるようになりました。

# おわりに
他にも悩んだものやつまづいたものありましたが、あげだすとキリがないので、
今回は特に気になっていた箇所について、備忘録として書かせていただきました。
これからまた時間があれば、書いていきたいと思います。
知識不足なところが多いと思いますので、ご指摘やこう考えればもっと分かりやすいよ！等ありましたらお願いします。
Windows10のLocal上でPostgreSQLをインストール

PostgreSQLのインストール方法をご紹介いたします！

#環境
Windows10 64bit
PostgreSQL 10.6




#ダウンロード
・環境サポートページ
<img width="740" alt="postgresSQL＿versionに必要なWindows環境.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/131895/7e62f8de-6379-c264-63fd-9b82f2cb7755.jpeg">


・ダウンロードページ
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
![postgresqlのダウンロードページ_赤マル追加.png](https://qiita-image-store.s3.amazonaws.com/0/131895/82cbd293-03b6-c632-a67e-2f553be7a8fd.png)


PostgreSQL11.1だと、Linux -32/64, Windows-32が対応しておりません(現時点2018/12/18)。
今回は、10.6のインストール方法を紹介いたします。
10.6のWindows x86-64の「Download」をクリックして、ダウンロードします。

#インストールの前に
・インストールする前に、PostgreSQLのセキュリティ権限対策として
CドライブのProgram files 配下に、新規フォルダ「Pg」を作成します。
中身は、空で結構です。


![ProgramfilesにPgフォルダを作成.png](https://qiita-image-store.s3.amazonaws.com/0/131895/8cd6c15b-8e69-5015-330a-0bfe63aca572.png)



・セキュリティ権限をフルコントロールに
赤丸で示したのですが、Pgフォルダのユーザーのセキュリティ権限をフルコントロールにします。
手順として、
(1)Pgフォルダに、右クリックをして、プロパティを表示させます。
(2)「セキュリティ」タブを開いて、グループまたはユーザー名(G): **Users(-----)**を選択します。
(3)アクセス許可を変更するには、[編集]をクリックします。　→　**編集**
(4)グループまたはユーザー名(G): **Users(-----)**を選択します。
選択後、アクセス許可(P):ALL の箇所に、「フルコントロール」の**許可**にチェックを入れます。フルコントロールの許可にチェックを入れると、自動的に「変更」にもチェックが入ります。
(5)フルコントロールが与えられているか、確認します。与えられていない場合、再度(1)-(4)を行います。

以降、フルコントロールにすることで、PostgreSQLにcsvやtsv等のデータをCOPYコマンドで、インポートする際に、errorが生じなくなります。



![Pgのセキュリティをフルコントロールに設定.png](https://qiita-image-store.s3.amazonaws.com/0/131895/e37ba601-ca0a-d4d7-80f4-64261e5ccf50.png)

![Pgのセキュリティをフルコントロールされているかの確認.png](https://qiita-image-store.s3.amazonaws.com/0/131895/0ed4d4e5-8538-d9e4-83d6-bbe54a5c39bb.png)


#インストール
・インストール立ち上げ
「postgresql-10.6-1-windows-x64.exe を起動
![postgresqlアイコン.png](https://qiita-image-store.s3.amazonaws.com/0/131895/166baa76-349b-565f-727c-be2d426582c9.png)

・セットアップの初期画面
「Next」を選択
<img width="343" alt="PostgreSetup.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/131895/bdf70656-3fbd-4dad-ad17-220ed9a776a4.jpeg">

・インストール先を設定
作成した、**Pg**ファルダに！
DataDirectも同様に**Pg**フォルダに。インストールします。


・セットアップの設定後インストール画面
<img width="344" alt="PostgreSQL_Setup.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/131895/547cb6c2-1db4-b650-e266-68541fa09d65.jpeg">

・引き続き、インストール画面（完了するまで、結構待ちます）
<img width="344" alt="postgresqlインストール2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/131895/bece2295-df9a-3bb8-9f36-ca48f5c46254.jpeg">

・インストールが完了画面(StackBuilderは必要に応じてなので、今回はチェックを外します)
<img width="345" alt="インストール完了画面.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/131895/0be55bc4-8bc8-e976-3fa9-4017085431e2.jpeg">



以上、簡単なご紹介です！
[FPGA] ARTY S7で電源を切っても回路を保持する方法

# はじめに
最近私は趣味のFPGA開発用に、Xilinx社のFPGAを評価するボード(ARTY S7、DIGILENT社)を用いているのですが、開発環境(Vivado)の初期設定では書き込んだ回路が電源を切るたびに消えるようになっています。書き込み速度も速く試作用途にはこれでもいいですが、他のマイコンみたいに保持してほしい状況も出てきます。
そこで、書き込んだ回路が電源を切っても保持されるようにする設定方法を紹介します。

# 開発環境
- OS : Windows 10 Pro ビルド 17134
- ソフトウェア : Vivado 2018.2
- 開発ボード : ARTY S7

# 方針
初期設定では、FPGAへの書き込み(コンフィグレーション)をPCから直接行っていますが、FPGAに書き込まれたデータは電源を落とすかFPGAをリセットすると消えてしまうため、上記の現象が発生します。
そこで、ボードに搭載されているSPIフラッシュメモリにコンフィグレーション用のデータをあらかじめ書き込んでおき、電源オン時やリセット時にそこからFPGAへのコンフィグレーションを行うように設定を行います。

# 方法
ここでは、既に書き込みたい回路のビットストリームを生成できる段階を想定しています。

1. [PROGRAM AND DEBUG]->[Generate Bitstream]を右クリックし、[Bitstream Settings...]をクリックして設定画面に入り、下画像のように[-bin_file*]のチェックボックスをオンにします（この.binファイルがSPIフラッシュメモリに書き込むデータになる）。
![sc01.png](https://qiita-image-store.s3.amazonaws.com/0/217478/5452606b-8850-ab40-4d03-29ec33acefa6.png)

2. [PROGRAM AND DEBUG]->[Generate Bitstream]をクリックし、ビットストリームの生成を行います。このあたりでボードをPCに接続しておきます。

3. [Open Hardware Manager]をクリックしマネジャーを起動したのち、[Open Target]->[Auto Connect]とクリックします。

4. [Add Configuration Memory Device]->[xc7s50_0]とクリックし、コンフィグレーションファイルを書き込むメモリを選択する画面を開きます。ここで、書き込むSPIフラッシュメモリは下写真の赤枠で囲ったチップになるので、そのチップのメーカーと型番を特定し、下の図のようにその型番を選択します（私のボードではこれを選択した）。
![sc02.jpg](https://qiita-image-store.s3.amazonaws.com/0/217478/54e8b504-934b-9db4-331a-e79ef38dea0b.jpeg)
![sc03.png](https://qiita-image-store.s3.amazonaws.com/0/217478/844317a5-1846-4207-367e-b5fbdb66104b.png)
[OK]クリック後にポップアップが表示された場合は[No]を選択して大丈夫です（再設定可能です）。

5. [Hardware]タブ内に、先ほど追加したメモリが表示されているので、そのうえで右クリックし、[Program Configuration Memory Device]をクリックして設定画面を開きます。
![sc04.png](https://qiita-image-store.s3.amazonaws.com/0/217478/fb2961df-62a1-4c9d-88a7-be9415b6a32f.png)

6. 下図のように設定します（チェックボックスはお好みで）。赤枠で囲ったところに先ほど作成した.binファイルを選択し、[OK]をクリックすることでプログラミングが始まります。少し時間がかかるので気長に待ちましょう。
![sc05.png](https://qiita-image-store.s3.amazonaws.com/0/217478/8ca94f42-93e1-3c05-df29-2909bc0fe6ed.png)

7. プログラムの書き込みが終了したら、一度ボード左上のPROGボタンを押します。

# まとめ
以上の方法で、FPGAボードに実装した回路を電源を切っても保持することができます。
おそらく他のARTYシリーズでも同様の方法が使えるので、そちらをお持ちの方も試してみてください。
僕が2018年にもっとも使用した、7つのChrome拡張機能

# はじめに
Chrome拡張機能って沢山ありますよね。
今回は2018年に僕がもっとも使用した、7つの拡張機能を紹介していきます。

## １．Awesome ScreenShot
この拡張機能は

- 縦長の画面のキャプチャーを撮ることができる
- コメントや図形などを入れることができる

今まではキャプチャーソフトを使っていましたが、縦長に関しては複数に分けてスクショしていました。
これを使用することで一度で終わらせることができるようになりました。

https://chrome.google.com/webstore/detail/awesome-screenshot-screen/nlipoenfbbikpbjkfpfillcgkoblgpmj?hl=ja


## ２．AdBlock
ついつい広告に目が行き、集中力を切らしてしまうことがあります。
それを防ぐための、広告ブロックをする拡張機能です。

https://chrome.google.com/webstore/detail/adblock/gighmmpiobklfepjocnamgkkbiglidom?hl=ja

## ３．The QR Code Extension
1クリックで現在見ているページURLのQRコードを作成できます。
プライベートではmacとiphoneでシームレスにページを表示できますが、仕事だと連携できません。
開発中の画面を実際の端末でみたい時などに、QRコード作成し、確認します。
これを入れていないときはURLを直接打つか、slackなどにURLをコピペしていました。

https://chrome.google.com/webstore/detail/the-qr-code-extension/oijdcdmnjjgnnhgljmhkjlablaejfeeb

## ４．ColorPick Eyedropper
ウェブページ上の色のカラーコードをサクッと取得できます。

https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg

## ５．WhatRuns
表示中のページで使用されているツール、スクリプト、プラグインなどを確認できます。
気になるサイトが何で作られているのか確認できます。面白いです。

https://chrome.google.com/webstore/detail/whatruns/cmkdbmfndkfgebldhnkbfhlneefdaaip

ちなみに、画像はQiitaのサイトで使ってみました。
<img width="551" alt="ã_¹ã_¯ã_ªã_¼ã_³ã_·ã_§ã__ã__ 2018-12-17 14.17.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/6a2eee0a-ea00-4e29-b3c9-b6bc65926e92.png">

## ６．Google検索キーボードショートカット
Googleで検索して、リンクを開く時、マウスを使っていませんか？
これを使用することで、検索やリンクを開くのをキーボードのみでできるようになります。
デフォルトのショートカットも使用することで、検索もマウスなしで可能になりそうです。

https://chrome.google.com/webstore/detail/google-search-results-sho/dchaandmcifgjemlhiekookpgjmkcelg

## ７．Mouse Dictionary
英単語がわからないときにササッと確認できる拡張機能です。
[Chrome拡張の高速な英語辞書ツールをつくりました(Mouse Dictionary)](https://qiita.com/wtetsu/items/c43232c6c44918e977c9)

https://chrome.google.com/webstore/detail/mouse-dictionary/dnclbikcihnpjohihfcmmldgkjnebgnj

# 最後に
今回紹介したものは僕が実際に使ってオススメができるものです。
ぜひ、一回試してみてください。
この他にも、こんな拡張機能がオススメだよなどがあれば、教えて頂けると嬉しいです。
Cloud Composerの（よく見るとドキュメントに書いている）注意点

早いもので、今年もうもう終わりですね。
様々な事件のあった2018年ですが、今年を象徴するニュースといえば、5月1日のCloud Composerのベータリリースでしょう。

という訳で、Cloud Composerに関して（よくドキュメント見ると書いている）注意点を書いてみました。



# DAGのタスクでない部分に重たい処理を書かない
https://cloud.google.com/composer/docs/how-to/using/troubleshooting-dags#dag_fails_only_on_the_airflow_webserver

Cloud ComposerというよりAirflowのプラクティスですが、DAGパース時に読み込まれる部分（i.e. タスクでない部分）には

- パースするwebserver（GAE）はマシンタイプを指定出来ない
- 重たすぎるとDAG読み込みが失敗する

ため、重たい処理を書かない方が良いらしいです。

# DAGのタスクでない部分からの、外部アクセスに気をつける
https://cloud.google.com/composer/docs/how-to/using/troubleshooting-dags#dag_fails_only_on_the_airflow_webserver

また、webserver部分とworker部分でサービスアカウントが違います（workerがGKE、webserverはGAEで動いてます）。
そのため、（可能なら）プライベートなデータへのアクセスは使わない方が良いらしいです。


# GCSをマウントしているディレクトリに注意
https://cloud.google.com/composer/docs/concepts/cloud-storage
/home/airflow/dags、/home/airflow/data、/home/airflow/plugin、/home/airflow/logsの４つのディレクトリは、
Cloud Stroage Fuseという機能で、

- ワーカーからは、普通のディレクトリのように見える
- 実態はGCS上のディレクトリ

として扱えます。

気をつけないといけないのは、普通のディレクトリのように **見える** ってだけで、ローカルのストレージではない点です。
詳しくは、[tora470さんの記事](https://qiita.com/tora470/items/34083ff2173e2f50d70d)などをご覧ください。


# アラートメールの出し方に注意
https://cloud.google.com/composer/docs/how-to/managing/creating#notification

Airflowには、DAG Runが失敗した時にメールを出す機能があります。
が、Cloud Composerではsmtp_passwordで認証するSMTPサービスが利用出来ないので、ご注意ください。
ドキュメント記載のSendGridを使用推奨のようです（[Googleの中のJamesさんの回答](https://stackoverflow.com/questions/50123519/how-can-i-setup-cloud-composer-to-send-email)）。


# バージョンに注意
https://cloud.google.com/composer/docs/concepts/versioning/composer-versions?hl=ja
何も指定しないと、Cloud ComposerのAirflowバージョンは1.9.0です（2018/12/17現在）。
Airflowのドキュメントの情報は1.10の場合が多いので注意しましょう。
Beta featuresを有効にすると、最新の1.10を使うことが出来ます。


# （ドキュメントに無い？）PythonOperatorにも重たい処理を書かない
これは個人的に思う注意点です。

DAGのタスクでない部分に重たい処理書いちゃだめですが、PythonOperatorにも重たい処理を書くのは危ないかもです。
理由としては、

- Cloud Composerのアーキテクチャでは、workerとAirflowのシステム部分（Redis、Scheduler）が、[同じクラスターで動く](https://cloud.google.com/composer/docs/concepts/overview)ので、[workerがメモリ使いすぎると、スケジューラーも不安定になる](https://groups.google.com/forum/#!topic/cloud-composer-discuss/lKsy7X1fy00) との報告がある
- 依存パッケージのインストールが面倒
    - [pip使えます](https://cloud.google.com/composer/docs/how-to/using/installing-python-dependencies)が、デフォルトインストールと衝突したり、pure pythonでなかったりすると…
- すべてのAirflowWorkerにすべてのDAGの依存パッケージが必要（コンフリクトの危険が高まる…）

[KubernatesOperatorを使うと](https://cloud.google.com/composer/docs/how-to/using/using-kubernetes-pod-operator#creating_a_node_pool)

- namespaceを指定できるので、Airflowのシステム部分とのリソース競合を避けられる
- Docker imageで、より楽に環境・依存設定を行える

と思います。

[世の中にはKubenatesOperator以外使うなという過激派](https://medium.com/bluecore-engineering/were-all-using-airflow-wrong-and-how-to-fix-it-a56f14cb0753)もいるらしいです。


# まとめ
（よくドキュメント見ると書いている）注意点、結構多いですね。
ドキュメントはよく読まないと…
ローカルからCloud SQLのDBに接続し、Laravelのマイグレーションを実行する

## はじめに
GCPにてCloud SQLのインスタンスを作成したものの更新方法がわからないと思います。
IPを登録し、直接DBにアクセスしSQLを流し込めばいけますがマイグレーションを実行したい場合は、`Cloud SQL Proxy`を使用します。

#### 参考記事
[公式 Cloud SQL Proxy を使用して MySQL クライアントに接続する
](https://cloud.google.com/sql/docs/mysql-connect-proxy?hl=ja)
※こちらに最初の手順は記載されています。

## 事前準備
### Cloud SQL API を有効にする
Cloud SQL Administration API を有効にして下さい。
[Cloud SQL Administration APIを有効にする](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin&hl=ja&_ga=2.122977033.-365537046.1534765018&_gac=1.92497519.1542155461.CjwKCAiAiarfBRASEiwAw1tYv7B1lfKHM28m2ZRZlAVesQBcw00FCJrqBBo8VSeIoF6z8H2dxPfoOhoCrXUQAvD_BwE)

## 作業手順
### 1. プロキシをインストールする
`cloud_sql_proxy`をインストールするのですがダウンロード先はホームディレクトリがオススメなのでホームディレクトリに移動してからダウンロードしましょう。

#### 1-1.ダウンロード
```bash
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
```
#### 1-2.実行権限の付与
```bash
$ chmod +x cloud_sql_proxy
```

### 2.TCPソケットを使用して接続
TCPソケットとUNIXソケットがありますがTCPソケットがオススメです。
`<INSTANCE_CONNECTION_NAME>` は以下の構成となります。
`プロジェクトID:CloudSQLインスタンスのリージョン:CloudSQLインスタンス名`

```bash
$ ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
```

### 3.DBへ接続
接続が完了したらターミナルを別タブで開きます。
Laravelのドキュメントルートに移動します。
色々と方法がありますが、一旦ここは`.env`の中身を一時的に書き換えます。
`DB_CONNECTION` `DB_HOST` はそのままで大丈夫です。
`DB_SOCKET`の指定は不要です。

```bash
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=CloudSQLのデータベース名
DB_USERNAME=CloudSQLのユーザー名
DB_PASSWORD=CloudSQLのパスワード
```

### 4.マイグレーションの実行
あとは実行するだけで完了です。
作業完了したら、プロキシを切断しましょう。

```bash
$ php artisan migrate
```
p5.jsで葉っぱの図形を書いてみた

p5.jsで葉っぱを描いたので、ご紹介いたします！

春夏秋冬を代表するモノ(桜、葉、紅葉、雪)を散らそうと思って、ググってみると葉っぱだけ見つからなかった…(私の知る範囲)

なので色んな記事を参考にして、作ってみました。参考になれば幸いです！
## サンプルソース
花や葉っぱを表現する関数”花葉曲線”を用いて作成します！
・[花の曲線を描く](https://sites.google.com/site/cinderellajapan/huanocg/huano-qu-xian)”

葉っぱ(葉脈除く)のソースがこちら！

```leaf.js
const w = 400;
const h = 400;
const n = 4;
const size = 100;
const bulge = 1.2; //葉の膨らみ

function setup() {
  createCanvas(w, h);
  background(0);
}

function draw() {
  background(0);
  const ox = w / 2;
  const oy = h / 2;

  push();
  noStroke();
  translate(ox, oy);
  beginShape();
  for (let t = 0; t < 360 / n; t++) {
    A = (n / PI) * radians(t);

    md = floor(A) % 2;

    r = pow(-1, md) * (A - floor(A)) + md;

    R = r;

    x = size * R * cos(bulge * radians(t));
    y = size * R * sin(radians(t));

    vertex(x, y);
  }

  endShape(CLOSE);
  pop();
}

```

![スクリーンショット 2018-12-15 12.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/314351/abb5e5e1-ba52-02ed-cc01-2bf703ac3e48.png)

　変数`bulge`をイジると、葉っぱが細くなったり、太くなったりします。お好みで調整してみて下さい！

でも、何か物足りない…そう、葉脈や茎っぽいやつ(葉柄というらしい)があってこその、葉っぱでしょう。

葉脈と葉柄を付け加えたソースがこちら！

```leaf.js
const w = 400;
const h = 400;
const n = 4;
const size = 100;

function setup() {
  createCanvas(w, h);
  background(0);
}

function draw() {
  background(0);
  const ox = w / 2;
  const oy = h / 2;
  let xmax;
  let ymax;
  const veins = 0.75; //葉脈の長さ
  const petiole = -0.25; //葉柄の長さ

  push();
  noStroke();
  translate(ox, oy);
  beginShape();
  for (let t = 0; t < 360 / n; t++) {
    const bulge = 1.2; //葉の膨らみ
    A = (n / PI) * radians(t);

    md = floor(A) % 2;

    r = pow(-1, md) * (A - floor(A)) + md;

    R = r;

    x = size * R * cos(bulge * radians(t));
    y = size * R * sin(radians(t));

    if (t == 45) {
      xmax = x;
      ymax = y;
    }

    vertex(x, y);
  }

  endShape(CLOSE);

  stroke(0); // 線の色
  strokeWeight(0.5); // 線の太さ
  line(0, 0, xmax * veins, ymax * veins);

  stroke(255); // 線の色
  strokeWeight(2); // 線の太さ
  line(0, 0, xmax * petiole, ymax * petiole);
  pop();
}

```

ソース内の`t=45`のときに葉脈の頂点が得られます。この頂点を起点に、線を引く感じです。

葉脈`veins`や葉柄`petiole`のパラメーターはお好みでご調整ください！


## 完成図
![スクリーンショット 2018-12-15 11.56.03.png](https://qiita-image-store.s3.amazonaws.com/0/314351/f7a92d42-9d8c-d75e-a6f2-6b969dd50441.png)


## 参考URL
- [誉桜に浪漫の嵐！へし切長谷部のためにp5.js(Processing)で桜吹雪を描く
](http://blog.livedoor.jp/reona396/archives/55673472.html)
- [Processing で描ける図形まとめ](https://qiita.com/reona396/items/5fa4babc8243c4ed4914)
バグレポートの改善

バグレポートを書くにあたっての心構え、フォーマットなどを記述する
開発とともにテスト工程を価値あるものとして進めることを考慮する必要がある



# Q. テスト実行において、良いテスターとは？
まず、テスターはどのようなマインドを持つべきかの質問。

```
ANSWER
1. バグを多く見つけた
2. 誰も見つけられないレアバグを見つけた
3. エンジニアに多くのバグを修正させた
```

個人的には "3" である
なぜならば、

```
品質とは、リリースされたサービスがユーザーに満足されることである
↓
ユーザーに影響のあるバグは出さないこと
↓
テスターは開発にバグの重要性を伝え、直すように働きかけないといけない
```

個人的に、このようなマインドをもってテスト実行、バグレポートを開発に出す必要がある。
<B>テスターは品質の状態を伝えるのが仕事であり、品質を作り上げるのはエンジニアである</B>からである。

# バグレポートでの出来事（たぶんフィクションです）

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f760d49f-f2e7-69dd-a465-22074d40a61e.png" WIDTH=80%>

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/99d5f974-3449-433d-2ae6-09a29662d78e.png" WIDTH=80%>



# バグレポートの必要要素
バグレポートをエンジニアに報告するとき、<B>エンジニアが短時間で状況を把握し、そのバグを直すように働きかけ、バグ修正に必要な情報がそろっている</B>内容であることが望まれる。


<TABLE BORDER=1 WIDTH=100%>
<TR><TH nowrap="nowrap" width="40%">1.再現（発生頻度）</TH><TD>バグがどの確率で発生するかを示す。（５回中５回発生するのか、まれに発生するのか）
エンジニアがバグの再現をするときに、発生頻度が低い場合バグ出ないと誤判断してしまう。
</TD></TR>
<TR><TH nowrap="nowrap">2.分離（原因特定）</TH><TD>一つのバグに対しテスト条件を変えてテストする。
そこからバグの原因につながるような情報（限られた条件で発生する等）を導き出す
</TD></TR>
<TR><TH nowrap="nowrap">3.一般化（影響範囲）</TH><TD>一つのバグに対して類似した処理が同様のバグを含んでいないかを確認する</TD></TR>
<TR><TH nowrap="nowrap">4.比較</TH><TD>旧バージョンのシステム、別の環境（iOS、Android等）で見つかったバグの再現性を確認する
今回のバグがデグレ、特定環境でのみ起きる、既存バグであるかを確認することで、開発の対応判断の助けになる
</TD></TR>
<TR><TH nowrap="nowrap">5.要約</TH><TD>バグの内容を簡潔に、いろいろなステークホルダに理解できるようにまとめる。
バグ報告、分析等を行いやすくする</TD></TR>
<TR><TH nowrap="nowrap">6.凝縮・明確化</TH><TD>不必要な情報、あいまいな情報を削る。
報告されたバグの内容から発散しないように、誤解を招かないようにする
</TD></TR>
<TR><TH nowrap="nowrap">7.中立化</TH><TD>中立の立場からバグを客観的に報告する。
プログラマ、システムの実装、コーディングの非難、バグ改修内容の提案などは避ける
</TD></TR>
<TR><TH nowrap="nowrap">8.プライオリティ</TH><TD>バグの重要性、優先度を定義する。
このバグにより、ほかのテスト活動に影響の有無を伝える（例えば、これがブロッカーとなりほかのテストが実行できない等）
また、このバグによりビジネスリスクがどの程度あるかを伝える
</TD></TR>
</TABLE>

# バグレポート

## バグレポートフォーマットのサンプル
```
【Priority / 優先度・重要度】 

【Issue / 事象】 
 
【Expected value / 期待値】 
 
【How to repro / 操作手順】 
 
【Test date / テストデータ】 
 
【Frequency / 発生頻度】 
 
【Environment / 環境】 
 
【Discovery time / 発見時刻】 
 
【Discoverer / 発見者】 
 
【Remarks / 備考】 

```

## 実際のバグレポートのサンプル
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/cffd8914-19f7-8f8a-79b6-da536623d8ea.png" WIDTH=100%>
pythonの三項演算子を配列で置き換える

AtCoderの解答を見ていてよく目にするが、なかなか自分でかけないのでメモ。

```python
['b', 'a'][c >= 10]
# ↑は↓と同じ
'a' if c >= 10 else 'b'
```

`c >= 10`の部分はTrue/Falseを返す条件文になっていれば良い。
条件文の結果はTrue/Falseになるが、これを配列のインデックスとして用いることで1/0の位置にある値を取り出すことができる。
「ゴリラチャット作りました」から動物クソアプリのアイディアを連想しよう

@gorilla0513 さん

>Goとvim好きなITプロゴリラ


[ゴリラチャット作りました - Qiita](https://qiita.com/gorilla0513/items/3828378f92103cba0ab0)

[クソアプリ2 Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/kuso-app2)

# 人見知りのための猫アプリ

高いところにあるモノが取れない時に、最高のジャンプ方法や角度を計測してくれる超高精度アプリ

iPhoneのARメジャーアプリみたいなイメージで

# 彼氏・夫に愚痴るための全国相互補助会 ライオンアプリ

ライオンはメスが狩りをするという

その愚痴を言うためのアプリ

彼氏、夫の愚痴以外は通報システム、もしくはBigData的な何かのアルゴリズムで排除

# スキンケアに気をつけたくない人のための象アプリ

皮膚を固くするためのアプリ

紫外線の日照時間、肌に悪いスキンケア商品、湿度の低い時間帯などを自動的にお知らせする

美肌を作りたい人は反面教師にすること


# うさぎの寂しさを紛らわすためのアプリ

ゆるぼ

# たぬきが本当に返信するためのぽんぽこ合戦アプリ

ゆるぼ

# 金魚鉢アプリ

ゆるぼ

# アジフライは体に良いって嘘つくなよ！ アプリ

ゆるぼ

# カマキリは1万個の卵を生む！ アプリ

ゆるぼ

# アイディアなくしてアプリなし

サービスもまたしかり。

# サービスアイディアを思い浮かべる練習をしよう

練習なくして上達なし。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
電気料金の診断APIのご紹介とやったことのまとめ

こんにちわ、@amemoleeです。今回は自社サービスのAPI紹介とやったことのまとめをしたいと思います。急遽ではありますが[「国産Web API Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/apijp)の7日目(が空いていたので)にエントリーにさせていただきます！

# 弊サービスのご紹介
弊サービス([@enegaeru](https://www.enegaeru.com/)(エネがえる))では、電力小売り、太陽光、蓄電池、などを家庭に導入する際のサポートができる住宅用の電気料金の診断APIを開発・提供しております。さまざまな企業様といっしょに、みんなでエネルギー業界に貢献できるサービス運営を目指しております。

# 弊サービスAPIの紹介：「電気料金プラン診断API」
大きく２つの機能で公開しています。まずは「電気料金プラン診断API」です。

* 国内2000超の電気料金プラン(低圧)からユーザーに最適なプランを診断できます。
* 事前に登録した世帯, 診断開始月, 電力事業者の情報をもとに、買電量を推計し、指定期間の月別電気料金の診断を行います。
* 診断結果はJSON, TSV, Excelレポートの3種類のフォーマットで取得することが可能です。

# 弊サービスAPIの紹介：「太陽光・蓄電池導入効果診断API」
つづいて「太陽光・蓄電池導入効果診断API」です。

* 住宅用太陽光蓄電池の長期経済効果を診断できます。
* 事前に登録した情報をもとに、買電量・太陽光発電量・太陽光自家消費量・蓄電池充放電効果・売電量を推計し、指定期間の月別電気料金の診断を行います。
* 診断結果はJSON, TSV, Excelレポートの3種類のフォーマットで取得することが可能です。

# 弊サービスAPIの使い方
弊サービスのAPIの使い方は、弊サービスホームページ内にある、APIドキュメントやFAQをご覧ください。

* [Developer Portal](https://www.enegaeru.com/partner/)。
* [API Document](https://developer.enegaeru.com/api/ja/)。APIをキーがある方は、お試し実行していただけます。
* [Help Center](https://faq.enegaeru.com/api%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6)(FAQ)。

# B2Bのお客さま向けのドキュメント
公開する情報とは別に、APIマニュアルをワードでも整備しました。こちらはご契約をされた企業様にのみ公開させていただくようにしました。やっぱりワードは便利！

# カスタマーサクセス
ご利用いただいているお客さまのご要望をもとに、日夜改善を行っております。

# Web媒体の利用
今回、弊サービスでは、[「KDDI IoTクラウド API Market」](https://iot.kddi.com/services/iot-cloud-apimarket/)と[「Rakuten Rapid API」](https://api.rakuten.co.jp/)と[「APIBank」](https://www.apibank.jp/ApiBank/)の3つの媒体に公開させていただいています。※説明は簡略。

* KDDI IoTクラウド API Market: 様々な公開されたAPIを使うことができるAPIマーケットプレイスです。弊サービスAPIは[こちら](https://iot.kddi.com/services/iot-cloud-apimarket/#cat-energy)で公開されています。

* Rakuten Rapid API: 世界中からAPIを公開・利用ができるグローバルなAPIマーケットプレイスです。Qiitaにも解りやすいやってみたブログがあります([RakutenRapidAPIを使ってみた](
https://qiita.com/sunocos/items/0fa0d990b63ffd1631fb))が、最近は日本語マニュアルも充実してきているようです。弊サービスAPIは[こちら](https://api.rakuten.net/search/enegaeru)で公開されています。

* APIBank: 無料・有料のAPIが陳列されたAPIポータルです。弊サービスAPIは、[こちら](https://www.apibank.jp/ApiBank/api?searchKeyword=enegaeru)で公開をすすめています(12/20公開完了!!)。


# おわりに
弊サービスで公開してい電力小売り、太陽光、蓄電池、などを家庭に導入する際のサポートができる住宅用の電気料金の診断APIを試行錯誤して公開した話を交えてご紹介させていただきました。さまざまな企業様といっしょに、どんどん利用が増えてどんどんエネルギー業界に貢献できれば幸いです。
「月数100万アクセスをDB使わず超簡単にさばく」で思い出した、月間最高100万円近く稼いだGGI掲示板サイト。

[月数100万アクセスをDB使わず超簡単にさばく - Qiita](https://qiita.com/Hisashi_vc/items/a50b49ad6a75d51c880a)

@Hisashi_vc さん

>じぶんコインという「3秒でコインになれる」プレゼンをあげたり貰ったりして応援者を増やすサービスを、個人で開発しました。 じぶんコイン https://crypto-app.tokyo/qCoin/?m=hisashi_vc

# メビウスリング掲示板

http://mb2.jp/

- 10年ぐらい個人事業主として営業していた。今も一応稼働中。
- 中身はレガシーの神によって構築されているツギハギだらけのハウルの城的なサイト。
- GoogleAdsenseで一番良い時は100万円近くの収益があった。経費はほぼサーバー代だけなので、ほぼ純利益。
- KentWebの WebPatio というフリー配布のCGI掲示板を改造しながら使い続けていた。
- SSL？なにそれ美味しいの？

[WEB PATIO : KENT-WEB CGI/Perl フリーソフト](http://www.kent-web.com/bbs/patio.html)

# データの保存はファイルに直接記入でDBは使っていなかった

- データをダイヤモンド `<>` で区切る形式で、当時はよく使われていたような
- ただのテキストファイル
- Shift_JIS で保存する仕様だったので途中でエンコードが大変になった

こんな感じ

```
記事名<>記事番号
投稿者名<>メッセージ<br>メッセージ<br>メッセージ<>投稿時刻
投稿者名<>メッセージ<br>メッセージ<br>メッセージ<>投稿時刻
投稿者名<>メッセージ<br>メッセージ<br>メッセージ<>投稿時刻
```

[yumainaura自営業 - Google Search](https://www.google.co.jp/search?q=yumainaura%E8%87%AA%E5%96%B6%E6%A5%AD&oq=yumainaura%E8%87%AA%E5%96%B6%E6%A5%AD&aqs=chrome..69i57.4640j0j7&sourceid=chrome&ie=UTF-8)

# あわせて読みたい

[三国志NETの設計を振り返ってみる - Qiita](https://qiita.com/askyq/items/601fe9e85fd888b7b4cd#_reference-ab21a4518b68acff449f)

[メビウスリングyumainaura - Google Search](https://www.google.co.jp/search?q=%E3%83%A1%E3%83%93%E3%82%A6%E3%82%B9%E3%83%AA%E3%83%B3%E3%82%B0yumainaura&oq=%E3%83%A1%E3%83%93%E3%82%A6%E3%82%B9%E3%83%AA%E3%83%B3%E3%82%B0yumainaura&aqs=chrome..69i57.2837j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JavaScriptのArray.mapでcontinueしたいけどできないのでreduce使おうとしたが使わなくて良かった話

Array.mapを使ったループ処理の中である要素の処理を飛ばしたかったがcontinueは使えなかった。
調べるとreduceでやれってことだったが中々理解しにくかったので取り合えず自分用にメモしておく。
以下はmapでの（上手くいかなかった）実装と、それをreduceに置き換えたもの。
処理としては整数の入った配列による入力を受け取り、偶数のものだけを配列として返す。

**filterを使えば簡単だった**

## filterを使った処理
```javascript:filter.js
const array = [1, 4, 9, 16];
const result = array.filter(x => x%2===0);
console.log(result);
```

```javascript:返却値
> Array [4, 16]
```

## filterを使った処理（冗長なの）
```javascript:filter.js
const array = [1, 4, 9, 16];

const map = array.map(x => {
  if (x%2===0){
	  return x;
  }
}).filter(x => x);

console.log(map);
```

```javascript:返却値
> Array [4, 16]
``` 

以下、filterを知らない時のあがき

## mapを使った処理
まずは偶数とか関係なしにmapからarrayの中身を順次returnで返却するもの。

```javascript:map.js
const array = [1, 4, 9, 16];

const map = array.map(x => {
  return x;
});

console.log(map);
```

```javascript:返却値
> Array [1, 4, 9, 16]
``` 

偶数だけ返したいのでとりあえずifつけてreturnのみで返してみる。

```javascript:mapで偶数だけ返したいがこういうことじゃない.js
const array = [1, 4, 9, 16];

const map = array.map(x => {
  if (x % 2 === 0){
    return x;
  }
});

console.log(map);
```

```javascript:返却値
> Array [undefined, 4, undefined, 16]
```

次にとりあえずcontinueで返そうとしてみる。

```javascript:mapにcontinueをとりあえず記入した奴.js
const array = [1, 4, 9, 16];

// pass a function to map
const map = array.map(x => {
if (x % 2 !== 0){
  continue;
}
  return x;
});

console.log(map);
```

```javascript:返却値
Error: Illegal continue statement: no surrounding iteration statement
```
もちろん怒られる。

## reduceを使った処理
reduceでは引数にコールバック関数と初期値を渡す。
mapから単純に置き換える場合は以下のような感じ。
mapをreduceで置き換え。
accumulatorなる現在の累積値を示す変数を追加。
初期値を空の配列に（return後の部分）。
if条件でcurrentValue（現在処理している値）が偶数の場合、accumulatorにpush。
accumulatorをreturnする。

```javascript:reduce.js
const array = [1, 4, 9, 16];

const reduce = array.reduce((accumulator, currentValue) => {
  if (currentValue%2 === 0) {
    accumulator.push(currentValue);
  }
  return accumulator;
}, []);

console.log(reduce);

```

```javascript:返却値
> Array [4, 16]
```
これを求めていた。
この辺りの説明はMDNが一番詳しく、同じような例も挙げられていた。
reduce自体に慣れておらず完全に理解しているとは言い難いが、上記で一応求めていた動作をする。
そんなアホなことしないでも別の方法があるのに…って時はぜひ教えてください。

## 参考
[MDN web docs - Array.prototype.reduce()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
[MDN web docs - Array.prototype.map()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
[stack over flow - How to skip over an element in .map()?](https://stackoverflow.com/questions/24806772/how-to-skip-over-an-element-in-map)