OmniAICreator/Qiita-1.07M huggingface dataset:
【連載】初めてのWindows用Laravel 5.7開発環境構築入門

　この記事では、Windows 10にLaravel 5.7の開発環境を1から構築し、サンプルアプリを作成し、ドメイン名のついたレンタルサーバーで動作させるところまでをゴールとします。
　1つの記事ですべてカバーできないので、いくつかの記事に分けて少しずつ投稿していく連載にしていきます。連載は~~2018年11月から2019年1月の期間を予定しています。~~2018年12月14日に前倒し。
　なお、筆者はアメリカで開発業務を行っているため、選択するトレンドなどはアメリカ主体となります。

# 環境
開発環境は、2018年11月時点最新の以下のソフトウェアで構築します。
- XAMPP 7.2.12
- PHP 7.2.12
- MariaDB 10.1.37
- Apache 2.4.37
- Laravel 5.7

# 記事一覧
- [XAMPPでPHP＋MariaDB(MySQL互換)環境を構築する 2018年12月版](https://qiita.com/hitotch/items/0e1751ef38f83a9f3bf4)
 - [XAMPPをインストールしてPHPとMariaDBが使えるようにする](https://qiita.com/hitotch/items/fe70fc2992746fafab54)
 - [Visual Studio CodeでXAMPPのPHPコーディング環境を作る](https://qiita.com/hitotch/items/ab791fbc11a4e2a6cefd)
 - [XAMPPのPHPをXDebugでデバッグできるようにする](https://qiita.com/hitotch/items/7b2895f9822ded3fa7db)
 - [XAMPPのMariaDBを管理するためHeidiSQLを導入する](https://qiita.com/hitotch/items/eebda7f9ec40b46a6345)
 - [XAMPPのPHPからMariaDBを操作する](https://qiita.com/hitotch/items/4d6d8f8d03b55ea20909)
- [XAMPP上にLaravel 5.7をインストールする 2018年12月版](https://qiita.com/hitotch/items/d22fa4c12d0f15f7adc4)
 - [Laravel 5.7をインストールする](https://qiita.com/hitotch/items/927337632c7ae1f1963f)
        - Composerをインストールする
        - Laravelをインストールする
 - [XAMPPのApacheでLaravelを表示できるようにする。](https://qiita.com/hitotch/items/4f5ef016cabe040fd2a2)
 - [Laravel用にVisual Studio Codeのおすすめ拡張機能を導入する。](https://qiita.com/hitotch/items/9b5c8e28f50e0e3f7806)
- [XAMPPで動くLaravelのサンプルアプリを作成する。](https://qiita.com/hitotch/items/2633bad4a97925511d4e)
 - [Laravelアプリ用のデータベースの作り方](https://qiita.com/hitotch/items/142d8f102cfebe38dc30)
 - [LaravelでCRUDを作る](https://qiita.com/hitotch/items/d12d53e2c30f9b5d9ec1)
- [Laravelアプリケーションをレンタルサーバーで動作させる](https://qiita.com/hitotch/items/5c8c2858c883e69cd507)
H2O AutoMLでR上でタイタニックの生存予測をしてみる

# はじめに

SIGNATEの練習問題であるタイタニックの生存予測をRとH2Oでしてみます。ついでに、H2OのAutoMLを試してみてどんなモデルができるかを見てみます。

# 実行したコード

なにはともあれ、実行したコードを示します。

```{r}
require(h2o)

# H2Oを起動
local.H2O <- h2o.init()

# データをロードする
train.df <- read.table("train.tsv", sep = "\t", header = T)
test.df <- read.table("test.tsv", sep = "\t", header = T)

# 欠損値を埋める
train.df$age <- ifelse(is.na(train.df$age), mean(train.df$age, na.rm = T), train.df$age)
test.df$age <- ifelse(is.na(test.df$age), mean(test.df$age, na.rm = T), test.df$age)

# H2Oのオブジェクトに変換する
train.hex <- as.h2o(train.df)
test.hex <- as.h2o(test.df)

# survivedを変換する
train.hex$survived <- as.factor(train.hex$survived)

# AutoMLを実行
automl.hex <- h2o.automl(x = c(3,4,5,6,7,8,9), y = 2, training_frame = train.hex)

# 予測を行う
predict.hex <- h2o.predict(automl.hex, test.hex)

# 予測結果を整える
predict.df <- as.data.frame(predict.hex)
submit.df <- data.frame(id = test.df$id, p = predict.df$p1)

# H2O を終了
h2o.shutdown(prompt = FALSE)

# 予測結果を保存
write.table(submit.df, file = "submit.tsv", sep = "\t", row.names = F, col.names = F)
```

コードそのものはいたってシンプルで、欠損値の見られる年齢を平均値で欠損を埋めて、H2OのAutoMLで2値予測をするコードです。

# どんなモデルができたか

テスト実行したときの、実行結果のモデルを確認したところ、GBMとDeepLearningからなるStacked Ensembleなモデルができたようです。
Chrome拡張のVimiumでVimライクに使う

# インストール

- インストールリンクへ
  - https://chrome.google.com/webstore/category/extensions?hl=ja
- 検索で `Vimium` と検索する
- Chromeに追加を押す
- Chromeの右上に `V` アイコンが追加されているのでクリック
- Optionをクリック

# ショートカットキーを作成する

- `Custom key mappings` に以下を追加する

```
map h goBack
map l goForward
map H previousTab
map L nextTab
map i LinkHints.activateMode
map I LinkHints.activateModeToOpenInNewTab
```

- Chromeのフッターに表示されている `Save Changes` で保存する

|Command |説明|
|---|---|
|h goBack|Pageを戻る|
|l goForward|Pageを進む|
|map H previousTab|タブを左に一つ移動する|
|map L previousTab|タブを右に一つ移動する|
|map i LinkHints.activateMode|対話的に現在タブでリンクを踏んで移動する|
|map I LinkHints.activateModeToOpenInNewTab|対話的に新規タブでリンクを踏んで移動する|


(ex) `i` を押したときの画面 (表示されたアルファベットを打つと移動できる(小文字でOK))

<img width="820" alt="スクリーンショット 2018-11-24 8.28.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/63395/6aa29b7b-be08-5412-8851-13203573da36.png">



# デフォルトの基本的な使い方

|Command |説明|
|---|---|
|yy|URLをコピーする|
|O(大文字オー)|Google検索し、新しいタブで結果を見れる|
|j|下にスクロールする|
|k|上にスクロールする|
|gg|一番上に移動する|
|G|一番下に移動する|
|u|上半分移動する|
|d|下半分移動する|
|f|対話的に現在タブでリンクを踏んで移動する|
|F|対話的に新規タブでリンクを踏んで移動する|
|x|タブを閉じる|
|X|タブを復元する|
|/|ページ内で検索する(/ + 検索文字列 + Enter)|
|n|検索状態で下方向に検索する|
|N|検索状態で上方向に検索する|


# まとめ
Vimimuを使えばVimライクにChromeを操作できて効率よく作業を行えるようになった。マウスやトラックパッドを使う回数も減り快適です。
musicStand

```
var example = {
    musicStand,
};

// usage

example.musicStand.push((lop) => {
    if (lop.bard.phase == "alpha") {
        f(lop.bard, 1);
    } else if (lop.bard.phase == "beta") {
        g(lop.bard, 1);
    }
});
example.musicStand.push((lop) => {
    if (lop.bard.phase == "alpha") {
        f(lop.bard, 1);
    } else if (lop.bard.phase == "beta") {
        g(lop.bard, 1);
    }
});




```
Safari Books Onlineは英語が少しでもできるなら今すぐ登録すべき

## この記事を書いた経緯
先日5年以上ぶりに受けたTOEICで660点を取り、紛いなりにも英語が読み聞きできるようになり、より英語力の向上に努めようと、英語の学習も兼ねて英語での書籍を読み始めました。

とはいえ最近転職をして収入が増えたので技術書にも躊躇なく投資できるようになったものの、結構いろんな技術書をまとめて買い漁る性格で結構な金額になるため、できることなら金額は抑えたいという気持ちを抱えていました。

そんな時にいつだったか目にした「Oreilly公式の書籍読み放題サービス」の存在を思い出したので登録してみたらすごかったので、今回記事にしてあなたにもサービスの素晴らしさを知ってもらおうとん考えた次第です。

## Safari Books Onlineとは何か？

早い話、Oreillyが運営している**「技術書に関してAmazon UnlimitedとAmazon Prime Videoが一つになったサービス」**です、もっというとAmazonみたく、特定の本だけが読み放題なのではなく、あらゆる書籍と動画が見放題というとんでもないサービスになっています。

> Safariは、200社以上の大手出版社から発行される書籍、ビデオトレーニング、オライリーカンファレンスのフルコンパイルを提供しているデジタルライブラリーサービスです。ビジネス、テクノロジー、デザイン分野の最新情報がいち早く入手できます。
> 「Safari Books Onlineのご案内」 - Orally Japan公式ページ

サービスの開始はWikipediaによれば、何と2001年からだそう。もっと早く知っていればよかった。

## Safari Books Onlineに登録するメリット

### 月額39$(技術書1冊レベルの価格)で全てのコンテンツが利用し放題

Amazon UnlimitedとAmazon Prime Videoのようなサービスと言った通り、月額の利用料を払えばその後は追加の課金なくSafari Books Onlineを利用できます。

入門書を除けば大抵の技術書は4,500円するのが当たり前の世界です。

それを毎月ほぼ4,000円レベルの会費で利用し放題というのは金額的にお得というか、今までの常識ではほぼあり得ないレベルと言っていいでしょう。

### 書籍の動画バージョンがある

現在僕はFunctional Programming in Scalaという書籍を学習中何ですが、この書籍の音声読み上げバージョンの動画がSafari Books Onlineには存在します。

書籍はどうしても自分のスピードで読んでしまいがちですが、動画を視聴することで一定の速度で読み進めることができるようになります。

PDFを読み上げて自分でオーディオブックを作る必要もありませんね。

### 英語のリソースはほぼほぼ網羅されている

amazon.comなどでちゃんと確認したわけではないが、いわゆる英語の「出版物」はほとんど網羅されていると言っていいのではないでしょうか。
加えて動画などの独自コンテンツも充実していたりするので、多角的な方法で学習を進められます。

### 英語を学びながら技術の学習ができる

残念ながらSafari Books Onlineは英語のみ対応しており、日本語の書籍や動画はありません。

しかしこれを逆手に捉えれば、英語の勉強にはもってこいということでもあります。

[英語力の向上には多読は十分な効果があることが研究で示されている](https://yuchrszk.blogspot.com/2018/10/extensivereading.html)ため、英語で技術を学ぶことで技術力と英語力を同時に向上させることができます。

冒頭に書いたように僕はTOIECは660点しかありませんが、基礎的な文法を復習してから洋書を読み始めたので分からない単語の意味さえ引けば読み進めることができます。

おそらくTOEIC600点程度あれば十分楽しめると思いますので、もしあなたが英語力に少し不安があるとしても積極的に登録してみてもいいと思います。

## まとめ

より高みを目指すエンジニアであれば、

- 技術の学習と実践を怠らないこと
- 英語ができること、あるいはできるようになろうと努力すること

必須の条件だと僕は思っています。

Safari Books Onlineはそんな意識高い系のエンジニアの要求に対して、非常に高い水準で応えてくれるサービスです。

10日間のトライアルも可能なので、興味があれば是非登録してみてはいかがでしょうか。

https://www.safaribooksonline.com
Macでcomixを起動するまでにやったこと

新しくMacbook Proを購入して、初めてのMacを体験しているのだけれども、自炊した漫画を見る方法がなく、Ubuntuで使用していたComixを使用しようと思って色々ハマりながらインストールした体験記。
あ、Comixは漫画を読めるソフトです。

まずは、http://comix.sourceforge.net/download.html からSourceForgeへジャンプして、ダウンロードを行います。


<img width="590" alt="スクリーンショット 2018-11-24 7.23.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/10565/ddc2d06a-0623-702a-5c8f-da559999b3ab.png">
tar.gzを解凍すると、こんな感じのフォルダ構成になっていると思います。


このフォルダへターミナルで移動して、おもむろに

```shell-session
sudo python install.py install
```

とすると、

```shell
Python Imaging Library ... Not found
```

とかいうエラーが出ると思います。
Google先生のご指南に従い検索を進めて行くと、PILはもういないのじゃ…と言う驚愕の事実に目を背けながらも、その後継であるpillowなるものが互換性を保ってあると言う情報に希望を見出し、意気揚々とターミナルに向かって

```shell
pip install pillow
```

と打ってpillowをインストールするも、

```shell
Python Imaging Library ... Not found
```

のようにエラー変わらず途方に暮れる始末。
もしかしたらもう無理なのでは…？そう思って駄目元でinstall.pyを眺めてみると

```python:install.py
    try:
        import Image
        assert Image.VERSION >= '1.1.5'
        print '    Python Imaging Library ....... OK'
    except ImportError:
        print '    !!! Python Imaging Library ... Not found'
        required_found = False
```

と言うチェック処理がある。
自分の端末で

```python
import Image
```

とやっても、No module みたいなエラーが起こる。
でも、

```python
from PIL import Image
```

とすると、エラーは起きない。もしかして・・・

```python:install.py
    try:
        from PIL import Image
        assert Image.VERSION >= '1.1.5'
        print '    Python Imaging Library ....... OK'
    except ImportError:
        print '    !!! Python Imaging Library ... Not found'
        required_found = False
```

と書き換えてみたら、install.pyのこのチェックは通った！！！

しかしその後、この```import Image```が尽くコケてしまうことに気付く。
対症療法だが、これを一つ一つ修正していったらうまく行くか？

```shell
ag "import Image"
```

検索してみると

```
src/histogram.py
src/thumbnail.py
src/comix.py
src/thumbremover.py
src/thumbbar.py
src/image.py
src/library.py
```

出てきやがった！
クロロに追い詰められて後のないヒソカの形相でvimを開いて、ひたすら```from PIL```を詰め込んでいくだけの簡単な作業を実施。

その後、ターミナルで

```
comix
```

と叩けば、

<img width="1151" alt="スクリーンショット 2018-11-24 7.57.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/10565/c146264f-33ca-ebcc-4219-8a7b5d7d03f6.png">

画面が立ち上がった！
動作も問題ないっぽい。良かった良かった。
vim-auto-save で git commit 時の自動保存を無効化する

## はじめに

Vim で複数ペインを開いて開発していると、`:w` とかを打って保存するのが億劫になってきて、[vim-auto-save](https://github.com/vim-scripts/vim-auto-save) という自動保存プラグインをインストールしました。

いい感じに使えていたのですが、`git commit` 時のエディタを Vim にしていたこともあり、コミット時にも自動保存が走り、意図しないタイミングでコミットしてしまうことが何度かあったので、回避方法を調べてみました。

## tl;dr

取り急ぎ、こちらで対応できました。

```vim:.vimrc
if expand("%:p") =~ 'COMMIT_EDITMSG'
  let g:auto_save = 0
else
  let g:auto_save = 1
endif
```

`git commit` で編集できるコミットメッセージのファイル名が `COMMIT_EDITMSG` なので、ファイルパスにその文字列が含まれている場合は autosave を無効にする処理を `.vimrc` に入れました。

ちょっと限定的すぎるとは思うのですが、個人利用では今のところ困ってないので、この形にしています。

## auto_save_presave_hook を使う方法（うまくいっていない）

調べてみると、下記 issue で話題に上がっていた、保存前にフックを入れる処理があるようで、こちらが使えないかも試しました。
しかし、うまく動いてくれず、autosave が走ってしまいました。。

https://github.com/907th/vim-auto-save/issues/33

```vim:.vimrc
let g:auto_save_presave_hook = 'call AbortIfGitCommit()'

function! AbortIfGitCommit()
  if &filetype != 'gitcommit'
    let g:auto_save_abort = 1
  endif
endfunction
```

`gitcommit` の場合なら、autosave を abort するフラグを立てるという関数を、保存前のフックに設定しておく、というやりかたで書いてみたのですが、うまくフックしてくれず。。
別途時間があったら動かす方法を調べてみようと思います。

## 参考情報 

* [How to activate auto-save per filetype? · Issue #33 · 907th/vim-auto-save · GitHub](https://github.com/907th/vim-auto-save/issues/33)
* [usr_41 - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/usr_41.html)
Laravel(5.7)のパスワードリセット機能をAPIからキックする。


Laravelではmake authすれば登録やらパスワードリセットやら設定してくれますが、標準のルートではCSRFのtokenを要求されるため別途API用に専用のルートを作成して対応します。

###　追記

[Email Verifyとまとめた記事](https://qiita.com/zaburo/items/7fda85a6fd5f5568e936)にしました。そちらをご利用ください。

### 前提

make:authにより認証機能が設定されている。

```bash
php artisan make:auth
```

### Controller

ここではUserController.phpを作成して対応しますが、なんでもいいです。

```bash
php artisan make:controller UserController
```

実装します。sendResetLinkEmail()をオーバーライドすればいいようです。

```php:UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;

class UserController extends Controller
{
    use SendsPasswordResetEmails;

    public function __construct()
    {
        $this->middleware('guest');
    }

    public function sendResetLinkEmail(Request $request)
    {
        $this->validateEmail($request);

        $response = $this->broker()->sendResetLink(
            $request->only('email')
        );

        return $response == Password::RESET_LINK_SENT
            ? response()->json(['message' => 'Reset link sent to your email.', 'status' => true], 201)
            : response()->json(['message' => 'Unable to send reset link', 'status' => false], 401);
    }
}

```

### Route

ルートもお好みで。

```php:api.php
Route::post('forgot/password', 'UserController@sendResetLinkEmail')->name('forgot.password');
```

### 動作確認

上記route (http://localhost:8000/forgot/password) に対して、リセットしたいemailをpostする。
【SpringBoot】プロパティファイルを参照する方法

# 前書き
SpringBootでプロパティファイルの参照の仕方が分からず苦労したことがあったので記事にしました。
SpringBootで"Hello World"できる程度の知識があれば理解できる内容だと思います。

# ソースと解説
#### プロパティファイルを用意
クラスパスを通しているsrc/main/resourcesにプロパティファイルを用意します。
プロパティファイルの名前は何でもいいです。

```java:hogeConfig.properties
hoge.foo=foooooooo
hoge.bar=barrrrrrr
```

#### プロパティファイルのBeanを用意
@ComponentをつけてBean（Autowiredできるクラス）にします。
@PropertySourceでプロパティファイルの名前を指定します。
@ConfigurationPropertiesでプロパティのプリフィクスを指定します。
変数とsetterとgetterを記述します。

```java:HogeConfig.java
@Component
@PropertySource("classpath:hogeConfig.properties")
@ConfigurationProperties(prefix = "hoge")
public class HogeConfig {
    private String foo;
	// setter getter は省略
}
```
#### プロパティの値を参照する
ControllerやServiceクラスを用意します。
先ほど用意したBeanを@Autowiredでインジェクションします。
インジェクションしたBeanのgetterを呼びます。

```java:HogeController.java
@RestController
public class HogeController {
	@Autowired
    private HogeConfig hogeConfig;

    @GetMapping("/hoge")
    public String hoge() {
    	return hogeConfig.getFoo(); // foooooooo
    }
}
```
※フィールドインジェクションよりコンストラクタインジェクションが推奨されてるみたいです。

# 参考
[Spring @PropertySource example](https://www.mkyong.com/spring/spring-propertysources-example/)
[Spring Bootの@ ConfigurationPropertiesで型安全なプロパティ設定  ](https://blog.ik.am/entries/376)
[SpringでField InjectionよりConstructor Injectionが推奨される理由](http://pppurple.hatenablog.com/entry/2016/12/29/233141)
[neovimプラグイン] ipython実行環境を作った

neovimでpythonコードを書いている時に、エディタから抜けずにそのまま実行したくなります。 
[quickrun](https://github.com/thinca/vim-quickrun)や[asyncrun](https://github.com/skywind3000/asyncrun.vim)だと実行した後に対話的な変数の操作やデータの分析ができません。
Vimの学習も兼ねて、neovimの標準機能であるターミナルモード(Vim8にもありますが)を利用して編集中のPythonスクリプトを[Ipython](https://ipython.readthedocs.io/en/stable/)に渡して実行するプラグインを作ることにしました。 

[GitHubリポジトリ(szkny/Ipython)](https://github.com/szkny/Ipython)
　
## 概要

ターミナルモードを利用してipythonコンソールを呼び出します。
`:Ipython`コマンドで編集中のスクリプトを実行後、`<C-w>w`で操作ウィンドウを切り替えれば**対話環境に移れます**。
内部ではneovim標準のjobsend関数で`%run filename.py`をipythonに送ります。

- このプラグインでできること
    - Ipythonコンソールでスクリプトを実行 (実行後も変数、メソッドを保持)
    - 編集中スクリプトの部分実行 (ヴィジュアルモードで選択した領域の実行)
    - Ipythonの機能をおおよそ実行可能

#### デモ画面
![](https://github.com/szkny/Ipython/wiki/images/demo1.gif)

## インストール

[vim-plug](https://github.com/junegunn/vim-plug)の場合、`init.vim`に以下を追記  

```vimscript
Plug 'szkny/SplitTerm'
Plug 'szkny/Ipython'
```

neovimを開いて下記コマンドを実行  

```vimscript
:PlugInstall
```

## コマンド

| 使い方    | 説明                                                                       |
|:----------|:---------------------------------------------------------------------------|
| :Ipython  | 現在編集中のPythonスクリプトを実行する  (ipythonウィンドウが無ければ開く ) |
| :VIpython | Visual modeで選択している行を実行する  (ipythonウィンドウが無ければ開く )  |


## キーマッピング

`init.vim`に以下を追加。
(デフォルトではキーマップは設定されていません)

```vimscript
nmap  <leader>ip  :Ipython<CR>
vmap  <leader>ip  :VIpython<CR>
```

## オプション
Ipythonの起動オプションやインポートパッケージをinit.vimに記述できます。 
以下を`init.vim`にリストで定義。  

```vimscript
" ipythonコマンドのコマンドライン引数
let g:ipython_startup_options = ['--no-confirm-exit']

" ipython起動時実行するコマンドリスト
let g:ipython_startup_command = [
            \'from pylab import *',
            \'import pandas as pd',
            \'pd.options.display.max_rows = 10',
            \'pd.options.display.max_columns = 10',
            \'pd.options.display.precision = 3']

" ウィンドウ幅 ( 0 にすると自動で設定)
let g:ipython_window_width = 0
```

以下はデフォルト設定 

```vimscript
let g:ipython_startup_options = [
            \'--no-confirm-exit',
            \'--colors=Linux',
            \'--no-banner']

let g:ipython_startup_command = []

let g:ipython_window_width = 10
```

## 関数

| 名前                 | 説明                                   |
|:---------------------|:---------------------------------------|
| ipython#open()       | ipythonウィンドウを開く                |
| ipython#close()      | ipythonウィンドウを閉じる              |
| ipython#exist()      | ipythonウィンドウの存在確認            |
| ipython#run()        | 現在編集中のPythonスクリプトを実行する |
| ipython#run_visual() | Visual modeで選択している行を実行する  |
PyTorchで巨大テンソルのLossを計算していたらメモリ不足になった

#事の経緯
動画を処理する機械学習コードで

巨大なループの中で誤差を蓄積したかった

```python
for n in range(len(datalist)):
     
     (省略)
     loss = loss_fn(GroundTruth, output)
     loss.backward()
     losssum += loss
print(losssum/len(datelist))
```

するどどんどんメモリが圧迫されていき

out of memoryエラーに。。。。

#原因

lossテンソルをそのままコピーしていたために

losssum内に勾配データが蓄積されてしまったのが原因みたいだった

正しくは

```python
for n in range(len(datalist)):
     
     (省略)
     loss = loss_fn(GroundTruth, output)
     loss.backward()
     losssum += loss.detach()
print(losssum/len(datelist))
```

メモリ問題も解消

###教訓

学習に関係ないところにテンソルをコピーするときは

```python
tensor.detach()
#どうやらdetach()はコピー元と同じ記憶領域を共有しているみたいなので
tensor.clone()
#を推奨します！
```
jupyter notebookでcsvファイルを読み込む方法

jupyternotebookでcsvファイルの取り込みについてハマったので、備忘のためにメモします。


###環境
2系３系：3系（Python 3.7）
OS：macOS10.14.1

###web上のデータベースから取り込む時
```python
import pandas as pd
# csvの読み取り
df= pd.read_csv('http://○○/○○/○○/sample_dataset.csv')
print(df)
```
の形で出せる。

###ローカルのデータベースを取り込む時
```python
 import pandas as pd
# csvの読み取り
df= pd.read_csv("○○/friday2.csv")
print(df)
```
注意点としては、jupyterからuploadでファイルを取り込むという点。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/319067/7e318ecc-5526-8a1d-7b75-2322832164b2.png)


デスクトップに置いたファイルのパスを指定してもcsvを取り込むことはできないのでここで数時間ハマりました。



##その他tipes

###jupyterで今作ってるファイルのパス確認
上記ローカルのデータベースを取り込む際に、相対パスを書くためには自分のファイルがどこにあるかを知る必要がある。

それを調べるには

```python
import os
os.getcwd()
```
でファイルのある場所が確認できる。

###macでファイルパスを取得する方法
macでファイルパスを取得するときは、右クリック後にoptionを押すと”○○をコピー”から”○○のパス名をコピー”に変化するので、パス名をコピーするときはこの方法の方が楽。
Web制作に関するガイドライン集

# UI
- [Themes \- iOS \- Human Interface Guidelines \- Apple Developer](https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/)
- [Design \- Material Design](https://material.io/design/)
- [ウェブアクセシビリティ基盤委員会 | Web Accessibility Infrastructure Committee (WAIC)](https://waic.jp/)

# 命名規則
- [BEM — Block Element Modifier](http://getbem.com/)

# 非機能要件
- [システム構築の上流工程強化（非機能要求グレード）：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html)
Javascript基礎構文 -1-

# はじめに
私が必要だと感じた構文集です。

#出力
``` js
alert("Hello world!!");
document.write("Hello world!!");
```
> 括弧の中に出力したいデータを入れる

# コメント
``` js
/*
JAVA
SCIPT
*/

// Javascript
```
>`/* コメント */`となります。一行のときは`// コメント`でも出来ます。

#変数
``` js
x = 10;
x = "str";
```
> 他のプログラム言語と変わりない。
> 型は自動で判定してくれる。

#配列
``` js
var list = ["Apple", "Google"];
alert(list[0]); // Apple
alert(list[1]); // Google
```
> 変数名[インデックス番号]で呼び出せます。
> インデックスは0から始まります。

#入力
``` js
num = prompt("Please enter your number.","0");
```
> 第一引数に出力させたい値、第二引数に入力欄の初期値

#比較演算子
| 等しい | 等しくない | より大きい | より小さい | 以上 | 以下 |
|:--|:--|:--|:--|:--|:--|
| == | != | > | < | >= | <= |
> 条件式に使います
> ex) 10==10, 10>5, 7!=0

#条件分岐(if)
``` js
if (条件式) {処理}
else if (条件式) {処理}
else {処理}
```
> 条件式が真のとき処理が行われる

#条件分岐(switch)
``` js
switch(変数){
case 1: 処理 break;
case 2: 処理 break;
case 3: 処理 break;
︙
default: 処理 break;
```
> `case 値: 処理 break;` (変数==値)が真のとき処理が行われる。

#繰り返し(while)
``` js
while (条件式) {処理}
do {処理} while (条件式)
```
> 条件式が真の間に処理が行われる。
> do whileは必ず一回は処理が行われる。

#繰り返し(for)
``` js
for (処理A;条件式;処理B) {処理}
for (i=0;i<10;i++) {処理}
```
> 分かりにくいので具体例を書きました。
> 処理Aが最初に一度だけ実行され、それ以降は処理Bが条件式が真の間に実行されます。

#continueとbreak

``` js
for (i=0;i<10;i++) {
    if (i<7) {
        continue;f
    }
    document.write(i)
}
```
``` :result
789
```
``` js
for (i=0;i<10;i++) {
    if (i>6) {
        break;
    }
    document.write(i)
}
```
``` :result 
0123456
```
> `continue;` 後の処理を無視して一番上の処理まで戻ります。 
> `break;` 繰り返し処理から抜け出します。

# おわり
2時間前に深夜テンションでHelloWorldしたばかりの初心者なので、まだまだ知らないことばかりです。
続きはまたjavascriptに触れるときに書く予定です。
AWS Lambdaに使うPythonのpipでインストールしたライブラリを整理する

1. pip installするときに、vendorディレクトリを指定してインストールする。
`pip3 install requests -t apex/functions/notify/vendor`
（apexを使った例なのですが、notifyがLambda関数を指しています。）

2. AWS Lambdaの環境変数に以下の設定を加える。
変数：PYTHONPATH
内容：/var/runtime:/var/task/vendor
Python3.7 インストール　Ubuntu16.04LTS

Anacondaが便利で使っていたのですが、最近Anacondaがあることでいろいろなものがインストールできなくなり、OSからクリーンインストールしました。ついでにPython3.7もソースからビルドしてインストールしたので、そのときのメモです。

後のMake installで怒られるので、事前に以下をインストールします。
```
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev
sudo apt install libffi-dev
```
ちなみに、以下を実行しとけという説もあり。
```
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev \
    libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
```

[Python.org](https://www.python.org/downloads/release/python-371/)からソースをダウンロードします。

```
tar zxvf Python-3.7.1.tgz 
cd Python-3.7.1/
sudo ./configure --enable-optimizations
sudo make altinstall
```

```
python3.7 -V
```
とうつと、Python 3.7.1と返ってくるので、インストールが成功したようです。
Google Colaboratory の 90分ルールを回避したい。

#  Google Colaboratory の 90分ルール <sub>[[1]](https://qiita.com/enmaru/items/2770df602dd7778d4ce6)</sub> を回避する。 
## 1. Auto Refresh の導入 
chrome ウェブストアから、Auto Refresh <sub>[[2]](https://chrome.google.com/webstore/detail/auto-refresh/ifooldnmmcmlbdennkpdnlnbgbmfalko)</sub> を導入する。<img width="510" alt="スクリーンショット 2018-11-24 2.21.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/319071/96ce8706-25b2-b1eb-ed03-2e9b6ce85028.png">


## 2. Auto Refresh の実行
Auto Refresh を実行するために、下記の操作を行う。

1. 実行中のシートを再読み込みし、出現したダイアログをキャンセルする。<img width="419" alt="スクリーンショット 2018-11-24 2.29.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/319071/fbe95143-3027-e54a-1b69-291ac351ce0e.png">
2. 実行中のシートをさらに**もう一度**再読み込みし、出現したダイアログのチェックボックスにチェックを入れ、再読み込みをクリックする。<img width="455" alt="スクリーンショット 2018-11-24 2.30.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/319071/d44b35c4-52ae-11b8-b910-0ed0bb45ab5a.png">
3. 実行中のシートで、Auto Refresh を実行する。<br> <img width="298" alt="スクリーンショット 2018-11-24 3.05.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/319071/ca32ab94-5652-e4c9-fa81-58a5ae502220.png">

## 参考 : 
[1] [Google Colaboratoryの90分セッション切れ対策【自動接続】 ](https://qiita.com/enmaru/items/2770df602dd7778d4ce6)
[2] [Auto Refresh]( https://chrome.google.com/webstore/detail/auto-refresh/ifooldnmmcmlbdennkpdnlnbgbmfalko)
GCPでWordpressを立ち上げる手順(2018年11月)

# はじめに
Google Cloud Platform上でWordpressを立ち上げたときの手順を記します。
ここではMarketPlaceのソリューションを使用しました。

## 前提
GCPアカウントが作成済みであること
課金が有効なGCPプロジェクトを作成済みであること

# 手順

## GCPのコンソール画面
GCPにログインする。
https://cloud.google.com/

![console.png](https://qiita-image-store.s3.amazonaws.com/0/319068/c43081b1-964e-7667-24bc-a0e36560832c.png)

コンソール画面を開く。

## MarketPlaceの起動
![marketplace.png](https://qiita-image-store.s3.amazonaws.com/0/319068/4b972203-c502-08be-b662-969600d3c75b.png)


メニューからMarketPlace(※1)をクリックする。
なお、ピンをクリックすると、メニュー上部にショートカットが追加される。

※1 2018/7/18にCloud Launcherというサービス名から変更になりました
参考：[GoogleのCloud LauncherがGCP Marketplaceと改名](https://jp.techcrunch.com/2018/07/19/2018-07-18-googles-cloud-launcher-is-now-the-gcp-marketplace-adds-container-based-applications/)

## Wordpressのデプロイ
![wordpress.png](https://qiita-image-store.s3.amazonaws.com/0/319068/60ec98c1-d876-aa44-a698-7c1515966f80.png)

Wordpressをクリックします。

![kidou.png](https://qiita-image-store.s3.amazonaws.com/0/319068/a7e55bcb-8a1b-42bf-8934-8cef7a6793b5.png)

COMPUTE ENGINE上で起動 をクリックします。

![settei.png](https://qiita-image-store.s3.amazonaws.com/0/319068/8cc023c6-0617-b7a6-c2ee-d0aa842b559d.png)

Wordpressのデプロイ情報を入力します。
ここでは、次の設定で作成しました。

```
Deployment name: wordpress-management
Zone: us-central1-f
Machine type: vCPUx1
```

Administrator e-mail addressにはWordpressの管理者のメールアドレスを入力してください。
設定が入力したらDeployが開始します。
Deployの完了には数分かかります。

## Deployment Manager
![deploymentmanager.png](https://qiita-image-store.s3.amazonaws.com/0/319068/0c83aa80-243e-35f6-03ec-12a9c6bcdc20.png)

Deployが完了すると上記の画面に遷移します。
右上の赤枠にWordPressの認証情報が表示されます。
管理者アカウントや、MySQLユーザーはここを参照します。

Wordpressの管理画面を開くには、Log into the admin panel をクリックします。

## 管理画面
![admin.png](https://qiita-image-store.s3.amazonaws.com/0/319068/d497b02e-c36b-6d3a-0f6b-1ca59428b8f7.png)

管理画面を開きます。
言語設定をする場合は、サイドメニューからSettingsをクリックします。

## 言語とタイムゾーンの設定

![にほんご.png](https://qiita-image-store.s3.amazonaws.com/0/319068/3fc07fea-a4ba-8c24-7d44-ccfafeb22226.png)

言語とタイムゾーンの設定を行います。
ここでは次のように入力しました。

```
Site Language: 日本語
Timezone: UTC+9 
```

DateFormatとTimeFormatは好みで入力します。

## 確認
![previewe.png](https://qiita-image-store.s3.amazonaws.com/0/319068/568d5caf-f6a0-99b3-414e-457042a70158.png)

グローバルメニューのホームアイコンより「サイトを表示」をクリックします。


![スクリーンショット 2018-11-24 2.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/319068/30eb7f44-2601-5af4-1f7e-0ecf93d0378f.png)

Wordpressの画面が表示されれば完了です。

# 参考

[GCPのCloud LauncherでWordPressを構築する](https://gourmet-technology-crypto.jp/%E6%8A%80%E8%A1%93/gcp%E3%81%AEcloud-launcher%E3%81%A7wordpress%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)
Google Sheets API を使ってNodejsからスプレッドシートを操作

#要旨
・GoogleAppsScriptを使用しなくてもスプレッドシートを操作できる

・ヘッダを元に列を指定して値をセットする場合はGASの方がずっとやりやすい(必ず1行目にヘッダがなくてはダメ、大文字英字やアンダーバーを使った文字列のヘッダ指定ができない)

・6分の壁とか気にしなくていいのは楽

・GASよりは安定してる気がするがやはりまだ不安定感が残る

・NodejsからGoogle Sheets APIを使う用のパッケージが複数あるが、いずれも若干のバグあり
（今回使用したパッケージは一括更新のbulkUpdateCellsが動作しない）

#使用パッケージ
google-spreadsheet (ver. 2.0.6)
https://www.npmjs.com/package/google-spreadsheet

#シートサンプル
Google Sheet API Qiita説明用サンプル
https://docs.google.com/spreadsheets/d/1pNmXvx5vL2pEICe6_2PVFfuQ2WYoRaVA7K05i9s8-Aw/edit?usp=sharing

#事前注意
こちらの記事を元にAPI認証情報のJSONを取得しておいてください
（大変参考にさせて頂きました。この場を借りてお礼申し上げます）
https://qiita.com/howdy39/items/ca719537bba676dce1cf

#コード
```sample.js
async function sample() {
	try {
		const GoogleSpreadsheet = require('google-spreadsheet');
		const creds = require('./google-generated-creds.json'); //API認証情報JSONを同ディレクトリに置いておく

		var spreadsheet_id = '1pNmXvx5vL2pEICe6_2PVFfuQ2WYoRaVA7K05i9s8-Aw'; //スプレッドシートのID
		var worksheet_name = "シート2"; //操作したいワークシートのシート名

		var book = new GoogleSpreadsheet(spreadsheet_id); //インスタンス
		var spreadsheet; //スプレッドシート
		var worksheet; //ワークシート
		var rcnt1; //ループカウンタ1
		var rcnt2; //ループカウンタ2

		//認証を通しスプレッドシートの情報取得して外部スコープの変数に保存
		book.useServiceAccountAuth(creds, function(error) {
			if (error !== null) {
				throw new Error(error);
			}
			book.getInfo(function(error, data) {
				if (error !== null) {
					throw new Error(error);
				}
				spreadsheet = data;
			});
		});

		//指定した名前のスプレッドシートの値を更新する
		for (rcnt1 in spreadsheet.worksheets) {
			if (spreadsheet.worksheets[rcnt1].title === worksheet_name) {
				spreadsheet.worksheets[rcnt1].getRows({
					offset: 1, //何も指定しなければ2行目から読み込むので1を指定すると3行目から読み込む
					limit: 20, //途中で空白行が現れれば20行以下でも読み込み中止
				}, function(error, rows) {
					if (error !== null) {
						throw new Error(error);
					} else {
						for (rcnt2 in rows) {
							rows[rcnt2].sku = "new_sku"; //1行目の値が"sku"の列の(rcnt2 + 1 + offset)行目の値を"new_sku"に変更
							rows[rcnt2].price = 19800;
							rows[rcnt2].save();
						}
					}
				});
			}
		}

		return Promise.resolve(0);
	} catch(error) {
		console.error(error);
		return Promise.reject(1);
	}
}


```
[C]ファイルの内容を取得して変数に文字列として格納する

**勝手な解釈が詰まってますので解説的な部分はアテにしないでください。**<br>
C言語でファイルの内容を取得して変数に格納するのが意外と手こずったので備忘録として置いときます(筆者がクソザコナメクジだからとか言わないで)。Cをワチャワチャすると自分の実力不足が露呈しますね…
# コード
```c
#include<stdio.h>
#include<stdlib.h>

int main(void){
    FILE *file_contents;
    char *strp;

    if((file_contents = fopen("hoge.txt", "r")) == NULL) {
        fprintf(stderr, "file open failed\n");
        exit(1);
    }

    fseek(file_contents, 0, SEEK_END);
    size_t file_size = ftell(file_contents);
    fseek(file_contents, 0, SEEK_SET);

    if((strp = malloc(file_size)) == NULL) {
        fprintf(stderr,"malloc error\n");
        exit(1);
    }

    for(int i = 0; i < file_size; i++) {
        strp[i] = fgetc(file_contents);
    }
    printf("%s", strp);

    free(strp);

    return 0;
}
```

## 解説的な
`fseek()`で第三引数に`SEEK_END`を指定するとファイル位置表示子(カーソル的なもの)をファイルの内容の一番最後に置いてくれます。そして`ftell()`はそのファイル位置表示子の値、つまりカーソル的なものの位置を読んでくれます。ファイル内容の一番最後の位置の値は、そうです、ファイルのサイズと同じですね。<br>
`fseek`で第三引数に`SEEK_SET`を指定すると、カーソルを一番最初に置いてくれます。<br>
で、`malloc()`でファイルサイズ分メモリを確保し「箱」を用意します。ファイルサイズ分forで回して`fgetc()`でファイルから1文字ずつ取得し、その文字をどんどん配列`strp`に入れていきます。(ファイルから1文字ずつ取得するのに、カーソルをその場から一つずつ移動させながら読むため、カーソルが一番最後だと**虚無**を読むことになってしまいます。わざわざ一番最初に置くようにしたのはそのためです。)<br>
あとは出来た`strp`を文字列として表示させるなり焼くなり煮るなり何でもしてください、最後に`free()`でメモリを開放し工事完了です…

### 「最初に`char strp[1024];`とかでメモリを確保すればいいじゃん」
余った分のメモリがもったいないしファイルサイズが最初に確保した分より多かったらまずい。
**「そこのお前！メモリ1バイト分が食うメモリはメモリ1バイト分だぜ」**
React-native環境構築-備忘録



# はじめに
ios開発をしたいな〜と思い、色々ググったらReactnativeのことを知りました。
環境構築にハマったので、その葛藤を備忘録に残します。

あくまで個人の備忘録ですが、困っている人の助けになればいいなと思います。
初めての投稿ですのでお手柔らかにお願いします。

# 目次
- はじめに
- 開発環境
- node
- watchman
- インストール
- ハマった...
- 対策
- 結果
- 参考

# 開発環境
Mac OS X
(windowsのかたごめんなさい)
# node・npm
- v11.2.0
- 6.4.1

# watchman
watchmanをインストールします。

```
$ brew install watchman
```

# インストール
React Native CLIをインストールします。

```
$ npm install -g react-native-cli
```
ですが、ここでハマりました。


# ハマった...
```
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/Users/userName/.npm-global/lib/node_modules/react-native-cli'
npm ERR!  { [Error: EACCES: permission denied, access '/Users/userName/.npm-global/lib/node_modules/react-native-cli']
npm ERR!   stack:
npm ERR!    "Error: EACCES: permission denied, access '/Users/userName/.npm-global/lib/node_modules/react-native-cli'",
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/Users/userName/.npm-global/lib/node_modules/react-native-cli' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).
```

# 対策




1.グローバルインストールのためのディレクトリを作成する

```
$ mkdir ~/.npm-global
```
2.新しいディレクトリを使う設定をnpmで行う

```
$ npm config set prefix $'~/.npm-global'
```
3.~/.profileを開くか作成し，以下の行を追加する

```
$ export PATH=~/.npm-global/bin:$PATH
```
4.3の変更を反映する

```
$ source ~/.profile
```

#結果
もう一度インストールします。

```
$ npm install -g react-native-cli
```

お！？さっきとは違う

```
$ /Users/userName/.npm-global/bin/react-native -> /Users/userName/.npm-global/lib/node_modules/react-native-cli/index.js
+ react-native-cli@2.0.1
updated 1 package in 1.937s
```

無事インストールできました！！

```
$ react-native -v
react-native-cli: 2.0.1
react-native: n/a - not inside a React Native project directory
```
```
$ react-native init sample
```
上記のコマンドでフォルダを作成して実行します


```
react-native run-ios
```

<img width="320" alt="スクリーンショット 2018-11-24 1.34.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/312777/db2e96f0-399f-9f09-21f5-0a9fe7e06527.png">
# 参考
- [【React Native入門】Java Scriptでアプリ作ろう【Reactやったことない人向け】１](https://qiita.com/YutamaKotaro/items/dd7846c6db15e2307daa)
- [macで1からReactの環境構築をするのだ](https://qiita.com/spice/items/b75afb607f1d2e1172a2)
- [【React Native勉強メモ】環境構築手順](https://qiita.com/akatsukaha/items/4f1615b4ee1ddc214c80)
- [macでreact nativeの環境構築をして、iosアプリのhello worldをする](https://joppot.info/2016/03/16/3059)
- [npmでpermission deniedになった時の対処法[mac]](https://qiita.com/okoysm/items/ced3c3de30af1035242d)

参考にさせて頂いた皆様、ありがとうございます。
GASのdoGetとdoPostをcurlで試してみた

# やりたいこと

スプレッドシートでデータの出し入れを試したい！
curlでスプレッドシートからデータの取得、データの挿入をやってみる。

- fruitとpriceの列を持つシートから、全データを引っ張ってくる
- fruitとpriceをpostしてシートの末尾にデータを追加する

難しいことはしない（大事）

# 参考にさせていただいた記事
[3分で API を作って世の中にデプロイするライブコーディング〜今日から君もスピードスターエンジニア〜](https://qiita.com/numanomanu/items/7bb6542961a2c567f05c)

# 用意したもの

googleスプレッドシート1枚


# 初期データ
![ss1](https://qiita-image-store.s3.amazonaws.com/0/224357/c8c2fda3-a3c3-19cb-f0ce-401be4d28c87.png)

# スクリプト

上バーの[ツール]→[スクリプト エディタ]で開く。

公開するときは、**都度**、[公開]→[ウェブアプリケーションとして導入]でプロジェクトバージョンを新規作成で新しくすること。（詳しくは↑の参考にさせていただいた記事へ）

![SnapCrab_NoName_2018-11-24_1-11-28_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/224357/5190b978-230b-04b1-a03d-c77d8ea1d95c.png)


## doGet

### コード
```javascript:doGet
function doGet(e) {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var sheet     = ss.getSheetByName('シート1');
  var sheetData = sheet.getRange('A2:B' + sheet.getLastRow()).getValues();

  // データの成形
  var responseList = [];
  sheetData.map(function(d) {
    responseList.push({ fruit: d[0], price: d[1] });
  });

  // レスポンス
  var response = {
    data: responseList,
    meta: { status: 'success' }
  };
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
```

## 実行と結果
```bash:実行
curl -L "エンドポイントURL"
```
```bash:結果
{
    "data":[
        {"fruit":"apple","price":150},
        {"fruit":"banana","price":100},
        {"fruit":"cheese","price":300}
    ],
    "meta":{
        "status":"success"
    }
}
```



# doPost

## コード
```javascript:doPost
function doPost(e) {
  var ss       = SpreadsheetApp.getActiveSpreadsheet();
  var sheet    = ss.getSheetByName('シート1');
  var PostData = JSON.parse(e.postData.contents);

  // 行の最後に値を追加
  sheet.appendRow([PostData.fruit, PostData.price]);
}
```

## 実行と結果
```bash:実行
curl -X POST -H "Content-Type: application/json" -d '{"fruit":"pine", "price":"800" }' -L "エンドポイントURL"
```
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/224357/97a005f7-158f-3075-e4c7-cec4ad79b205.png)
↓こうなる
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/224357/c5e1d76e-0810-cc23-50d1-68594f585728.png)

# 所感

取り出したいデータの指定とか小難しいことしないならばとても簡単で手軽！！
スピードは出ないから当然まじめなサービスには不向き。
DB設定とかの面倒を省きたいシーンで活躍してくれそう。
[Python3]文字列に特定の文字を検索する方法(追試)

# はじめに

Pythonの勉強はもっぱらpaizaの[コードガールこれくしょん](https://paiza.jp/cgc)ないしは[スキルチェック](https://paiza.jp/challenges)を利用していたのですが、今日は~~大昔に全然意味がわからなくて挫折した~~checkioの課題に挑戦しました。

https://py.checkio.org

ちなみにコードガールこれくしょんはクッソ簡単な構文を早打ちするだけのゲームなので、Python触ったことない人の第一歩としてはともかく、ある程度慣れた人がやるとただの作業になります。
あと、この記事以降もですが、断りが無ければ基本的にPython3のことを扱います。

# 文字列検索（matchとsearch）
他にもあるのは知っていますが、基本的にここに書く記事では自分が触ったことを書きます。
（網羅的に知りたい人は以下の公式ドキュメントか、他の詳しい方の記事を参照願います）

https://docs.python.jp/3/howto/regex.html#performing-matches

---

## 文法のおさらい

|メソッド|説明|構文|
|:--|:--|:--|
|match|文字列の__先頭__に検索文字が含まれるか探す|match("検索文字","文字列")|
|search|文字列の__中__に検索文字が含まれるか探す|search("検索文字","文字列")|

## 正規表現で検索文字を複数指定する
「とある文字列に英字大文字・小文字・数字が一文字以上含まれる」というのをやりたかったで色々調べました。
(参照リンク)
https://docs.python.jp/3/howto/regex.html#compiling-regular-expressions
https://qiita.com/wanwanland/items/ce272419dde2f95cdabc

結論から言うとできなかったので、条件文を三つ繋げるクソダサコードを書きました。
正規表現については、時間があったら（機会があったら）また調べるかもしれません。

## 調べる過程でわかったこと
- 英字小文字・英字大文字・数字が一文字以上順番に並んでいること

`re.search("[a-z][A-Z][0-9]+", password)`

- 英字小文字・英字大文字・数字のどれかが一文字以上含まれていること

`re.search("[a-z]|[A-Z]|[0-9]+", password)`

# 最終的に書いたコード
    def checkio(data: str) -> bool:
        import re
        passwd = data
        # 文字数チェック
        if int(len(passwd)) < 10:
            return False
        # 文字列チェック
        if bool(re.search("[a-z]+", passwd)) and bool(re.search("[A-Z]+", passwd)) and bool(re.search("[0-9]+", passwd)):
            return True
        else:
            return False
Linuxコマンド スクリーンコマンド [screen]

#目的

- linuxコマンドであるscreenに関して記入する
- linuxやshellscript初心者向けの記事、プロフェッショナルには向かない記事になる
- ビルドを裏で実行し開発環境がlinuxのすべての人の睡眠時間を長くする

#この記事のターゲット

- 開発環境にlinuxを用いるすべての方
- Tera Termn等のリモートログオンクライアントを用いてlinuxで作業を実施してる方
- リモートでlinuxに入り、ビルドなどの長時間高負荷作業を実施している方
- 業務でlinuxを使用されている方
- linux初心者の方

#screenコマンドとは

簡単に説明すると、ターミナル画面をもう一増やすようなイメージ
リモートログオンクライアントではバックグラウンド実行しているようなイメージ

#考え方

リモートでscreenを実行する時のイメージは「バックグラウンド実行用にもう一つ世界を作ってあげる」である
パラレルワールド(平行世界)を作る感じである

#流れ

リモートでscreenコマンドを実行したときの流れを記載する
※分かりやすいように通常ターミナル画面(コマンド打つ画面)を「現実世界」、screenコマンドにて作成されるセッション(バックグラウンド実行するところ)を「平行世界」と呼称し説明する

現実世界で平行世界の名前を指定し、平行世界を作ってあげる
↓
名前を指定した瞬間平行世界に飛ばされる
↓
ビルドなどの高負荷作業の実行
↓
平行世界から現実世界へ戻る
↓
現実世界のウインドウをとじても平行世界の作業は実行され続ける
↓
平行世界の作業結果は現実世界にも反映される

#基本形

```shell
$ screen [オプション]
```

#これさえ知っておけばとりあえずscreenが使いこなせるコマンド集
1. 平行世界を作るオプション

  ```shell
  $ screen -S 「平行世界の名前」
  ```

  例) $ screen -S miriwo
  →「miriwo」という名前の平行世界が作成される
  sceenコマンドで最初に打つコマンド
  バックグラウンドで作業する場所を作ってあげよう
  同じ名前をつけてもOK→名前の後に数字がつき、その数字で見分けられる

1. 平行世界の状態を確認するオプション

  ```shell
  $ screen -ls
  ```

  screenで作った世界がどの様な状況か確認できる

1. 平行世界から現実世界へ「一時的に」戻ってくる方法(デタッチ)
「ctrl」＋「a」押した後に「d」
「デタッチ」と呼ばれる方法
ビルドやスクリプトを動かしてリモートターミナルを閉じたいときに使う
この方法で通常世界に戻れば平行世界でも作業がどんどん進む

1. すでに存在する平行世界に行くオプション

```shell
$ screen -r 「平行世界の名前」
```
例) $ screen -r miriwo
→平行世界「miriwo」に行くことができる
3.の方法で一時的に平行世界を抜けたときに使うオプション
主に高負荷作業終わったかなーとログを見に行くときに使う

1. 平行世界を閉じる
「ctrl」+「d」
作成した平行世界を完全削除する
完全削除するため、平行世界で行われている作業も必然的に止まる
3.の一時的な帰還と押すキーが似ているため注意が必要！
3.と5.を実行する際は間違えないように注意すること

#まとめ
- screenコマンドを駆使すればリモートターミナルを閉じても作用が実行され続けるため、帰宅時に自分のPCをシャットダウンする際にも使える
- 業務終了時間近くに高負荷長時間作業の「かけ逃げ」が実施できる。(エラーで作業が止まることはもちろんあるので、計画的に予定に余裕をもって、かけ逃げをすること)

時間を有効活用して早く帰宅したくさん寝よう！！
systemd の Unit ファイルの書式を Docker でチェックする

systemd の Unit ファイルを作ってもちゃんと動くかどうか確認するためにサーバに配置しなければならないのが面倒すぎるので Docker で構文チェックする方法を調べた。

CentOS7 標準の Docker イメージには systemd が入っていないが、systemd 用のイメージが `centos/systemd` に用意されているのでこれを使う。

まずは Unit ファイルを作成する。

```bash
$ mkdir systemd/
$ vim systemd/your-app.service
```

作成した `systemd/` マウントして systemd 関連のコマンドを実行する。

```bash

# 書式チェック
$ docker run --rm -v `pwd`/systemd:/systemd centos/systemd systemd-analyze verify /systemd/your-app.service

# 起動設定
$ docker run --rm -v `pwd`/systemd:/systemd centos/systemd systemctl enable /systemd/your-app.service
Created symlink /etc/systemd/system/your-app.service, pointing to /systemd/your-app.service.

```
Selenium Java + HtmlUnit Driver トラブルシューティング

[Selenium Java](https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java) と [HtmlUnit Driver](https://mvnrepository.com/artifact/org.seleniumhq.selenium/htmlunit-driver) を使ってヘッドレスなUIテストを実装した際にはまったポイントをまとめています。

#### 検証したバージョン

```xml
<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium-java</artifactId>
	<version>3.8.1</version>
</dependency>
<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>htmlunit-driver</artifactId>
	<version>2.29.0</version>
</dependency>
```

#### (1) 要素のクリックができない

##### 現象

要素をクリックするために `WebElement#click` を呼び出すと、標準出力に `Exception invoking getScreenY` という文字列が出力され、クリック処理が実行されない。

##### 原因・解決策

実際には以下の例外が発生して、それがキャッチされて上記の文字列が出力されている。

```
java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.countMatches(Ljava/lang/CharSequence;C)I
```

この例外はCommons Langのバージョンが古いため、HtmlUnitが利用しているメソッドが存在しないことで発生している。

解決するには、`mvn dependency:tree` もしくは[依存関係のドキュメント](http://htmlunit.sourceforge.net/dependencies.html)を参照して、HtmlUnitが依存するCommons Langのバージョンに合わせればよい。（HtmlUnit2.29の場合は Commons Lang 3.7）

#### (2) NoClassDefFoundErrorが発生する

##### 現象

テストを実行すると以下のスタックトレースが出力される。

```
java.lang.NoClassDefFoundError: org/apache/http/cookie/CookieSpecProvider
	at com.gargoylesoftware.htmlunit.WebClient.createWebConnection(WebClient.java:2060)
	...
```

##### 原因・解決策

この問題もHtmlUnitが依存するHttpClientのバージョンが古いことが原因のため、バージョンを合わせればよい。（HtmlUnit 2.29 の場合はHttpClientLang 4.5.3）
Googleカレンダーを他ユーザーと共有する方法

##この記事のゴール
Googleカレンダーを他ユーザーと共有する。
予定の編集を他ユーザーも出来るようにする。
既存のカレンダーではなく、新規で共有用のカレンダーを作成する。

##手順
- PCから[Googleカレンダー](https://calendar.google.com)にアクセス（アプリからはカレンダーの作成機能と共有機能はサポートされていない）
- ページ左側の [マイカレンダー] の上にある 追加アイコン「＋」 > [新しいカレンダー] の順にクリック
- カレンダーの名前を追加
- [カレンダーの作成] をクリック
- ページ左側の [マイカレンダーの設定] セクションにある、作成したカレンダーの名前をクリック
- [アクセス権限] セクションのプルダウンメニューからオプションを選択
- 共有相手を[特定のユーザーとの共有]セクションで[ユーザーを追加]をクリック
- ユーザーを追加して[送信]
- ユーザーの権限を設定
 - 今回は、自分のみ [変更および共有の管理権限] に設定、他ユーザーは[予定の変更権限]に設定

※スマートフォンまたはタブレットで新しいカレンダーを表示するには、同期をオンにしておく必要があるので注意

##設定できる権限
####変更および共有の管理権限
- 共有設定を変更
- 予定を追加、編集
- 限定公開の予定を含むすべての予定の詳細を表示
- カレンダーのタイムゾーン設定を表示
- カレンダーを完全に削除
- カレンダーの[ゴミ箱]から予定を復元または完全に削除

####予定の変更権限
- 予定の追加、編集
- 限定公開の予定を含むすべての予定の詳細を表示
- カレンダーのタイムゾーン設定を表示
- カレンダーの[ゴミ箱]から予定を復元または完全に削除

####閲覧権限（すべての予定の詳細）
- 限定公開以外のすべての予定の詳細を表示
- カレンダーのタイムゾーン設定を表示

####予定の時間枠のみを表示（詳細を非表示）
- カレンダーで予定が追加されている時間と空いている時間を法事することはできる、予定の名前や詳細を表示することはできない

##おわり
意外と簡単:kissing:
EC2 (CentOS) に Emacs-26.1 を導入してパッケージを扱えるようにするまでの手順

(2019 7/13 追記)
※ 私の[ブログ](https://suwaru.tokyo/%e3%80%90centos-ubunu%e3%80%91emacs%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95%e3%80%90ec2%e3%80%91/)で Ubuntu も含め、もう少しわかりやすい記事にしました

# EC2 に Emacs-26.1 を導入してパッケージを扱えるようにするまでの手順

初心者には割と鬼門なのに調べてもあまり載っていなかったので

## 環境

- Amazon Linux 2 AMI (HVM), SSD Volume Type 
- emacs-26.1

## セキュリティグループ

**HTTPS** でリポジトリからパッケージインストールする場合は EC2 のセキュリティグループでポート **443** を許可しておいた方がいいですが、環境設定がラクなので今回は **HTTP** でパッケージインストールする方法を試してみます

## インストール

```sh
# gcc / make / ncurses-devel をインストール
sudo yum -y install gcc make ncurses-devel
cd /usr/local/src

# emacs-26.1 ダウンロード
sudo wget http://ftp.gnu.org/pub/gnu/emacs/emacs-26.1.tar.gz
sudo tar zxvf emacs-26.1.tar.gz
cd emacs-26.1
sudo ./configure --without-x --with-gnutls=no
sudo make
sudo make install

# パスが通っていても権限を与えておかないと他の emacs が起動することがあるので注意
sudo chmod 777 /usr/local/bin/emacs-26.1
```

知らない間に設定ファイルが作られていることがあるので、あったら干渉しないよう削除しておきます

```sh
rm ~/.emacs
rm ~/.emacs~
```

## パッケージを設定する

- `M-x package-refresh-contents` のあとに `M-x package-list-packages` してもリストに何も反映されていないとき
- パッケージのインストールを行うとき `could not create connection to melpa.org:443` など発生するとき

**HTTP 系のリポジトリ**を登録しておけば前者後者どちらの問題も解決します

```:~/.emacs.d/init.el
;;
;; パッケージ読み込み
;;

(require 'package)

;; HTTPS 系のリポジトリ
;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
;; (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
;; (add-to-list 'package-archives '("marmalade" . "https://marmalade-repo.org/packages/") t)

;; HTTP 系のリポジトリ
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(add-to-list 'package-archives '("ELPA" . "http://tromey.com/elpa/") t)

;; marmalade　は HTTP アクセスすると証明書エラーでフリーズするので注意
;; (add-to-list 'package-archives  '("marmalade" . "http://marmalade-repo.org/packages/") t)

(package-initialize)
```

### 他に書いた記事

- [Mac 環境の Emacs インストールを丁寧に説明してみる](https://qiita.com/El_Programdear/items/0908be8a626f26bf72e1)
簡単に試せるNumpyでの線形計算コード➀(初級編)

## Numpyとは？
数値計算を行うための関数を提供するパッケージです。機械学習やディープラーニングの処理にはベクトル(配列)や行列の計算が頻繁に必要になります。

## 実際に計算をやってみる

### ・Numpyのインポート
Numpyで計算を行うにあたり、まずNumpyライブラリをインポートします。
(※Numpyがインストール済みと仮定し、筆者はJupyterNotebookで実装しています)


~~~Python
import numpy as np
~~~

#### ・まず1(行)×3(列)の行列を出力してみる
入力

~~~Python
a = np.array([1,2,3])
b = np.array([4,5,6])
print('a =', a)
print('b =', b)
~~~


出力

~~~Python
a = [1 2 3]
b = [4 5 6]
~~~


#### ・足し算してみると
入力

~~~Python
c = a + b
print('c =',c)
~~~

出力

~~~Python
c = [5 7 9]
~~~

となり、aとbが足し算されていることが確認できます。



#### ・3(行)×3(列)の行列を足し算する
入力

~~~Python
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
y = np.array([[7,8,9],[1,2,3],[4,5,6]])
z = x + y

print('x =', x)
print('y =', y)
print('z =', z)
~~~


出力

~~~Python
x = [[1 2 3]
 [4 5 6]
 [7 8 9]]
y = [[7 8 9]
 [1 2 3]
 [4 5 6]]
z = [[ 8 10 12]
 [ 5  7  9]
 [11 13 15]]
~~~

下記のような行列が出力されていることを確認しました。


$$
x =
\begin{pmatrix}
1 & 2 & 3 \\\ 
4 & 5 & 6 \\\
7 & 8 & 9
\end{pmatrix}
y =
\begin{pmatrix}
7 & 8 & 9 \\\ 
1 & 2 & 3 \\\
4 & 5 & 6
\end{pmatrix}
z=
\begin{pmatrix}
8 & 10 & 12 \\\ 
5 & 7 & 9 \\\
11 & 13 & 15
\end{pmatrix}
$$
macOS MojaveのiTermでPyAutoGUIを使用する

自分がハマったのでメモ程度に
PyAutoGUIという、マウスやキーボードを操作するPythonモジュールがありますが、macOS Mojaveでは設定を変更しないと上手く動かないです。(もしかしたらもう少し前のOSから必要だったかも)

設定からセキュリティとプライバシーを選び
<img width="664" alt="スクリーンショット 2018-11-24 0.01.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/acd0928c-21f5-85b5-5835-8a3a47fe9492.png">

左下の南京錠をクリックし、ロックを解除して、プライバシーのタブを選び、左ペインからアクセシビリティを選択し、iTermにチェックを入れる
<img width="663" alt="スクリーンショット 2018-11-24 0.01.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/82d67c34-94e5-e413-c862-90a34a71bf0e.png">
【AWS+Ubuntu16.04】MeCab環境を入れるbash書いたよ！

AWSに自然言語処理のMeCabをインストールする時に色々調べて、サイトの内容を試したりしていったのですが、前提条件がわからなかったり、いくつかエラーが出てしまったので、最短で環境を完成させるインストールbashを書きました。

AWSで建てたばかりのUbuntuインスタンスで起動確認できています。

# インストールBash
```bash:natural-language-requirements.sh
#!/bin/bash
sudo apt update
sudo apt upgrade -y
sudo apt install libmecab2 libmecab-dev mecab mecab-ipadic mecab-ipadic-utf8 mecab-utils
sudo apt install python3-pip -y
sudo apt install swig -y
sudo pip3 install mecab-python3
```

# MeCabインストールでエラーでるパターン
MeCab環境構築でエラーが出た！という記載を見ていると、下記の2つで解決できることが多かったので補足として載せておきます。

## swigインストールを行っていない
swigをインストールしないとパッケージインストールでエラーが出るので、下記のコマンドが必要です。

```bash
#!/bin/bash
sudo apt install swig -y
```

## pipでエラーが出る
pipでのインストールの場合、環境の構築状況によりエラーが発生するため、pip3でインストールするとうまくいくことが多いです。

```bash
#!/bin/bash
sudo pip3 install mecab-python3
```
InvocationName must not be null or empty.エラーコード: MissingInvocationName

[Alexa developer console](https://developer.amazon.com/ja/alexa)で「モデルの保存」を押したらこのエラーがでた。
同じ事象に遭遇した方の助けになるといいなと思って恥ずかしいけどかいときまふ。


## エラーコード

[Alexa developer console](https://developer.amazon.com/ja/alexa)にて、新しく作成したスキルの「モデルを保存」をクリックした時に、
「InvocationName must not be null or empty.エラーコード: MissingInvocationName」
というエラーが出た。

→![スクリーンショット 2018-11-23 23.17.28.png](https://qiita-image-store.s3.amazonaws.com/0/173392/28d95e79-e6d6-9635-7417-7d298884f485.png)


カスタムスロットを追加した時に保存しようとしてこうなったんだが、それを消しても、「モデルを保存」をすると同様のメッセージが消えない。やべえ！

## 直し方

このエラーを解消するには、「呼び出し名」を書く必要があります。


![スクリーンショット 2018-11-23 23.28.08.png](https://qiita-image-store.s3.amazonaws.com/0/173392/07dcaff9-6d4f-a1d6-a0e5-05ec65b38472.png)
(1) 「呼び出し名」の字のあたりをクリック
(2) スキルの呼び出し名欄が未記入のはずなので、書き込む

↓

![スクリーンショット 2018-11-23 23.31.13.png](https://qiita-image-store.s3.amazonaws.com/0/173392/f96dc990-ea51-156f-9e2b-9ffcaa8ee920.png)


↓

![スクリーンショット 2018-11-23 23.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/173392/079e6367-1cf5-b9b6-be49-3baa2ccea6b4.png)

できた！


## 補足

- そういえば、去年、このツールが日本語化する前は、呼び出し名は Invocation Nameって名前だった。エラーメッセージだけそれで残ってるっぽい。




以上です！
Robolectric で Content Provider をテストする

#概要
Robolectric を使って、自作の Content Provider をテストする方法

#注意事項
この記事はRobolectric Version 3.8 の使用を前提にしています。
Version 4.0 以後、あるいは、Version 3.3以前ではAPIが変わっていると思います。

#コード例
```kotlin:ItemProvider.kt
class ItemProvider : ContentProvider() {

    private lateinit var openHelper: MyDatabaseHelper

    override fun onCreate(): Boolean {
        openHelper = MyDatabaseHelper(context, "mydb", null, 1)
        return true
    }

    override fun insert(uri: Uri, values: ContentValues): Uri? {
        val db = openHelper.writableDatabase
        val i = db.insert("main", null, values)
        return ContentUris.withAppendedId(uri, i)
    }

    override fun query(uri: Uri, projection: Array<String>?, selection: String?,
                       selectionArgs: Array<String>?, sortOrder: String?): Cursor? {
        val db = openHelper.readableDatabase
        return db.query("main", projection, selection, selectionArgs, null, null, null)
    }

    // 以下コンテンツプロバイダで実装必須なメソッドが並ぶ
}
```

上の例は自作コンテンツプロバイダの例です。
内部ではSQLiteのデータベースを使っています。
以下の表のような、商品と値段のデータを保存するコンテンツプロバイダとします。

|_id|ITEM|PRICE|
|---|----|-----|
|1  |apple|100|
|2  |banana|200|

このコンテンツプロバイダに対するテストクラスの例は、以下のコードです。

```kotlin:ItemProviderTest.kt

class ItemProviderTest {

    private var resolver: ContentResolver? = null

    @Before
    fun setUp() {
        resolver = RuntimeEnvironment.application.contentResolver
    }

    private fun insertApple() {
        val values = ContentValues()
        values.put(ItemContract.Items.ITEM, "apple")
        values.put(ItemContract.Items.PRICE, 100)
        resolver?.insert(ItemContract.Items.CONTENT_URI, values)
    }

    @Test
    fun insertAndQueryApple() {
        insertApple()
        val projection = arrayOf(ItemContract.Items.ITEM, ItemContract.Items.PRICE)
        val selection = "${ItemContract.Items.ITEM} = ?"
        val selectionArgs = arrayOf("apple")
        val cursor = resolver?.query(
                ItemContract.Items.CONTENT_URI,
                projection,
                selection,
                selectionArgs,
                null)
        cursor?.use {
            it.moveToNext()
            val index = it.getColumnIndex(ItemContract.Items.PRICE)
            val price = cursor.getInt(index)
            assertEquals(100, price)
        }
    }
}
```

Robolectric を使っているので、このテストはAndroid実機ではないJVM上で実行できます。