OmniAICreator/Qiita-1.07M huggingface dataset:
【速報】Watson Discoveryが日本語ニュースを提供開始！ & Collectionの作成メニューで「Japanese」復活！


執筆時点:2018/07/31) 
Watson Discovery関連をフォローされている皆様に取り急ぎのお知らせです。

# 日本語ニュースの提供開始！
[Release Note](https://console.bluemix.net/docs/services/discovery/release-notes.html#release-notes)によると、先般の日本語フルサポートに引き続き、今度はWatson Discovery Newsで日本語ニュースの提供が開始されました。

> 30 July 2018 - Released IBM Watson™ Discovery News in one additional language: Japanese (collection_id: news-ja). IBM Watson™ Discovery News is also available in English, Spanish, German, and Korean.

Discovery Newsで「Japanese」を選ぶと現時点で110万件のニュースが登録されています。エンティティなどのメタデータも抽出されてますね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ba45f259-b0cf-27c9-50e2-c22354629855.png)

こんな感じで日本語の検索に日本語のニュースがヒットしました。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d334e7b0-692f-0d30-afcd-d3b970135d33.png)

ニュースの保有期間は60日。日本語ニュースでは毎日17000件の記事が更新されるそうです。[ドキュメント](https://console.bluemix.net/docs/services/discovery/watson-discovery-news.html#watson-discovery-news)

>Historical search is available for the past 60 days of news data. 

>Discovery News Japanese is updated with approximately 17,000 new articles daily. 

日本語ニュースが利用できることでDiscoveryのユースケースが広がりますね！:thumbsup:

:triangular_flag_on_post: Discovery Newsは無料のライトプランでは１カ月あたりに 200 件のニュース**照会**[^1] まで実行できます。アドバンスト･プランでは無償枠を超えると1件あたり$0.10 USDかかりますので頻繁に使う場合はご留意ください。詳しくはカタログを参照。[^2]

[^1]: 「ニュース照会」はQueryのことです。Queryで結果が何件ヒットしても1回は１回です。
[^2]: Discoveryは2018/08/01から価格変更を予定しています。詳しくは[Watson_Discovery_利用料金変更のお知らせ](https://www.ibm.com/blogs/solutions/jp-ja/pricing-changes-watson-discovery/)を。

# コレクションの新規作成時の「Japanese」メニュー選択が復活！
細かい話で恐縮ですが、リリースノートに書いてないのでついでのお知らせです。日本語コレクションの「**新規作成**」に関して、サービス開始当初はメニューから「**Japanese**」を選択できていたのが2017/11に急にできなくなり、APIで定義する羽目になってご面倒をおかけしていました。こちらも**先週末(2018/7/29)からメニューが復活**しています。

要はいちいちCurlとかでAPIたたかずともメニューから作れます！

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b8b487c2-aca3-fa21-11ac-a115cd26f4ea.png)

操作はこんな感じです
![discivery_jp_collection.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/31fc0a89-b2f3-4b64-6f86-d90d719beb8c.gif)

ネット上のDiscovery入門記事では「CollectionはAPIで作る」ように書いてあるものもある[^3]と思いますが、もうその考慮は不要です！

[^3]: [私の記事](https://qiita.com/ishida330/items/b823d7c5b55806f04242)は直しました。

以上、2018/7/31時点での取り急ぎのお知らせでした。(以前の記事の上書き/更新すると見逃される恐れがあると思ったので、別投稿にした次第です）
Struts2 + AjaxでGETするメモ

# はじめに
完全にただのメモ
画面遷移させずにデータ取ってきたりとかするときに使ってます

# 環境
Struts2.0.11.2(古すぎ･･･)
Java 8(古･･･)

# コーディング

### JSP

```html:sample.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<input type="button" value="送信" onClick="getSampleData();" />
```
```html:jsonArray.jsp
<!-- レスポンスはこうやって受け取らなきゃいけないのか･･･？ -->
<%@ page language="java" contentType="text/javascript; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="jsonArray" escape="false"/>
```

### JavaScript(Ajax)
```javascript:sample.js
function getSampleData() {
  new Ajax.Request("GetSampleData.action", {
    method : 'GET',
    onSuccess : function(res) {
      var arr = JSON.Parse(res.responseText);
      arr.forEach(function(data){
        console.log(data.id + ":" + data.name);
      }
    },
    onError : function() {
      console.log("Error");
    },
    onComplete : function() {
      console.log("Complete");
    }
  })
}
```
### struts.xml
```xml:struts.xml
<action name="GetSampleData" class="PATH.BuildSampleData">
  <result>PATH/jsonArray.jsp</result>
</action>
```
### Action Class
```java:BuildSampleData.java
package hogehoge.fugafuga

import java.util.ArrayList;
import net.sf.json.JSONObject;

public class BuildLoginData {
  private ArrayList<JSONObject> jsonArray = new ArrayList<JSONObject>();

  // Actionメソッド指定なしだとexecute()が呼ばれる
  public String execute() throws Exception {
    JSONObject tarou = new JSONObject();	
    tarou.put("id", 1);
    tarou.put("name", "tarou");
    jsonArray.add(tarou);

    JSONObject hanako = new JSONObject();	
    hanako.put("id", 2);
    hanako.put("name", "hanako");
    jsonArray.add(hanako);

    return "success";
  }

  public ArrayList<JSONObject> getJsonArray() {
    return jsonArray;
  }

  public void setJsonArray(ArrayList<JSONObject> jsonArray) {
    this.jsonArray = jsonArray;
  }
}
```

# 感想
サーバーからのレスポンス受け取った時、jspを用意しておかないといけないのがめんどくさい。
他にやり方があるのかな･･･？
図 > 複数のソフトのフラグ変更タイミング

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft PowerPoint 2016
```

### 要望

- 下記の資料の作成
    - 複数のソフトウェアの動作を一覧
    - フラグのON,OFFタイミングを一覧

箇条書きの文章が並んだ状態よりは分かりやすく、かつ、資料作成に手間をかけすぎないこと。

### 案

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/66e12c9e-79da-ace0-16a8-ca38b43a66e4.png)

- 下記項目に実際の名前を入れて使う
    - ソフト名
    - フラグ名
    - XXX

今回はPowerPointで作成した。
draw.ioやGoogleドキュメントなどで作ってもいいだろう。

PowerPointは位置調整時のガイド機能が便利ではある。
BigQueryの新しい機能 備忘録

BigQueryは、どんどん新しい機能がリリースされる。
でも、時間ができたら後からためそー、と思って大体忘れるので簡単にここに書いておく。

したがって、随時追加されるのである。基本的には上にある方が新しいのである。
（記述に誤りや誤解があればご指摘いただきたいのであります。）

また、それぞれの機能が、GA、アルファ、ベータなのかは、ご自身で都度ご確認ください。
(たぶん上のほう大体ベータ)

# Scheduling queries
BigQueryの機能として、クエリが定期実行できる（はず）機能。
まだ実際に利用していないのでドキュメントを読んだ限りですが。。

GAEのcronなどでクエリを定期実行していたものなどはこちらにリプレースするとシンプルになるのかもしれない。
実行したクエリの結果は、パーティションテーブルを含めたテーブルへの出力が出来るようなので整形処理のクエリなども実行できそう。

# ML
https://cloud.google.com/bigquery/docs/bigqueryml-intro

その名の通りBigQueryでSQLで機械学習処理が実行できる。
今は、使えるアルゴリズムが限られているが、BigQuery上からデータを動かすことなく処理が回せるのはかなりメリットと思われる。

現時点で使えるアルゴリズム（どんどん追加されていきそうです）
- Linear regression
- Binary logistic regression
- Multiclass logistic regression for classification

また、Predictionの結果をサクッとDataStudioで見れるところも便利。

9/20に東京リージョンでも使える様になったみたいです。

# GIS : Geographic Information Systems

位置情報(緯度/経度、ポリゴンなどのGeo情報)を扱うのに便利な　[関数群]　が使える。
位置情報を分析する場合はかなり便利。
(https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions?hl=ja)が

そして、なんと可視化ツールまでついてくる。
https://bigquerygeoviz.appspot.com/?hl=ja

# Clustered Table
https://cloud.google.com//bigquery/docs/clustered-tables

> Clustering can improve the performance of certain types of queries such as queries that use filter clauses and queries that aggregate data.
(略)
> These values are used to organize the data into multiple blocks in BigQuery storage. When you submit a query containing a clause that filters data based on the clustering columns, BigQuery uses the sorted blocks to eliminate scans of unnecessary data.

とあります。
つまり、よくフィルタリングや集計に使うカラムがあるテーブルの場合、そのカラムを指定してClustered Tableuを作っておくとパフォーマンスが良くなるらしい。

# Google Play Transfers
Google Playの各種データが取れるはず。アプリのDL数とかこれでカウントする。
通常GCSに吐かれる同等のデータをコピーしてロードする必要があるので楽になるはず。

（iTunes ConnectのデータもTransferできないかなぁ。。。あっちのほうがめんどい）

# MERGE statement
> A MERGE statement is a DML statement that can combine INSERT, UPDATE, and DELETE operations into a single statement and perform the operations atomically.
対象テーブルにデータがない場合は```INSERT```、ある場合は```UPDATE```ってのを単一ステートメントで実施可能な ```MERGE``` 登場。

BigQueryに格納するデータのソースが更新されうるデータであることが多く（されないってほぼない。。）
データボリュームが増えてくると差分更新戦略を取らざるを得なくなる。

こいつで楽ちんにBigQuery上のテーブルを差分更新できるといいなと思ったりする。
でも、クォータに引っかかりそう。。。？

# Column-based Time-partitioned Table
https://cloud.google.com/bigquery/docs/creating-column-partitions

これまでは、[データ挿入日付によるパーティショニング](https://cloud.google.com/bigquery/docs/creating-partitioned-tables)しかできませんでした。
この機能により既存の任意のTIMESTAMP型のカラムをパーティショニングに利用することができます。

これができるようになることで、これまで　```_PARTITIONTIME``` で指定する必要があったのですが、
指定したTIMESTAMP型カラムを使って自然な？クエリでパーフォーマンスを出すことができます。

一般にエンジニア以外のメンバなどにクエリを発行してもらう際にいわゆる「溶ける」リスクが減ると思います。
あと、Tableauでは、```_PARTITIONTIME```　これが使えない（と思っている）ので、そちらでも効果的です。
lazuriteでanalogread

#概要
lazuriteでanalogreadやってみた。

#写真

![CIMG2670.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c65b1674-5dbd-6f9e-3bc7-81e32d49e8e3.jpeg)


#回路図

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/e8e7f6fc-29a5-4573-7031-67897c082bcb.png)

#サンプルコード

```
void setup()
{
	Serial.begin(115200);
	analogReadResolution(12);
	hsv.init(1, 20000);
	hsv.attach(0, 5);
	hsv.write(0, 800);
	hsv.start();
	Serial.println("start");
}
void loop()
{
	volatile int val = analogRead(A2);
	int range;
	range = map(val, 0, 4095, 500, 2400);
	Serial.println_long(range, DEC);
	hsv.write(0, range);
	hsv.update();
	delay(500);
}
```


以上。
HTML5

・tsconfigにwebsql追加
https://stackoverflow.com/questions/44385151/angular-2-websql-typings
# DB/Strage
# WebSQL
# Web DB
http://blog.himawari-dream.com/archives/2010/07/html5-web.html
https://html5experts.jp/shumpei-shiraishi/22923/

#SessinoStrage
タブ間共有
https://qiita.com/Meeracker/items/e9233db7a2b1fef02f7e
言語設定を英語にした生活

Web業界、IT業界にいると英語に触れることはさけられません。
デザイナー・エンジニアとして普段Webサイトを作っている自分も以下の様なシーンで英語を使ったり読んだりします。

- ライブラリの最新のドキュメントが英語
- JavaScriptのエラーメッセージが英語
- CSSのクラス名を英単語でつける

でも、生粋の日本語ネイティブ@日本である自分は、そもそも上記のような作業をする時くらいしか英語に触れる・使う機会がありません。
そこで、もっと英語に慣れるために、英語を使う機会を自分でつくることにしました。

# OSとかアプリとかサービスとかの言語設定を英語にした

基本的はこれだけ。
普段使っているアプリとかサービスは大抵どこにどういう機能があるかわかっているので言語設定が英語になっても感覚で使えるし、英語に触れるというハードルとしては低いと思います。

## 😄良かったこと

### 👍英語を読むことのハードルが下がった

ドキュメントが英語しかない、というケースでも構えることがなくなった。
結局Google先生とかに翻訳お願いしたりしながら読むんだけど（Google先生様様）気持ちの中でのハードルはなくなる。

### 👍英語UIのみのサービスとかも使いやすい

新しもの好きとしては、使いたいサービスが日本語化されてないケースは良くあること。

### 👍ググる力あがる

特に制作周りの問題の解決方法とか探す時、英語圏の情報も読めるようになる。
あと一番大きいのは、英語で検索できるようになること。
普段、英語UIに触れてれば、自分が求めるに情報に関連する英単語とかも自然に出てくる。

## 😓悪かったこと

### 英語を話せるようにはならない。

基本読んでるだけなので、当たり前。
WSL Bashでファイル（フォルダ）をnotepad.exeで開く




久々のQiita投稿です。淫夢記事しか投稿してないのはまずいかなと思って、まともな記事を1つシェアさせていただこうかと思いました。

今回は、Windows 10のWSL Bashでファイルをnotepad.exeとして開く方法になります。もちろん、notepad.exeじゃなくても開けます。atomでもsublでも。やり方は同じです。

以前僕のブログで紹介した方法とほとんど同じ内容というか簡易版なんですけど、簡潔な分分かりやすいかと。

[WSLのbashからWindowsの実行ファイルを実行する | yuipro](https://yuis-programming.com/2018/06/19/wsl%e3%81%aebash%e3%81%8b%e3%82%89windows%e3%81%ae%e5%ae%9f%e8%a1%8c%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b/)

## 手順

```sh

# # notepadの位置を確認
$ which notepad.exe
/mnt/c/Windows/System32/notepad.exe

# # ファイルと中身を作成
$ cat > _tmp.txt
hoge

# これでもいいのですが…
$ realpath _tmp.txt
/home/user/lib/_tmp.txt

# WindowsならEverythingという便利ツールがあります。
# Everythingで_tmp.txtを検索して、出来てた結果をctrl+shift+Cでフルパスをコピーすることが可能です。
# => C:\Users\User\AppData\Local\lxss\home\user\lib\_tmp.txt

# こうじゃなくて…
cmd.exe /C "/mnt/c/Windows/System32/notepad.exe" '/mnt/c/Users/User/AppData/Local/lxss/home/user/lib/_tmp.txt'

# こう。
# /mnt/ => C: へ変更するのを忘れずに。
cmd.exe /C "C:/Windows/System32/notepad.exe" "C:/Users/User/AppData/Local/lxss/home/user/lib/_tmp.txt"
```

![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_4f717632-b91a-4142-8594-b998339734c0.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_4f717632-b91a-4142-8594-b998339734c0.png)

## 蛇足

わぁい`alias`。あかり`alias`大好き。

```sh

# aliasしておくと便利だよ。
# notepadの場合
alias execnotepad='cmd.exe /C "C:/Windows/System32/notepad.exe"'
execnotepad "C:/Users/User/AppData/Local/lxss/home/user/lib/_tmp.txt"

# Atomの場合
alias execatom='$(cmd.exe /C "C:/Users/$(cmd.exe /c "echo %USERNAME%" | sed -e 's/\s//g')/AppData/Local/atom/bin/atom")'
execatom "C:/Users/User/AppData/Local/lxss/home/user/lib/_tmp.txt"
bash: C:/Users/User/AppData/Local/lxss/home/user/lib/_tmp.txt: そのようなファイルやディレクトリはありません
# my gosh… aliasだと無理っぽかった。
```
Qiita—昔の記事に「いいね」が付くたび更新・ブラッシュアップしてみよう　

# 提案 - Issue -

いいねが付く記事は、**有用な記事。誰かの役に立っている記事** のはずだ。
なので定期的に見直してブラッシュアップすれば、さらに役立つ記事になることだろう。

「いいね」が付くたび、記事の見直しをする習慣を作ってみるのはどうだろうか。

「そもそも役に立っている記事」の内容がさらに磨かれるわけだから、人に役立つという意味ではコストパフォーマンスはかなり高いはずだ。

# トリガー

たとえば「いいね5回毎に更新する」とか「いいねをきっかけにして、自分が気になったら更新する」とか、引き金は何でも良いと思う。


# ブラッシュアップ事例

ここでは自分の記事の中から「[ド素人のための Travis CI の使い方](https://qiita.com/YumaInaura/items/8021d38cb202950fb18c)」 を例にする。
(1ヶ月に1回ぐらい、じわじわといいねが付く記事)

## 例. タイトルを変える

「より見栄えがするように」「自分で言葉の響きが気に入るように」「より”スティッキー”に(耳に残りやすいタイトルに)」「ググりやすいキーワードを入れる」など、どんな基準でも。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/55b044ef-d0e6-b278-3a7e-7cebe366b4c6.png)

## 例. 画像を変える

分かりやすいものに差し替える。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/61c18c79-16de-aa04-9c12-540196b4105e.png)

## 例. 誤りを訂正する

Qiitaの編集リクエストは意外と使われない。

いいねが定期的に付いている記事でも、意外に根本的な誤りが残っていたりすることもある。
(他の人の記事でもそういう事例を見たことがあり、恐る恐る編集リクエストを出した経験がある)

自分で直そう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b549f9e1-4743-085a-1b10-4af9ddafd1d7.png)

(おそらく「いいね」がたくさん付いている記事ほど「まさか誤りがあるはずはない」という心理も働き、指摘しにくくなるのではないだろうか)

## 例. 補足を追加する

弱い部分に挿し木をする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d8d9bc28-16c7-d839-019a-74f00b4345ad.png)

## 例. 表現や言い回しを変える

「はじめての人が読んだら分かりにくいだろうな」とかいうところを直す。

ひさびさに自分の記事を見た自分は、ある程度「他人の目」になって、客観視できる状態になっているはずだから、チャンスだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9e1950df-80cb-e21c-014f-77b41acc6094.png)

# 例. 面白くする

本題とは関係ない部分で、ちょっとだけテイストを加えたりして、読み物として面白くする。

ほんの微妙な言い回しを加えるだけでも、テイストが違ってくる。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5768e546-939b-320a-5f63-2d1d5e378f02.png)

### 関連記事

トピックが違うけど、ノリとしてはこんな感じ。

>ユーザーが何か行動をできると「サイコ〜」や「オッケー！」というような褒め言葉が表示されます。

>それを苦なく続けてもらうために「褒める」という行為をする、ということだと思います。さすが任天堂。配慮がすごい。

[Webアプリを作る人へ！UIの重要性 ~Webサービスをもっと使ってもらうには？~ - Qiita](https://qiita.com/Yahirrro/items/d418746e40ff2bf2241a)

## 「あわせて読みたい」を追加する

他の人の記事や、自分の記事でも、何か役立つものを追加する。

Qiitaにも関連記事機能はあるけど、自分で追加した方がずっと精度・有意度は高いよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ba7b455b-cc75-999c-b5b1-2f66c68bf791.png)


# そして、あわせて読みたい？

- [拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。 - Qiita](https://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
URL直打ち防止

#URL直打ちとは
そのままURLに直接打ち込むこと。
対策していないと、他のユーザーが自分のページを編集・更新したりできてしまう。
現在twitterのようなアプリを作成中で、備忘録として書いてます。

#対策例
メソッドを作り、関連するcontrollerに***before_action***に設定する。
例えばcorrect_userというメソッド作る。

```rb

def correct_user
  @micropost = current_user.microposts.find_by(id: params[:id])
    unless @micropost
      redirect_to root_url
    end
end
```

この***correct_user***メソッドを下記のように設定すると、URL直打ちで対象ページに遷移しようとするとき（ここではedit,updateアクション）、正しいユーザーじゃないとトップページにリダイレクトされる。

```controller.rb
before_action :correct_user, only: [:edit, :update]
```


###補足
correct_userの中に記入されている***current_user***はヘルパーメソッドで下記の内容（名前似てるので注意）

```rb
def current_user
  User.find_by(id: session[:user_id])
end
```
Firebase Hosting なら SSL は無料です [BitScheduler開発日誌]

Firebase Hosting 使ってますか？
実はドメイン接続しても SSL 証明書が無料で提供されるんです。

提供される証明書を確認してみると [Let's Encrypt](https://letsencrypt.org/)の証明書ですね。

<img width="508" alt="encrypt.png" src="https://qiita-image-store.s3.amazonaws.com/0/25427/0eb56bd2-f671-8b3b-2363-88053800532b.png">

Firebase Hosting なら Let's Encrypt の３ヶ月毎の SSL 更新作業も不要です。BitSchedulerでも当然利用させていただいています。
ありがとう Firebase !

## 参照

[Firebaseガイド - カスタムドメインを接続する](https://firebase.google.com/docs/hosting/custom-domain)

## BitSchedulerとは

出欠管理サービスです。Googleカレンダーと連携することで簡単にチームの出欠を管理、運用できることを目指しています。
現在β版をリリースしています。ぜひ使ってみてください！

[BitScheduler](https://bitscheduler.com/)
Auth0でログインしようとするとCORSでエラーが起きる問題

Auth0を利用してログインしようとすると、以下のようなエラーを吐かれることがあります。

```
Failed to load https://hoge.auth0.com/user/ssodata: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access. The response had HTTP status code 404.
```

Auth0の設定でクロスオリジンを設定してもエラーが出ていたので不思議だなと思っていたのですが、こんな記述がありました。

>Embedded login for web uses Cross Origin Authentication, which does not work reliably on all browsers if you do not enable Custom Domains. The use of Custom Domains is a paid feature. A good alternative is to migrate to Universal Login if you cannot use Custom Domains in your application.

このエラーはLock Widgetというサイト埋め込み型のログイン(embedded login)を利用した時に発生するのですが、どうやらembedded loginの場合は有料のカスタムドメインを利用しないとクロスドメインアクセスが出来ないようです。

カスタムドメインが使えない人は大人しくUniversal Loginを使うようにしましょう。
7²+8²+9²+...17²+18²=2018(年)になるというネタがホントかどうかChromeで検算する

3年ぶりに投稿したVue.js+Vuexの図解記事が好評だったのでもう一つ生徒に人気のJavaScriptネタを書きました。
ブラウザさえあればエディタもメモ帳も使わずに数の神秘を体験できるのでJavaScriptに苦手意識がある方も楽しめる内容だと思います。

## きっかけはツイッターのTL
年明けすぐくらいに「2018は、7から始まる12連続整数の平方和である」というつぶやきを見かけたのです。
[Twitter:12連続整数 2018](https://twitter.com/search?src=typd&q=12%E9%80%A3%E7%B6%9A%E6%95%B4%E6%95%B0%E3%80%802018)

つまり、
2018 = 7²+8²+9²+10²+11²+12²+13²+14²+15²+16²+17²+18²
が成立するのだとか。
「スゲエ！」と思ったのと同時に「ホントか！？」と考えて直後にはChromeで検算していました。
Consoleにfor文を打ち込んで「2018」と表示された時の私の感動がこの記事で伝われば嬉しいです。

## エディタ不要！Chromeでの検算手順

### ①Chromeの開発者ツールを開く
Chromeで「新しいタブ」を開き、
「右クリック」⇒「検証」
を押すと、以下のように開発者ツールが現れます。
（今見ているQiitaのページでツールを開いてもOK）

![0.jpg](https://qiita-image-store.s3.amazonaws.com/0/63528/effb4605-2888-7785-66dd-de29e5aae955.jpeg)

開発者ツールのタブ3つ目にある「Console」をクリック。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/63528/552cd45b-cbeb-79b2-e945-f387cd680bbe.jpeg)

カーソルが当たっている場所にコードを書くだけですぐにJavaScriptを動かせます。
試しに「Hello World!」と表示するalertを出してみました。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/63528/76194daf-294d-f9fc-b0c0-edc5239933e4.jpeg)

以降、紹介するJSのコードはここに打ち込んでいきます。
新しいコードを追加してエラーが出る場合はChromeをリロードしてください。

### ②基礎的なfor文で検算
「7から始まる12連続整数の平方和」という文章をそのままforで表現します。

```js:ChromeConsole
var sum = 0;
for (var i = 7; i <= 18; i += 1) {
  sum += i * i;
}
console.log(sum);
```

ConsoleにコピペしてEnterキーを押してください。
「2018」って表示されますよね！？
感動しませんか！？

### ③forの条件を読みやすく改良
「var i = 0」でスタートさせると「12連続」というのが一目でわかるようになります。
iが小さくなった分、計算時に7を足しましょう。
ついでに、console.logの表現も工夫。

```js:ChromeConsole
var sum = 0;
for (var i = 0; i < 12; i += 1) {
  sum += (i + 7) * (i + 7);
}
console.log('Result: ' + sum + '!');
```

### ④ES6の記法でちょっとカッコよく
最近はvarを使わない傾向になってきました。
今回は再代入するので「let」を使います。
さらに、「べき乗演算子」を使って2乗をスッキリと。
文字列の結合は「テンプレートリテラル（バッククォート）」で記述量が大幅に減ります。

```js:ChromeConsole
let sum = 0;
for (let i = 0; i < 12; i += 1) {
  sum += (i + 7) ** 2;
}
console.log(`Result: ${sum}!`);
```

### ⑤ワンライナーで書く
forを使うと4行ですが、「スプレッド演算子」と「reduce」と「アロー関数」を使うと、1行で書けるんです！

```js:ChromeConsole
const sum = [...Array(12)].reduce((prev, _, i) => prev + (i + 7) ** 2, 0);
console.log(`Result: ${sum}!`);
```

console.logもまとめるとこうなる。

```js:ChromeConsole
console.log(`Result: ${[...Array(12)].reduce((prev, _, i) => prev + (i + 7) ** 2, 0)}!`);
```

## 他にもある2018の特性
Wikipedia見ると他にもたくさんあって面白いです。
2018 = 1³ + 7³ + 7³ + 11³
とかカッコいい。

[Wikipedia: 2018](https://ja.wikipedia.org/wiki/2018)

## まとめ
一見無味乾燥なfor文でも「2018」って表示されると感動しますよね！
ES6の記法も覚えるまでは苦しいけれど、慣れるとコーディングがとってもラクになります。

続編を書きました！
[【再帰関数に挑戦】超短いワンライナーの計算結果が2018になる過程を読み解く](https://qiita.com/m_mitsuhide/items/e098a55fe33a8501f4bd)
C言語におけるreadとrecv,freadの違い


# readとfread,recvの違い
C言語で簡易HTTPサーバを作成する際に、ブラウザに返すファイルを読み込むのに何を使おうと迷ったため、調べることにしました。

## 【違い】
### readとrecv
read は recv の flags パラメータ(第4引数)に0を与えたものと同一。flagsパラメータに他の値を与えるとrecvの振る舞いが変わる。同様に、writeはflags==0のときのsend と同一。

### readとfread
- read：低水準入出力関数
- fread:高水準入出力関数/ストリーム関数
 
高水準入力関数は、対象ファイルを読み込んだ後それを一度OSが管理するメモリ上に置き、指定メモリ領域にコピーをする。
一方で低水準入出力関数では、ソースから指定メモリ領域にコピーされる。そのため、あるファイルを一度だけ読み書きする場合には低水準入出力関数の方が高速にアクセスが可能となる。

参考ページ：[プログラマー向けブログ](http://www5c.biglobe.ne.jp/~ecb/c/13_01.html)

各関数の使い方は以下。


## 【read】

ファイルからのデータの読み込みを行う低水準入出力関数。

#### 使い方
```c
int read(
 int handle,   //ファイルハンドル
 void *buf,    //データ格納先アドレス
 int length    //bufパラメータの指すバッファーのバイト単位長
)
```

#### 戻り値
完全に成功すると、受信データのバイト数
ソケットがクローズされると、0
読み取り途中で失敗すると、読み取りに成功した部分のバイト数
まだデータを読み取っていないと、-1

詳細は以下を見よう。
参考ページ：[IBM Knowledge Center - read](https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rtrea.htm)

## 【fread】
ブロック単位でデータを読み込む高水準入出力関数。
ファイル構造体を介してファイルにアクセスする。
#### 使い方
```c
size_t fread(
 void *buff,   //データ格納先アドレス
 size_t size,  //読み込むデータ1つのバイト数
 size_t n,     //読み込むデータの個数
 FILE *fp      //ファイルポインタ
) 
```

#### 戻り値
完全に成功すると、受信データのブロック数(size)
何かしら失敗すると、sizeより小さい値

詳細は以下を見よう。
参考ページ：[C言語入門/関数リファレンス](http://www.orchid.co.jp/computer/cschool/CREF/fread.html)


## 【recv】

接続されたソケットまたはバインドされた非接続ソケットからデータを受信する関数。

#### 使い方
```c:
int recv(
 int socket,   //socketディスクリプタ
 char *buf, //データ格納先アドレス
 int length,   //データ長
 int flags     //flgas
 )
```

- socket　接続されたソケットを識別する記述子
- buf　データを受け取るバッファーへのポインタ
- length　bufferがさすバイト単位の長さ
- flags　　呼び出しをどのように行うかを指定するフラグ

#### 戻り値
成功すると、受信データのバイト数
ソケットがクローズされると、0
失敗すると、-1を戻す

詳細は以下を見よう。
参考ページ：[ちょくとのページ - recv](http://chokuto.ifdef.jp/advanced/function/recv.html)
fail2banでのban解除方法

## 概要

fail2banを使っていて
解除コマンドを打ったものの
アクセスできなかったので
解除までの一連の流れを備忘録として残すことにした。

## 流れ

- 一応banされているIPアドレス確認
- fail2banでban解除
- firewallの再読み込み

## 一応banされているIPアドレス確認

```sh:shell

fail2ban-client status [Jail名]

```

`[Jail名]`だが稼働しているルール名(？)を使う

現在稼働しているJailの確認は

```sh:shell

fail2ban-client status

```

とすれば

```text:shell

Status
|- Number of jail:      3
`- Jail list:   apache-ddos, apache-dirtra, sshd

```

自分の例だがこのように確認できる

## fail2banでban解除

まず解除しなければ話は進まないので解除する

```sh:shell

fail2ban-client set [Jail名] unbanip [IPアドレス]

```

`[Jail名]`はもちろんだが
banしてしまったJail名を入れる

`[IPアドレス]`はbanされてしまったIPアドレスを
`xxx.xxx.xxx.xxx`のように入れる

## firewallの再読み込み

先ほど解除したら
まだアクセスできなかったので
もしやと思ってfirewallのリロードを試した
するとアクセスできるようになった

```sh:shell

firewall-cmd --reload

```

と打てばいい


あとから気付いたのだが
fail2banのリロード(Jailのリロード)
をすればそれで解決する(と思う)

```sh:shell

fail2ban-client reload [Jail名]

```

`Jail名`を省けばfail2ban自体のリロードになる
Ubuntu14.04LTSへWebアプリ基盤をvagrant up一発で構築する

# はじめに

普段よく使用する[KAGOYAのVPSがUbuntu14.04LTS](https://www.kagoya.jp/cloud/vps/openvz.html)なので、
環境を合わせるためにvagrantのubuntu/trusty64を使用しています。

PHP5を使用しているのはよく案件で使用するのが5だからです。
以下URLの内容を元にしているので、プロビジョニングファイルを書き換えればバージョンは簡単に変えることができます。
https://qiita.com/gano/items/4a21113173249276f2b2

これまではある程度動くものを使いまわして、その場その場で動かない部分（特に設定系）を修正したのですが、Macを新調したこの機会に修正してGithubへアップすることにしました。

# 前提
* VirtualBox
    * https://www.virtualbox.org
* vagrant
    * https://www.vagrantup.com/downloads.html

# 構成
* Vagrantfile
    * 起動ファイル
    * 仮想環境の基本設定を記載
    * 内部でプロビジョンファイルを実行
* Vagrantfile.provision.sh
    * ミドルウェアをインストール
    * 設定の書き換えを実行
    * データベースの作成
* db/database.sql
    * 記載されたSQLをプロビジョン時に実行
* www/index.php
    * ドキュメントルート
    * 同階層以下はサーバと共有しているので、ローカルでここを更新すれば反映されます

# 環境
* OS
    * Ubuntu 14.04 LTS
    * ubuntu/trusty64
* Web Server
    * Apache
* PHP
    * PHP5.6
* Database
    * MySQL5.6
* クライアントマシン
    * Mac
* 構成管理
    * Shell

# Github
https://github.com/t-o-z/vagrant-ubuntu14.04

# 使い方

基本vagrant up 一発で起動します。

```
vagrant up
```

起動後は以下のURLでアクセス可能です。

http://192.168.33.101

サーバへ入りたい時は

```
vagrant ssh
```

でサーバへ接続が可能です。

# これから
* ターミナルで色つけたり
* 不要なパッケージは除去して最小限にまとめたり
* apache、mysqlだけじゃなくnginx、postgresqlも選べるようにしたり
* centos版も作ったり

する予定です。（このままだと完全に日本語対応しているとも言い難いので、、）

構成管理ツールのchef,ansibleもちょこちょこ使っているので本当は組み込んだ方が良いんでしょうが、
shellの方が個人的に好みなのと、デバッグが楽なので優先度は低めです。

アプリ開発がメインなので、環境系はつい後回しにしがちですが、こうしておくと便利ですね。
node.js のプログラムを systemd で管理する


```
$ sudo vi /etc/systemd/system/XXX.service
[Unit]
Description=XXX
After=network.target

[Service]
Type=simple
User=tsujimitsu
EnvironmentFile=/etc/default/XXX
WorkingDirectory=/opt/XXX
ExecStart=/home/tsujimitsu/.nvm/versions/node/v8.9.0/bin/node /opt/XXX
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target
```

```
$ sudo vi /etc/default/XXX
DEBUG=debug
AWSIOT_CONFIG_FILE=./config.json
NODE_RED_DIR=../../../node-red
```

```
$ sudo systemctl daemon-reload
$ sudo systemctl start XXX
$ sudo systemctl enable XXX
$ sudo journalctl -f -u XXX
```
WSLにzsh+neovim環境をシュッと整える

# はじめに
新しい開発機(Windows)買ってしまったので、忘備録がてらまとめてみます。
とりあえずdotfilesをgit管理してる前提でWSL+zsh+neovim環境をシュッと整えます。


# 最初の準備
1. WSL(普段使いはUbuntu)をMicrosoft Storeからシュッと入れる
2. ssh-keygenとかぺちぺちやってgit環境を整える
3. githubからdotfilesをclone
4. dotfilesをデプロイ

ここまでで大半のシェル環境は整うしdotfilesのgit管理はやっとくべきですね。

# [Linuxbrew](http://linuxbrew.sh/)を入れる
>Linuxbrew is a fork of Homebrew, the macOS package manager, for Linux.

とのことで、会社で使うMacと家で使うubuntuの差異をできるだけなくすために使用します。
サクッといれるのでlinuxbrew-wrapperで...

```bash
$ sudo apt-get update upgrade -y
$ sudo apt install linuxbrew-wrapper
```

# Brewfile を使ってbrew installをコードで管理する
あれも入れてこれもいれての管理が面倒なのでas codeで解決します。
というわけでdotfiles直下に[Brewfile](https://github.com/cross-ts/dotfiles/blob/master/Brewfile)も入れて解決。

```:Brewfile
# tap for install
tap "tkengo/highway"

# install
# shell
brew "zsh"
brew "zsh-syntax-highlighting"

# for editior
brew "neovim"
brew "ctags"
brew "tkengo/highway/highway"

# update commands
brew "git"
brew "rsync"
brew "gawk"

# language
brew "perl"

# language version managers
brew "rbenv"
brew "pyenv"
brew "nodenv"

# for build
brew "ruby-build"

# command line tools
brew "watch"
brew "htop"
brew "tig"
brew "imagemagick"
brew "jq"
brew "peco"
brew "tmux"
brew "tree"
brew "awscli"
```

```
$ brew bundle
```

これでzshもneovimもctagsも全部入れるの、めっちゃ楽です。
zsh-syntax-highlightingもこれで入れちゃいます。

# ログインシェルを zsh にする
chshでログインシェルを変更するためには/etc/shellsに登録されてる必要があります。

```
$ which zsh
$ sudo vi /etc/shells
$ chsh -s `which zsh`
```

これでzshの設定も終了です。

# ついでに
コンソールでMSゴシックなんか使ってられるかって気持ちを持ってしまったのでとりあえず[Ricty Diminished](https://github.com/mzyy94/RictyDiminished-for-Powerline)を入れてつかいます。
ダウンロードしてttfからインストール、WSLのプロパティからフォント変更するだけです。

# 終わりに
docker環境もシュッと整えたいんですが、docker-compose使えるようになるまでがめんどくさそうで...
Filmarksから特定ユーザーの観た映画一覧を取得するスクリプト

# 出来ること

Filmarksから特定ユーザーの観た映画一覧を取得し、Googleスプレッドシートに書き込めるコードを書きました。

![スクショ.png](https://qiita-image-store.s3.amazonaws.com/0/55365/9eb92726-2711-c92a-1d16-35edbbc37d41.png)
https://github.com/nkjzm/MovieLogGetterFromFilmarks

## 注意

- スクレイピングは使い方次第で違法となる可能性がある技術です。利用される際は十分に配慮ください。
- また、紹介した方法を使ってなんらかの不利益を被った場合でも、私は一切に責任を負いませんのでご了承ください。

# 使い方

1. SpreadSheetから「ツール」>「スクリプトエディタ」を選択し、コード.gsの内容をコピペします。
1. スプレッドシートを再度開いた後に「B1」にFilmarksのユーザーidを入力し、メニューより「フィルマークの映画一覧取得」をクリックしてください。
1. 権限周りでダイアログが出ると思いますが、無理やり進めると実行できます
1. 成功すると「実行しています」と表示され、数秒後に反映されると思います。

# 実装

```js:コード.gs
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {
      name : "フィルマークの映画一覧取得",
      functionName : "myFunction"
    }
  ];
  sheet.addMenu("スクリプト実行", entries);
};

function myFunction () {
  var sheetData = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var userId = sheetData.getRange(1, 2).getValue();

  var pageLenght = getPageCount(userId);

  var index = 2;
  for(var page = 1; page <= pageLenght; ++page)
  {
    var url = 'https://filmarks.com/users/' + userId + '?page=' + page;

    Logger.log(url);
    
    var response = UrlFetchApp.fetch(url);
    var myRegexp = /<h3 class=\"c-movie-card__title\">([\s\S]*?)<\/span><\/p><\/div><div class=\"c-movie-card__right\">/gi;
    var elems = response.getContentText().match(myRegexp);

    for(var i in elems) {
      var elem = elems[i];
      var col = parseInt(index);
      sheetData.getRange(col, 1).setValue(getRegexpedText(elem,/<h3 class=\"c-movie-card__title\">([\s\S]*?)<span>/gi));
      sheetData.getRange(col, 2).setValue(getRegexpedText(elem,/<span>([\s\S]*?)<\/span>/gi));
      sheetData.getRange(col, 3).setValue(getRegexpedText(elem,/<div class=\"c-rating__score\">([\s\S]*?)<\/div>/gi));
      sheetData.getRange(col, 4).setValue(getRegexpedText(elem,/<p class=\"c-movie-card__review\"><span>([\s\S]*?)<\/span>/gi));
      ++index;
    }
  }
}

function getRegexpedText(text, regexp)
{
  Logger.log(text)
  var elems = text.match(regexp);
  var regexpedText = elems[0];  
  regexpedText = removeTags(regexpedText);
  return regexpedText;
}

function getPageCount(userId)
{
  var url = 'https://filmarks.com/users/' + userId;
  
  var response = UrlFetchApp.fetch(url);
  var myRegexp = /<span class=\"p-users-navi__count\">([\s\S]*?)<\/span>/gi;
  var elems = response.getContentText().match(myRegexp);

  var itemCount = elems[0];
  itemCount = removeTags(itemCount)
  var pageCount = Math.ceil(parseInt(itemCount) / 36);
  return pageCount;
}

function removeTags(text)
{
  text = text.replace(/(^\s+)|(\s+$)/g, "");
  text = text.replace(/<\/?[^>]+>/gi, "");
  return text;
}
```

# 関連

- [Filmarks](https://filmarks.com/)
- [GASのコードをGithub管理するChrome拡張が便利 - Qiita](https://qiita.com/splas_boomerang/items/d384896d01ac3ff6f91c)
gitを用いてpipでpythonのパッケージを配布する方法

#前置き
### pipとは
省略

### インストール時のコマンド

```
pip install git+[URL]
```

[URL]にはインストールしたいgitのレポジトリのURLが入る。

```example
pip install git+https://github.com/username/poyo.git
```

branchを指定してinstallしたい場合

```example
pip install git+https://github.com/username/poyo.git@poyo
```

### アップグレード時のコマンド

```
pip install git+[URL] -U
```

# ファイル構成
```
repositoryName
|--topDirectory
|  |--bottomDirectory
|  |  |--bottom.py
|  |  `--__init__.py
|  |--top.py
|  `--__init__.py
`--setup.py
```

##setup.py
このファイルはパッケージの名前などのメタデータ、コマンドとそのコマンドのPathを記述するものである。

### メタデータ
メタデータには以下の種類がある。

| メタデータ | 説明 | 値 |
|:--|:--|:--|
| name | パッケージ名 | 短い文字列 |
| version | リリースのバージョン | 短い文字列 |
| author | パッケージ作者名 | 短い文字列 |
| author_email | パッケージ作者の電子メールアドレス | 電子メールアドレス |
| maintainer | パッケージメンテナンス担当者の名前 | 短い文字列 |
| maintainer_email | パッケージメンテナンス担当者の電子メールアドレス | 電子メールアドレス |
| url | パッケージのホームページ | URL |
| description | パッケージについての簡潔な概要説明 | 短い文字列 |
| long_description | パッケージについての詳細な説明 | 長い文字列 |
| download_url | パッケージをダウンロードできる場所 | URL |
| classifiers | 分類語のリスト | 文字列からなるリスト |
| platforms | プラットフォームのリスト | 文字列からなるリスト |
| license | パッケージのライセンス | 短い文字列 |

この表は公式ドキュメントからコピペしたものである。
公式ドキュメント：https://docs.python.jp/3/distutils/setupscript.html

これらのメタデータは何も指定しなくても問題なく配布はできるが、nameとversionの指定は推奨されている。
これらは指定されていないとき、nameはUNKNOWN、versionは0.0.0が設定される。

### 実行コマンドとPath
entry_pointを指定することで実行コマンドを実行できるようになる。
entry_pointの指定の例を示す。

```py
entry_points = {
	'console_scripts': [
			'top = topDirectory.top:main',
			'bottom = topDirectory.bottomDirectory.bottom:sub'
		]
	}
```

entry_pointsに指定するものはdict型であり、実行コマンドを指定するためには'console_scripts'のkeyに対して、stringの配列のvalueを設定する。
実行コマンドとなるものは=の左辺であり、そのPathは=の右辺である。
=の右辺のうち:の左側がmoduleのPathであり、:の右側は:に最も近いmodule(以下最終moduleと呼ぶ)に含まれる関数名である。
ターミナル上で=の左辺の実行コマンドを実行すると、最終moduleに含まれる関数を実行する。
**最終module名と実行コマンドの名前は一致**していなければならない。

entry_pointsの他にpackagesも指定しなければならない。
packagesの例を示す。

```py
packages = ["topDirectory", "topDirectory.bottomDirectory"]
```

packagesに含まれるものはentry_pointsで指定した=の右辺から最終module以下を除いたものである。


下にsetup.pyの例を示す。

```setup.py
from setuptools import setup

setup(
    name = 'Hoge',
    version = '1.0.0',
    url = 'https://github.com/username/hoge.git',
    license = 'Free',
    author = 'Me',
    author_email = 'hogehoge@fuga.com',
    description = 'Hoge',
    install_requires = ['setuptools'],
    packages = ["topDirectory", "topDirectory.bottomDirectory"],
    entry_points = {
	    'console_scripts': [
	        'top = topDirectory.top:main',
	        'bottom = topDirectory.bottomDirectory.bottom:sub'
	    ]
    }
)
```

## \_\_init\_\_.py
空白で良い

## top.py, bottom.py
実際のコードが入る。
例

```top.py
def main():
	print("I am so happy")

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

#結論
ファイルを一つ作るだけなため、gitを用いずにpipで配布するよりは楽。

# 参考
[pip で github のリポジトリをインストール - Qiita](https://qiita.com/trsqxyz/items/744ba3c8a123d52aa7fe)
https://docs.python.jp/3/distutils/setupscript.html
npmモジュールをnpmjs.comに公開してみた時の失敗談

npmモジュール公開を挑戦したら大失敗で取り返しのつかない事になってしまったのでシェアします。

皆さんに一言で要点を伝えると、モジュールの管理画面のMaintainers一覧から自分を消してはいけない。

## あった事

アカウントを作ってテスト用に作りかけのモジュールを公開して、挙動が分かったから一度消して上げなおそうと思ったら自分の管理下から外れてどうしようもなくなってしまった。

自分のアカウントで検索すると以下の3つのモジュールが出てくるのだが、これが消せない。
以下の画像は説明用に作ったり、(正規の手段で)消したりしたのでモジュール名が変わる事があるので注意。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/f6c0825b-99bb-56e7-fa2c-1d9b929b35ae.png)

本来、自分の管理下のモジュールでは以下の様にタブバーにAdminの項目がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/62b82c99-a784-fa3d-7198-82b6c0b41d4a.png)

しかし、間違った手順を行って消すことが出来なくなってしまったモジュールではこの様にAdminの項目が無い。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/fb819244-f928-cde1-5bb6-1109943a2c3f.png)

## 何が間違いだったのか

以下のような管理画面で、Maintainersから自分を消してしまった事が間違い。これは絶対してはいけない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/73448ca2-2bd5-ddaa-7e3e-195bcbc53a25.png)

自分を消すと、管理できる人が誰も居なくなる。ので消せなくなる。管理人が居ないから、再度自分を追加する事も出来ない。

コマンド`npm owner`で管理人登録をしても駄目。npmコマンド上では自分が管理人になっているが、web上の管理画面では管理人はゼロのままだし、正規の手段で削除する事も、アップロードする事も出来ない。

## どうすればよいのか

テスト用モジュールを消す時は`npm unpublish モジュール名 --force`コマンドを使う。この方法で消すと、モジュールページが無事消された。

正規の手段で削除する方法であって、Maintainers一覧から自分を消してどうしようもなくなった状態を復旧させる方法ではない。復旧方法ご存知の方教えて。

検索結果はすぐに反映される訳では無いらしい。まだ検索結果に出てくる。リンク先は404になっているので、1日置けば検索結果からも消えると信じたい。

## おまけ

正規の手段でモジュールを消しても同じ名前で再アップロードする事は出来ないので注意。裏では削除済みのモジュール名も全部残してる。

このおかげで、既存のモジュールのモジュール名を変更しました。
Laravel Mixとは

# Laravel Mix
## Laravel Mixとは？
- 多くの一般的なCSSとJavaScriptのプリプロセッサを使用し、Laravelアプリケーションために、構築過程をWebpackでスラスラと定義できるAPIを提供している
- わざわざ独自にWebpackを設定したり、babelの設定をせずにReact.jsやVue.jsを使うようすることができる

## どうやって使うの？
下記コマンドでLaravel+Reactのプロジェクト作成すると使えるようになっている。
具体的には、npmコマンドを実行してLaravel Mixの具体的な機能を使用できる。

```shell
$ composer create-project laravel/laravel sample "5.5.*"
$ php artisan preset react
$ npm install
```

## npmコマンドについて
- npm run
  - `package.json`の`scripts`に記載されているタスク実行機能を呼び出すコマンド

- npm run dev  
  - 全タスク実行
  - `package.json`の`scripts`　の`dev`で設定している内容を実行

- npm run production
  - 全タスク実行を実行し、出力を圧縮
  - `package.json`の`scripts`　の`production`で設定している内容を実行

- npm run watch
  - ターミナルで実行し続け、関連ファイル全部の変更を監視する。そして、ファイルの変更があると自動的に再コンパイルする
  - `package.json`の`scripts`　の`watch`で設定している内容を実行

- npm run watch-poll
  - 特定の環境のWebpackでは、ファイル更新時に変更されない時がある。その時に使用する
  - `package.json`の`scripts`　の`watch-poll`で設定している内容を実行

## Reactを使用するには
- Laravel MixはReactをサポートするために、Babelプラグインを自動でインストールしてくれている。それを使用開始するには、下記のように`mix.react()`を記述する
- 実際には、Laravel Mixは最適なBabelプラグインとして`babel-preset-react`をダウンロードし取り込んでいる
- babel-preset-reactとは？  
BabelでJSXを変換するためのモジュール。Babelでは変換対象のモジュールのことをプリセットと呼ぶ

```js:webpack.mix.js
let mix = require('laravel-mix');

mix.react('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');
```

## 疑問
- ReactでJSXとES2015を使用するためには、`babel-preset-react`と`babel-preset-es2015`が必要ははずだが、`babel-preset-es2015`はどこでインストールされている？
- 下記記述で以下のような機能を取得することができるみたいだが、mix.js()を使用しないと使えないみたい。なら、別のところでES2015を使用できる設定をしている？
  - ES2015記法
  - モジュール
  - `.vue`ファイルのコンパイル
  - 開発環境向けに圧縮

```js:webpack.mix.js
mix.js('resources/assets/js/app.js', 'public/js');
```

## 備考
- Laravelのプロジェクトを作成して、Reactを使用する設定に変更してやると、もうその時点でJSXは使用できる状態になっている

## 引用、さらに調べたい
https://readouble.com/laravel/5.5/ja/mix.html
PHPで開発が捗るリアルタイムエラーチェック

[Pythonでも型チェックが捗る]と噂をきいたのでPHPの環境構築について書きます。ちょっと眠いので簡潔に… もしわからないことがあったら回答するのでコメントで聞いて[^1]。

## 得られる利益

関数名を間違ってることに気付いたり
![スクリーンショット 2018-07-31 01.53.12.png](https://qiita-image-store.s3.amazonaws.com/0/4121/2b196357-843a-bab1-23a7-8d1d7c440639.png)

変な型どうしで計算してることに気付いたり
![スクリーンショット 2018-07-31 01.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/4121/2621010f-d694-1f0a-f8cf-ab9377b47d48.png)

うっかり変な値を`return`しようとしたり
![スクリーンショット 2018-07-31 02.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/4121/8755f243-552f-f990-72f3-5a085d5cd349.png)

そんな問題に編集中に気付けるよ。

画面はVimだけど、ほかのエディタでもいいよ。

## 事前準備

 1. PHP 7.1+
    * macOSなら `brew install php` とかでもいいです (システムに最初から入ってる`/usr/bin/php`は不可)
 2. Composer
    * https://getcomposer.org/download/ とか読んで適当に入れて。
 3. `COMPOSER_HOME`に`PATH`を通す
    * `PATH=$HOME/.composer/vendor/bin:$PATH` みたいな行をシェルの設定ファイル(`~/.bashrc`とか)に書く

## PHPStanのインストール

```
composer global require phpstan/phpstan
```

 * 既にPsySHなどのPHP-Parserを使ったパッケージがインストール済で`nikic/php-parser:3.1.5`などが残存してる場合はインストールに失敗しやすいので注意
 * `composer global remove psy/psysh nikic/php-parser` などで一旦外すとスムーズ
   * そのあとで `composer global require psy/psysh`のように入れ直す

### 追記: phpstan-shimは非推奨

[PHPStan 0.12.0](https://www.phper.ninja/entry/2019/12/06/032456)以降、`phpstan/phpstan-shim`は更新されなくなるので、この方法でインストールしていた場合は `composer global remove phpstan/phpstan-shim; composer global require phpstan/phpstan` を実行してください。

## プロジェクトの設定

Composerがベースのプロジェクトの場合は、こういうファイルを用意します。

```yaml:phpstan.neon.dist
parameters:
  level: 3
  bootstrap: %rootDir%/vendor/autoload.php
```

詳しくは@Hirakuさんの[PHPStanで始めるPHPのための静的解析](https://tech.mercari.com/entry/phpstan)とかを読んでください。

## エディタの設定

### Vim

[ALE](https://github.com/w0rp/ale)で一発です。

### Emacs

[flycheck-phpstan](https://melpa.org/#/phpstan)パッケージを入れて`init.el`とかに設定を書いてください。

```init.el
(defun my-php-mode-hook ()
  "My PHP-mode hook."
  (require 'flycheck-phpstan)
  (flycheck-mode t)
  (flycheck-select-checker 'phpstan))

(add-hook 'php-mode-hook 'my-php-mode-hook)
```

### Visual Studio Code

私は使ったことはないですが[vscode-phpstan](https://marketplace.visualstudio.com/items?itemName=calsmurf2904.vscode-phpstan)ってやつがあるらしいです。 (未検証)

## まとめ

PHPStanの力があれば、ハイエンドなエディタなら割と簡単にIDE(なんとかストーム)に近い領域までいけるぞ。

この記事は手抜きですが、この記事を書いた人間の睡眠不足に報いるつもりのある型は https://www.pixiv.net/fanbox/creator/105589 を購読するEmacsやPHPの記事を書くモチベーションになります。

## 脚注

[^1]: こう書いて実際に質問を受けた経験はあまりないのですが、わからないことやトラブルがあったら記事のコメントでもTwitterのDMでもSlackでもいいので質問してね

[Pythonでも型チェックが捗る]: https://qiita.com/shibukawa/items/1650724daf117fad6ccd)
Linuxのfindコマンド使用方法の備忘

#▼findコマンド備忘録
findコマンドは、探したいファイルを色々な条件で指定して探すことができてとても便利なのですが
なかなかコマンドが覚えられないので備忘録として本記事に残します。
※manを見る限りだともっと便利な検索ができるみたいですので、暇なときにでも見て見たいです。

###使い方① ファイル名で検索する
`$find path -name [ファイル名]`

※末尾に`-ls`を付与すると出力結果が`ls -l`と同様になるので便利です。

###使い方② ファイル修正時刻で検索する
・ファイル修正時刻が_30日より古いファイル_を検索する
`$find path -ctime +30`

・ファイル修正時刻が_30日より新しいファイル_を検索する
`$find path -ctime -30`

・ファイル修正時刻が_30日のファイル（ちょうど30日前）_を検索する
`$find path -ctime 30`
【C#】AngleSharpの使い方メモ

C#にてAngleSharpを使う機会があったため、AngleSharp(ver:0.9.10)の一部の使用方法をメモ。
まだ少し改善余地のあるライブラリですが、HTML解析などには十分使用することができると思います。

<h1>HTMLをパースする</h1>
HTMLをパースするには、HtmlParserクラスのParseメソッドを使用します。

<h4>例）文字列(HTML)をパースする方法</h4>

```
//サンプルとして使用するHTML
var htmlText = @"
<html>
    <head>
        <meta charset = 'UTF-8'/>
        <title>AngleSharpの使い方</title>
    </head>
    <body>
        <div id = 'header' name='headerName'>
	    <h1 id = 'headerTitle'>AngleSharpの使い方</h1>
        </div>
        <ul id='linkList'>
	        <li class = 'link'><a href='@'>トレーニング用リンク1</a></li>
            <li class = 'link'><a href='@'>トレーニング用リンク2</a></li>
        </ul>
     </body>
</html>
";
```

```
// HtmlParserクラスをインスタンス化
var parser = new HtmlParser();

// HtmlParserクラスのParserメソッドを使用してパースする。
// Parserメソッドの戻り値の型はIHtmlDocument
var htmlDocument = parser.Parse(htmlText);
```

<h1>要素の取得</h1>

要素の指定方法には、従来通りのDOM操作に加えて、
セレクタを用いた取得方法もあるため要素の取得が簡単。

<h4>例）条件に一致する要素をすべて取得する方法</h4>

```
// aタグの要素を全て取得する。
var urlElements = htmlDocument.QuerySelectorAll("a");
```

代表的な要素取得用のプロパティとメソッドは以下の通り。

| プロパティ名/メソッド名  | 取得対象                     |
|:-----------------------|:----------------------------|
| Head                   | \<head>～\</head>内の全ての要素  |
| Body                   | \<body>～\</body>内の全ての要素  |
| Children               | 対象の全ての子要素  |
| GetElementById()         | id属性が一致する要素          |
| GetElementsByClassName() | class属性が一致する全ての要素     |
| GetElementsByName()      | name属性が一致する全ての要素      |
| GetElementsByTagName()   | タグ名が一致する全ての要素        |
| QuerySelector()          | セレクタの一致する要素        |
| QuerySelectorAll()       | セレクタの一致する全ての要素      |


<h1>要素の追加</h1>

<h4>例）指定タグの子要素としてタグを追加する方法</h4>
ページ上部のHTMLに新しくリンクを追加する場合。

```
// liタグ要素を作成する。
var listItem= htmlDocument.CreateElements("li");

// aタグ要素を作成する。
var link = htmlDocument.CreateElement("a");
link.SetAttribute("href","https://www.google.co.jp/");
link.TextContent = "Googleへのリンク";

// liタグにaタグの要素を追加する。
listItem.AppendChild(link);

// 上で作成したliタグの要素をulタグの子要素として追加する。
htmlDocument.GetElementById("ul").AppendChild(listItem);
```

<h1>HTMLの整形</h1>
パースした内容をフォーマットして出力してくれる機能もある。
※ver 0.9.10ではhtml、head要素など一部要素のフォーマットが崩れることを確認。

<h4>例）HTMLを整形する</h4>
```
// フォーマット後のHTML格納用変数
var sw = new StringWriter();
          
// フォーマッタ変数
var formatter = new PrettyMarkupFormatter();

// ToHtml関数の第一引数にStringWriter、
// 第二引数にPrettyMarkupFormatterを指定する。
htmlDocument.ToHtml(sw,formatter);
```
Cronを秒単位で実行する原始的なハック

**cronは秒指定に対応していない。**

「sleepを挟んで何行も書く」というハックがStackoverflowで提案されていた。

## 例

```
* * * * * /some/command
* * * * * ( sleep 15 ; /some/command )
* * * * * ( sleep 30 ; /some/command )
* * * * * ( sleep 45 ; /some/command )
```

# 参考

[ubuntu - Running a cron every 30 seconds - Stack Overflow](https://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Active Record Validations

###Active Record Validations
Validationは正しいデータのみをDBへ格納するために行う操作です。

###Validate対象のオブジェクト
ActiveRecordがバリデーションをかける対象のオブジェクトはDBの行（row）に対応しているものと、そうでないものの大きく２つです。`.new`メソッドを使用して新しくオブジェクトを作成しただけでは、オブジェクトはデータベースに属していません。
`.save`メソッドを呼ぶことで、初めてオブジェクトは適切なデータベースのテーブルに保存されます。
Active Recordの`new_record?`インスタンスメソッドを使用して、オブジェクトが既にデータベース上にあるかどうかを確認できます。


それでは、RailsGuideの通り確認してみます。

```products.rb
class products < ActiveRecord::Base
end 
```

```
$ rails console
>> p = Product.new(name: "ポテチ")
=> #<Person id: nil, name: "ポテチ", created_at: nil, updated_at: nil>
>> p.new_record?
=> true
>> p.save
=> true
>> p.new_record?
=> false
```

上から順に確認して行きます。
①：```p = Product.new(name: "ポテチ")```
nameカラムの値が「ポテチ」の新しいインスタンスを生成しています。
(とても美味しそうです。)

②：```p.new_record?```
既にDBにデータがないかどうかを確認していてtrueが返っているので新しいレコードであるとわかります。

③：```p.save```
生成したインスタンスを保存します。

④：```p.new_record?```
先ほど保存したばかりなのでDBにデータがないかを確認していますが、既に存在しているので、falseが返ってきます。


###valid?とinvalid?
Railsでオブジェクトが有効かどうかを検証するのにvalid?メソッドを使用します。
オブジェクトにエラーが無い場合はtrueが返され、オブジェクトにエラーがある場合はfalseが返ります。
下記サンプルです。

```product.rb
class Products < ActiveRecord::Base
  validates :name, presence: true　　　　
end
 
Product.create(name: "じゃがりこ").valid? # => true
Product.create(name: nil).valid? # => false
```

2行目の```validates :name, presence: true```でProductモデルのインスタンスにname属性の値があるかどうかを確認しています。

```Product.create(name: "じゃがりこ").valid? # => true```ではname属性の値に「じゃがりこ」が入っているのでtrueが返っています。

```Product.create(name: nil).valid? # => false```ではname属性の値がnilのためfalseが返っています。


###Validation Helper
Active Recordにはクラス定義の内で直接利用できるバリデーションヘルパーが多数用意されている。
ここでは詳細な利用方法については紹介しませんが簡易にまとめておきます。
とても多いので、また実際に利用するときにまとめたいと思います。

| バリデーションヘルパー      | 用法 |
|:-----------------:|:------------------|
| acceptance|フォームが送信されたときにユーザーインターフェイス上のチェックボックスがオンになっているかどうかを検証します   |
|validates_associated|モデルが他のモデルに関連付けられていて、両方のモデルに対してバリデーションを実行したい場合に使用します。オブジェクトを保存しようとすると、関連付けられているオブジェクトごとにvalid?が呼び出されます。| 
|confirmation |2つのテキストフィールドが完全に一致する内容を受け取る必要がある場合に使用します| 
|exclusion|与えられた集合に属性の値が含まれて「いない」ことを検証します| 
|format|withオプションで与えられた正規表現と属性の値がマッチするかどうかをテストすることによってバリデーションを行います。| 
|inclusion|与えられた集合に属性の値が含まれているかどうかを検証します。 集合としては任意のenumerableオブジェクトが使用できます| 
|length|属性の値の長さを検証します。多くのオプションがあり、長さ制限をさまざまな方法で指定できます|
|numericality|属性に数値のみが使用されていることを検証します。デフォルトでは、整数または浮動小数点にマッチします。これらの冒頭に符号が付いている場合もマッチします。整数のみにマッチさせたい場合は、:only_integerをtrueにします。|
|presence|指定された属性が空でないことを確認します。値がnilや空文字でない(つまり空欄でもなければホワイトスペースでもない)ことを確認するために、内部ではblank?メソッドを使用しています|
|absence|指定された属性が空であることを検証します。値がnilや空文字である (つまり空欄またはホワイトスペースである) かどうかを確認するために、内部ではpresent?メソッドを使用しています|
|uniqueness|属性の値が一意であり重複していないことを検証します|
|validates_with|バリデーション専用の別のクラスにレコードを渡します|
|validates_each|1つのブロックに対して属性を検証します。|
|allow_nil|対象の値がnilの場合にバリデーションをスキップします|
|allow_blank|このオプションを指定すると、属性の値がblank?に該当する場合にバリデーションがパスします。blank?に該当する値にはnilと空文字も含まれます|
|message|バリデーション失敗時にerrorsコレクションに追加されるカスタムエラーメッセージを指定できます。このオプションを使用しない場合、Active Recordはバリデーションヘルパーのデフォルトのエラーメッセージを使用します|
| on |バリデーション実行のタイミングを指定します|




###参考

https://guides.rubyonrails.org/active_record_basics.html


Active Record Validation
https://railsguides.jp/active_record_validations.html
AssemblyDefinitionについて

# はじめに
AssemblyDefinitionはUnity2017.3に追加された新機能です。
簡単に導入できて、外部アセットを分離しておくと良さそうなので記事にしました。

[Unity - Manual: Script compilation and assembly definition files](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html)

# Assembly Definitionとは
AssemblyDefinitionは、Assembly-CSharp.dllを複数のアセンブリに分離することができます。

![ScriptCompilation.png](https://qiita-image-store.s3.amazonaws.com/0/111339/056b1c27-10ab-4f6a-1aa2-b1c1f3de6ae6.png)

依存関係を持つため、以下のような状態になります。
* Main.dllは、Stuff.dllとThirdParty.dllに含まれるクラスなどを利用できます。
* Stuff.dllは、Library.dllに含まれるクラスなどを利用できます。
* ThirdParty.dllとLibrary.dllは、それぞれ自身の持つクラスなどのみを利用できます。

アセンブリが別れているため、ビルド時間が短縮されます。
Stuff.dllのクラスを変更した場合、Stuff.dllとそれを参照しているMain.dllがビルドされます。
ThirdParty.dllやLibrary.dllは変更の影響を受けないため、ビルドの対象にはなりません。

# 使い方
使い方はとても簡単です。
1.  対象にしたいフォルダ以下にAssemblyDefinitionのファイルを作成する。
2.  参照関係を設定する。
3.  ビルド時に含める範囲を指定する。

![usecase-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/804a8352-8746-081b-e434-500f857d3152.jpeg)
![usecase-2-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/886556df-d353-b1b7-3b4a-5d4e8e6f6d56.jpeg)


スクリプトファイルを選択するとどのアセンブリに含まれるのかが表示されます。

![fileA.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/62a36f04-e71c-f8a9-9cde-23a14edb14b2.jpeg)

依存関係があるため、MainAからMainB、StuffA、ThirdPartyAは利用できますが、LibraryAは利用できません。

![build-error.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/02e2e31e-4aac-5201-ee3a-cd37900261f3.jpeg)

# よかったこと
* ビルド時間が短縮された。<br>
  変更のあるアセンブリだけがビルド対象のため、ビルド時間が短縮されました。
* アーキテクチャを物理的に設定することができる。<br>
  例えばMVCでアプリを作成している場合、ControllerはModelとViewを参照する、ViewはModelのみ参照する、Modelは何も参照しない、という構造が作成できます。

# 注意点
* Editorフォルダなどにも適応する必要がある。<br>
  Editorフォルダ以下のファイルもAssemblyDefinitionの影響を受けます。<br>
  Runtimeに含まれない用にするため、Editor用にAssemblyDefinitionを追加する必要があります。
ESP32 用 Arduino 開発環境の初の安定版 1.0.0 がリリースされたのでセットアップした 20180730 版

# 概要

つい最近(20180728), ESP32 用 Arduino 開発環境 [Arduino core for ESP32 WiFi chip](https://github.com/espressif/arduino-esp32) の初の安定版 1.0.0 がリリースされました. インストールする際に, コマンドラインで色々する必要はなく Arduino IDE のメニューからインストールできるようになってるようなので, そのセットアップ手順をまとめました.

https://github.com/espressif/arduino-esp32/releases より

```
This is the first stable release of Arduino for ESP32 for Arduino Package Manager
```

なお, この記事では秋月電子等で売ってる [ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/) を対象にしていますが他のボードでもほぼ同じだと思います.

# インストール

ドキュメントの [Arduino IDE Boards Manager を使ってインストールする手順](https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md)に従う.

- [Arduino Software のページ](https://www.arduino.cc/en/Main/Software) の `Download the Arduino IDE` から最新版 Arduino IDE をダウンロードしてインストール（この記事を書いている時点では 1.8.5）.
- Arduino IDE を起動して, メニューから `Arduino` - `Preferences...` を選択.
- `Additional Board Manager URLs` に以下を追加して `OK`.

```
https://dl.espressif.com/dl/package_esp32_index.json
```

- メニューから `Tools` - `Board` - `Boards Manager...` を選択. `Filter your search...` のテキストボックスに `esp32` と入力. `esp32 by Espressif Systems version 1.0.0` を選択して `Install`. インストールが終わったら `Close`.
- メニューから `Tools` - `Board` - `ESP32 Dev Module` を選択( ESP32-DevKitC の場合).

# 動作テスト

- ESP32-DevKitC を USB ケーブルで PC と接続.
- Arduino IDE のメニューから `Tools` - `Port` - `/dev/cu.SLAB_USBtoUART` を選択（Mac OS Xの場合）.
- もし `/dev/cu.SLAB_USBtoUART` 表示されない場合は [Silicon Labs の CP210x USB - UART ブリッジ VCP ドライバ](https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) をインストール.
- 一番単純そうなサンプルスケッチを実行する. メニューから `File` - `Examples` - (`Examples for ESP32 Dev Module`) - `ESP32` - `ChipID` - `GetChipID` を選択.

```cpp:GetChipID.ino
uint64_t chipid;  

void setup() {
	Serial.begin(115200);
}

void loop() {
	chipid=ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
	Serial.printf("ESP32 Chip ID = %04X",(uint16_t)(chipid>>32));//print High 2 bytes
	Serial.printf("%08X\n",(uint32_t)chipid);//print Low 4bytes.

	delay(3000);

}
```

- スケッチウインドウの `Upload` を押して `Done uploading.` と表示されるまで待つ.
- スケッチウインドウの `Serial Monitor` を押して, `115200 baud` を選択.
- 以下のような行が 3 秒毎に表示されれば動作テスト完了.

```
ESP32 Chip ID = XXXXXXXXXXXX
(略)
```

# まとめ

- ESP32 用 Arduino 開発環境の初の安定版リリース.
- Arduino IDE の Board Manager からインストールできるようになってる.

以上.
C++ - Reentrant Function

https://www.geeksforgeeks.org/reentrant-function/

The key point is DON't use global parameter.

# 1. Non-Reentrant Function
```c++
int g_var = 1;

int f()
{
  g_var = g_var + 2;
  return g_var;
}

int g()
{
  return f() + 2;
}
```

#2. Reentrant Function
```c++
int f(int i)
{
  return i + 2;
}

int g(int i)
{
  return f(i) + 2;
}
```