OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt.jsでCookieを使って閲覧したデータを取得する方法

## Nuxt.js専用のモジュールのcookie-universal-nuxtを使用

Nuxt.js用のCookieを扱うためのモジュールがあるので、こちらを利用します。

[cookie-universal-nuxt](https://www.npmjs.com/package/cookie-universal-nuxt)

## 導入

対象のプロジェクト下で

```bash
yarn add cookie-universal-nuxt
or
npm install --save cookie-universal-nuxt
```

nuxt.config.jsの設定

```js:nuxt.config.js
modules: [
    ['cookie-universal-nuxt', { parseJSON: false }]
],
```

これで設定は完了

## 取得するデータをキャッシュに保持(set)

今回は取得するデータがあるページへアクセスしたら、キャッシュに記録されるというもの

```js:cookie.vue
export default {
  created() {
    const setCached = 
    {
      title: 'こんにちは！タイトルをキャッシュします',
      content: 'こんにちは！内容をキャッシュします。'
    }
    this.$cookies.set('article01', setCached, {
      path: '/',
      maxAge: 60 * 60 * 24 * 7
    })
  }
}
```

setCachedにページ内のデータをセットする。  
今回は直接入力しているが、apiから取得したデータ等をセットしたり、dataプロパティと紐づけてもよい

this.$cookie.setでクッキーに入るNameをarticle01に指定し、valueをセットする。

cookieを保持するpathと時間を指定する  
これでcookieにセットされます。

## cookieに保持されているデータを取得(get)

今度は違うページで取得できるようにしてみる。

```js:index.vue
export default {
  data () {
    return {
      article01: this.$cookies.get('article01')
    }
  },
  computed: {
    article() {
      let post
      if (this.article01) {
        post = JSON.parse(this.article01)
      }
      return post
    }
  }
}
```

取得したいページのdataプロパティへgetした値をセットする  
this.$cookie.get('CookieにセットしたName')で値が取得できる

先ほどオブジェクトでValueをセットしたので、parseしてデータを扱えるようにする。

```vue:index.vue
<template>
  <div>
    <article v-if="article">
      <h1>{{ article.title }}</h1>
      <p>{{ article.content }}</p>
    </article>
  </div>
</template>
```

あとはデータがないときには表示されないようにv-ifを設定し、
値を表示する

これでデータをCookieへsetしgetするまでができるようになります。

値は配列にしてもいいし、そのままStringでわたしてもいいし、それぞれ使いやすい形式でいれてください

## まとめ

cookie周りの設定が結構簡単にできるので、導入しやすいと思います。

あとはデータの取得周りでエラーがでないように条件分岐等を使っていくといいかなと思います。  

数を指定して例えば3つとかを閲覧したページ順に入れつつ更新とかもできるので、直近の閲覧履歴とかデータベースにいれなくても履歴にのこすこともできる点がいいと思った。
tar コマンドで同名のディレクトリに展開するエイリアス（関数）


# 背景

Windows に慣れていると、圧縮ファイルは同名のフォルダに展開してほしくなります。
Ubuntu にはそのようなコマンドがないようなので、エイリアス（Bashを使っているので関数で定義）を作りました。

# 使い方

`tarx` という名前にしました。

```bash:コピペ用
tarx() { f=$1; d="${f%.tar*}"; mkdir $d; tar xf $f -C $d; }
```

`sample.tar.gz` を `sample` というディレクトリに展開したい場合、以下のようにします。

```bash:使い方
$ tarx sample.tar.gz
```


# 解説

改行を入れました。`f`はファイル名、`d`はディレクトリ名、の意です。

```bash:説明用
tarx() {
    f=$1;
    d="${f%.tar*}";
    mkdir $d;
    tar xf $f -C $d;
}
```

* コマンドの引数は `$1, $2, ...` で取得できる
* 文字列への変数展開でパターンマッチ（`%` は末尾から最短一致させて削除）が使える
    * .tarで始まる拡張子に対応
        * `hoge.tar.gz` → `hoge`
        * `hoge.tar.bz2` → `hoge`
    * 末尾から最短一致なので **.tar**get より先に .tar.gz がマッチする
        * `my.target.tar.gz` → `target`
* `tar xf [圧縮されたファイル名] -C [展開先ディレクトリ名]` で指定のディレクトリに展開

# 注意

圧縮されたファイルと同じ階層にディレクトリが作られます。
git  コマンド

##ローカルリポジトリ##
<strong>git config --global user.name ".."</strong> => 名前の設定

<strong>git config --global -l</strong> => 設定のリスト取得

<strong>git init</strong> => ローカルリポジトリ作成

<strong>git add .</strong> => 全てのファイルをステージする

<strong>git commit -m ".."</strong> => ステージされてた変更をコミットする

<strong>git log</strong> => コミット履歴を確認する

<strong>git diff</strong> => ワークツリーとインデックスの比較して差分を表示

<strong>git clone リモートリポジトリ.git コピー先フォルダ名</strong> => gitリポジトリのコピー

<strong>.gitignore</strong>        => gitで管理しないファイル

<strong>git log --online</strong>  =>リビジョン番号とコミットメッセージのみ

<strong>git log -3</strong> => 直近の3つまで表示(組み合わせ可)

<strong>git log -p -- index.html</strong> =>index.htmlのコミット履歴

<strong>git log --before="2019-04-18 06:05"</strong> => 2019-04-18 06:05よりも前のコミット(after,untill,since)

<strong>git log -Sabc</strong> => abcが削除されたコミットを表示

<strong>git show リビジョン番号:ファイル名</strong> => 指定リビジョン番号指定ファイルの表示

<strong>git checkout --ファイル名</strong> => 元に戻す

<strong>git reset HEAD ファイル名</strong> => インデックスからワークツリーに戻す

<strong>git commit --amend -m ".."</strong> => 直前のコミットメッセージの書き直し

<strong>git reset リビジョン番号</strong> => リビジョン番号のコミットまで戻る
 
<strong>git revert リビジョン番号</strong> => コミットの打ち消し 

##リモートリポジトリ##
<strong>git remote add origin リモートリポジトリURL</strong> => ローカルリポジトリにリモートリポジトリを登録

<strong>git remote -v</strong> => リモートリポジトリの登録状況の確認
 
<strong>git push origin master</strong> => リモートリポジトリへ反映
SSHの初期設定（公開鍵認証設定とパスワードログインの無効化）

- パーミッションの設定とかどうすればいいかいつも忘れるのでまとめてみました
- rootで実行する必要があります。
- python2で書かれています。python3では動きません。OSでデフォルトで入っているのは2ばかりなので問題ないと思います。
- 保証等は一切ありません。
- CentOSじゃないと動きません（たぶん）。

```python:sshsettings.py
# -*- coding: utf8 -*-
import os
import time

username = raw_input("input new user name\n>>")
os.system("useradd %s" % unicode(username))
os.system("passwd %s" % unicode(username))
os.system("chmod 701 /home/%s" % unicode(username))
os.system("mkdir /home/%s/.ssh" % unicode(username))
os.system("chmod 700 /home/%s/.ssh" % (unicode(username),))
os.system("chown %s:%s /home/%s/.ssh" % (unicode(username), unicode(username), unicode(username)))
os.system("vi /home/%s/.ssh/authorized_keys" % (unicode(username),))
os.system("chmod 600 /home/%s/.ssh/authorized_keys" % (unicode(username),))
os.system("chown %s:%s /home/%s/.ssh/authorized_keys" % (unicode(username), unicode(username), unicode(username)))
print "please change setting password authentication -> no"
time.sleep(2)
os.system("vi /etc/ssh/sshd_config")
os.system('usermod -aG wheel ' + username)
print "ssh setting finished."
```
[mastodon]v2.4.0→v2.4.1にアップデートした際のエラー

※とりま備忘録的に書いてます＋　markdown文法　模索中です

###環境
うちのmastdon
vps
docker
mastodon v2.4.0→v2.4.1

##v2.4.0→v2.4.1にアップデートした際に出たエラー

いつも通りに「docker-compose run --rm web rails db:migrate」とやっていたら、エラー吐いたので、対応模索する。

```
~/mstdntest$ docker-compose run --rm web rails db:migrate
Starting mstdntest_db_1    ... done
Starting mstdntest_redis_1 ... done
[FATAL tini (11)] exec rails failed: No such file or directory
```

```
~$ cd mstdntest/
~/mstdntest$ docker-compose run --rm web rails assets:precompile
Starting mstdntest_db_1    ... done
Starting mstdntest_redis_1 ... done
[FATAL tini (8)] exec rails failed: No such file or directory
```

「rails」が見つからん
と仰っているのでパスを付与する

```
~$ cd mstdntest/
~/mstdntest$ docker-compose run --rm web ./bin/rails db:migrate
Starting mstdntest_db_1    ... done
Starting mstdntest_redis_1 ... done
```

```
~/mstdntest$ docker-compose run --rm web ./bin/rails assets:precompile
Starting mstdntest_db_1 ... done
Starting mstdntest_redis_1 ... done
Webpacker is installed ? ?
Using /mastodon/config/webpacker.yml file for setting up webpack paths
Compiling…
Compiled all packs in /mastodon/public/packs
~/mstdntest$
```
※assets:precompileは、５分ぐらいかかった
D-Oceanとその利用方法

#D-Oceanとその利用方法

##１．D-Oceanとは
そもそもD-oceanとは、ユーザー同士がビッグデータを含む様々なデータを共有することができるSNSのことである。会員登録はgoogleやtwitterアカウントを使用することができ、誰でも簡単に利用することができるようになっている。
データの公開範囲も自由に設定することができ、完全に誰でも利用できるものと、申請・承認制となっているものがある。

##２．利用方法
利用方法は比較的簡単である。ファイル形式は主に.csvとなっているのでおおよそのプログラミング言語で対応・処理できる。
また、D-Oceanの特徴としてサイト内でSQL文を使用して無料でデータをソート・絞り込みすることが可能になっている。（SQL文の使い方参考：データベース入門（SQL文）https://cfm-art.sakura.ne.jp/sys/archives/703）
まだ比較的新しいサービスということもありUIには若干の使いづらさを感じるものの、非常に便利で有用なものとなっている。

D-Ocean:https://sdp.docean.io/v1/console?p=index
PlayStoreから理想のGithubのアプリを見つける

## はじめに
インターン先のプログラミングの実務に携わらせてもらっているが、ある問題が･･･
それは次の2つ。
**・通知がメールでしか来ない**
メールが来た時に通知の内容を確認すれば良いという話ではあるが、アプリで確認できればそれに越したことはない。
直接メッセージが打てれば、即時対応する必要があるメッセージにも返信できるし。
というわけで、PlayStoreから理想のGithubアプリを探してみました。


## 理想のGithubアプリ
**メールを介さずにGithubの通知を確認できるアプリ**

### 現状
Githubに通知 -> メールが届く -> メールを確認 -> Githubを開く

### 理想
Githubに通知 -> アプリで通知 -> アプリからアクション

## 探してみた
### FastHub for Github
URL: https://play.google.com/store/apps/details?id=com.fastaccess.github&hl=ja

**あ、これだ**

通知は確認できるし、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/49786157-1385-8235-4926-9204ab6e743e.jpeg" width="300px">

(顔はムカつく)

ファイルにはdiffがしっかりと適用されてる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/7bfa438d-5531-c5f0-c246-d9f51e6c252f.jpeg" width="300px">

(シンタックスハイライトは適用されているのと適用されていないのがある?)

このアプリがあれば理想は実現できそう。

見つかって良かった良かった。

## おわりに
Fasthub for Githubがあれば、大抵の連絡には即時対応できるかな?
課金要素もあるみたいだけど、何処で発生するんだろう?
見つけたら追記します。

とりあえず、Githubのアプリが欲しい人はFasthub for Githubを基準に色んなアプリを試してみるのがオススメです。
batで端末のネットワーク設定変更

端末を別のネットワークに変更する場合、手動で変更するのはめんどくさい。
batファイル内にこちらを記載する。

@echo off
netsh interface ipv4 set address "イーサネット" static 192.168.254.10 255.255.255.0 192.168.254.1

batファイルを右クリックで「管理者として実行」すれば、一発でネットワークが変更される。
※1環境変数に追記すれば、ダブルクリックでも実行可能。
※2 "イーサネット"の部分の表記が端末によってことなる場合があるので、コマンドプロンプトでipconfigたたいて確認する。
例：イーサネット アダプタ イーサネット　→イーサネット
　　イーサネット アダプタ ローカルエリア接続　→ローカルエリア接続
DB中間テーブルについて

中間テーブルについて簡単に説明！

中間テーブルが必要になるのはアソシエーションを考えるときに多対多になったときに便宜上必要なテーブルです。
なのでhas_many:テーブル名，through中間テーブル名
でアソシエーションを組むこと。
また、DBにテーブルを作る。
そして、便宜上作ったものなので、大元の多対多のアソシエーションをhas_manyで組むことも忘れずに行う。
[X.org] 接続されているディスプレイ(モニター)の配置と解像度を一覧表示する

# 前提知識

Xでモニターを特定するために以下の概念があります。

- `display` ... Xサーバーを特定するための数字のようなもの? `/tmp/.X11-unix`の中身を見ればわかる。普通は1つの`screen`で構成される。
- `screen` ... `display`に属する。複数の`monitor`で構成される。各ウィンドウは`screen`の中を自由に移動できる。(２つの`monitor`にまたがってもよい)
- `monitor` ... 実際のディスプレイ等の機器と1対1に対応する。

なお、デフォルトのディスプレイは`DISPLAY`環境変数で指定します。

```bash
# display, screenを指定する例
export DISPLAY=localhost:0.0

# 最小の例
export DISPLAY=:0
```

`xrandr`コマンドを実行することで、`monitor`の情報などを表示できます。今回は`libXrandr`を用いてC言語からこれらの情報を扱ってみます。

# コード

```c
#include <X11/extensions/Xrandr.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <X11/Xlib.h>



int main(void) {
	
	Display *disp = XOpenDisplay(NULL);
	int screen = DefaultScreen(disp);
	Window root = RootWindow(disp, screen);
	XRRScreenResources *res = XRRGetScreenResources(disp, root);
	
	printf("Screen %d (%dx%d):\n", screen, DisplayWidth(disp, screen), DisplayHeight(disp, screen));
	
	info->connection == 0int i, j;
	for (i = 0; i < res->noutput; i++) {
		XRROutputInfo *info = XRRGetOutputInfo(disp, res, res->outputs[i]);
		printf("  %s state:%d\n", info->name, info->connection);
		if (info->crtc) {

			XRRCrtcInfo *cinfo = XRRGetCrtcInfo(disp, res, info->crtc);
			printf("    %d %d %d %d\n", cinfo->width, cinfo->height, cinfo->x, cinfo->y);
		}
	}

    return 0;
}
```

コンパイル

```bash
gcc main.c -lXrandr -lX11
```

出力の例

```
Screen 0 (1920x2160):
  eDP1 state:0
    1920 1080 0 1080
  DP1 state:1
  DP2 state:1
  HDMI1 state:1
  HDMI2 state:1
    1920 1080 0 0
  VIRTUAL1 state:1
```
Laravelのクエリビルダーの戻り値を勘違いしていた件について


:::note alert
この記事は、筆者がLaravelを触り始めた時にメモ用で書いたものです。
実際にコーディングする際は、ご利用のバージョンに合った公式ドキュメントとGitHubのソースコードを見て実装してください。筆者は数年Laravelを書いていません。ご了承ください。
:::

※必ず下記のGitHubのリポジトリのREADME.mdを読んで、適したバージョンのソースコードと公式ドキュメントを読んでください。


https://github.com/laravel/laravel

誰かが書いた古い記事を参考にコーディングをするのは危険です。


# Laravelのクエリビルダーの戻り値（or 返り値）

もし「いいね」がついたら他のメソッドのものも追加してまとめ化する。

|メソッド      |       返り値（型） |    返り値（例）    | コメント|
|:-----------------|------------------:|:------------------:|:------------------:|
| save           |             boolean|true, false   | 成功の結果|
| create           |             object|{id:1,name: テスト}   | 新規作成したレコード|
| insert             |             boolean |        true, false        | 成功の結果 |
| update           |            integer |       0, 1, 10など       | 影響を与えたレコード数 |
| delete             |          integer |       0, 1, 10など        | 影響を与えたレコード数 |
| first             |          object |{id:1,name:テスト}        | レコード1件 / 無ければ 5.1→NULL, 5.3→{} |

時間のある時に取得系も追加していくつもり…

### insert

新規登録が完了したかの正否を論理値で返却する。
つまり、`true/false`の`boolean`で返してくれる。

### update

影響を受けたレコード件数を返す。
つまり、0や1や10などの`integer`で返してくれる。

### delete

影響を受けたレコード件数を返す。
つまり、0や1や10などの`integer`で返してくれる。



## 失敗談

updateやdeleteも`boolean`で返却してくれると思って下記のようなコードを書いてデバックしてました。。。

確かに0が来ていれば更新はしていないんですが…

```php
$res = DB::table('hoge')
    ->where('id', $id)
    ->update([
        'name' => $name
    ]);

// 別クラスで
if (!$res) '更新に失敗';
```
AWS S3上ファイルの中身をLinuxコマンドだけで超絶簡単に確認する方法

AWS s3のファイルの中を見るときにいちいちダウンロード→解凍→中身を確認　とか
コンソールとかで頑張ってファイルを参照とかしていませんか？

あれ、結構めんどくさかったりしませんか？
今回はこのファイルの中をちょろちょろって確認する方法を紹介します。


AWS S3のバケットにaaaというファイルがあったとしましょう。

```
$ aws s3 ls s3://(バケット名)/
2019-04-15 01:42:01         65 aaa
2019-04-15 01:42:08         65 aaa.gz
$
```

このaaaの中身ってみるの超絶簡単に確認する方法の紹介します。
Linuxのコマンドだけでできるんですよ。

はいいきなりですが、コマンドは下記です。 
ポイントはcp の結果を - にすると標準出力になるんです。
それをcat連結するとみれますよ。


```
$ aws s3 cp s3://(バケット名)/aaa - | cat
testhogehoge1
testhogehoge1
吾輩は猫である
testhogehoge1
testhogehoge1
$
```

応用その1.

```
$ aws s3 cp s3://(バケット名)/aaa.gz - | zcat
testhogehoge1
testhogehoge1
吾輩は猫である
testhogehoge1
testhogehoge1
$

```

応用その2.

```
$ aws s3 cp s3://(バケット名)/aaa.gz - | zcat  | grep 猫
吾輩は猫である
$
```


そしてこれ、ローカルにファイルのこりません。（当然か..）
ちょっとろしたログの調査のときとかにすごく便利ですよ!


よい Linux AWS ライフを！！！
Laravelリンク集

# PHP

- [PHP公式マニュアル](https://www.php.net/manual/ja/)

- [PHP The Right Way](http://ja.phptherightway.com/)

# Laravel

- [Laravel5.8 公式マニュアル(日本語)](https://readouble.com/laravel/5.8/ja/)

- [Laravel公式ドキュメント(英語)](https://laravel.com/docs/master)
    - [ヘルパー関数](https://laravel.com/docs/master/helpers)

- [Laravel ソースコードの歩き方](https://kore1server.com/326)

- [ララ帳](https://laravel10.wordpress.com/)

  - [Object-Oriented Boot Camp](https://laracasts.com/series/object-oriented-bootcamp-in-php
)

- [CONSOLE DOT LOG](https://blog.capilano-fw.com/?cat=3)

- 書籍

  - [絶対に挫折させないアプリ開発　はじめてのLaravel](https://booth.pm/ja/items/1048008)

- 動画

  - [Laracasts](https://laracasts.com/)

      - [Object-Oriented Boot Camp](https://laracasts.com/series/object-oriented-bootcamp-in-php
)
Example of using defaultdict to prevent KeyError in # python's nested dictionary (#ruby comparison)

<h1> example </h1>

<ul>
<li> Nesting and using defaultdict in layers </li>
<li> I can not get angry if I write a nonexistent key like <code>d[&quot;x&quot;][&quot;y&quot;][&quot;z&quot;]</code> </li>
<li> Maybe a good girl may not be imitating </li>
</ul>

<pre> <code class="py">&gt;&gt;&gt; from collections import defaultdict 
 &gt;&gt;&gt; d = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: 0))) 
 &gt;&gt;&gt; d[&quot;a&quot;][&quot;b&quot;][&quot;c&quot;] = 1 
 &gt;&gt;&gt; d[&quot;a&quot;][&quot;b&quot;][&quot;c&quot;] 
 1 
 &gt;&gt;&gt; d[&quot;x&quot;][&quot;y&quot;][&quot;z&quot;] 
 0 
</code> </pre>

<h1> If you write in ruby </h1>

<p> It was such a feeling. This is also a good girl. </p>

<pre> <code class="rb">[27] pry(main)&gt; h = Hash.new(Hash.new(Hash.new(0))) 
 =&gt; {} 
 [28] pry(main)&gt; h[&quot;a&quot;][&quot;b&quot;][&quot;c&quot;] = 1 
 =&gt; 1 
 [29] pry(main)&gt; h[&quot;a&quot;][&quot;b&quot;][&quot;c&quot;] 
 =&gt; 1 
 [30] pry(main)&gt; h[&quot;x&quot;][&quot;y&quot;][&quot;z&quot;] 
 =&gt; 0 
</code> </pre>

<h1> ref </h1>

<p> <a href="https://qiita.com/xza/items/72a1b07fcf64d1f4bdb7">How to use Python defaultdict-Qiita</a> </p>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1285








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPressのテーマに登録されている有効なショートコード一覧の取得


調べる機会があったので。
下記のコードを適当なテーマに貼り付けて表示を確認してみてください。

## ショートコード一覧の取得

`$shortcode_tags`のkeyがショートコード名になっています。

```php
<?php
    global $shortcode_tags;
    echo "<pre>";
    foreach ($shortcode_tags as $key => $value) {
        var_dump($key);
    }
    echo "</pre>";
    ?>
```

## 参考
* https://paulund.co.uk/get-list-of-all-available-shortcodes
GitLabの構築

# GitLabの構築
(2019/04時点)

## 環境
- OS: CentOS 6.9
- GitLab: v11.9.6

## 手順
###1. 依存パッケージのインストール
``` shell:sh
# yum install curl policycoreutils
```

###2. GitLabのインストール
``` shell:sh
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# yum -y install gitlab-ce
```

###3. その他:設定チューニング
``` vi:/etc/gitlab/gitlab.rb
external_url 'http://x.x.x.x'
...
unicorn['enable'] = true
...
unicorn['worker_processes'] = 2
```

###4. GitLabの起動
``` shell:sh
# gitlab-ctl reconfigure
```

## 参考
https://about.gitlab.com/install/#centos-6
ffcallを使ってC言語で簡単にクロージャ (C++じゃないよ!)


ffcallというライブラリを使えばC言語でクロージャできるというのを一昨日知ったので試してみました。

日本語の情報は全く無いし英語の情報もちょっとしかないので多分需要が無いんだと思いますがまとめておきます。


利点
ソースへの前処理など不要で、ライブラリをリンクするだけでクロージャを実現できます。

欠点
スクリプト言語でのクロージャの使用のようなお手軽さは全く無いです。
MSVCで試したが動かず。gcc専用かもしれません。

# 使い方
ffcallは様々なパッケージから利用されているらしく、msys2でもパッケージが用意されていましたので、ほとんどの環境でパッケージマネージャからインストールできるかと思います。

以下の用例はSICPに倣って銀行口座を例としています。

```c:main.c
#include <callback.h>
#include <stdio.h>

int deposit(int *account, va_alist alist) {
    va_start_int(alist);
    int amount = va_arg_int(alist);
    *account += amount;

    va_return_int(alist, *account);
}

int withdraw(int *account, va_alist alist) {
    va_start_int(alist);
    int amount = va_arg_int(alist);
    *account -= amount;

    va_return_int(alist, *account);
}


int main() {
    int account1=0, account2 = 0;

    int (*depo1)(int) = alloc_callback((callback_function_t)(&deposit), &account1);
    int (*withdraw1)(int) = alloc_callback((callback_function_t)(&withdraw), &account1);

    int (*depo2)(int) = alloc_callback((callback_function_t)(&deposit), &account2);
    int (*withdraw2)(int) = alloc_callback((callback_function_t)(&withdraw), &account2);

    printf("account1: %d\n", depo1(30)); // account1: 30
    printf("account2: %d\n", depo2(1000)); // account2: 1000
    printf("account1: %d\n", depo1(10)); // account1: 40
    printf("account2: %d\n", depo2(2000)); // account2: 3000
    printf("account1: %d\n", withdraw1(5)); // account1: 35
    printf("account2: %d\n", withdraw2(500)); // account2: 2500

    free_callback(depo1);
    free_callback(depo2);
    free_callback(withdraw1);
    free_callback(withdraw2);
}
```


ffcallではクロージャのスコープに入れる変数を明示的に指定する必要がありますが、指定できるのはひとつだけですので、複数の変数をスコープに入れたい場合は構造体にまとめる必要があります。
今回の例では構造体は使わず、intの預金残高 account 変数をひとつ使います。

クロージャにする関数としてdepositとwithdrawを定義しています。
この2つの関数に対してalloc_callback()を適用してクロージャを作ります。
この例ではそれぞれaccount1、account2を指定して作成しています 。
alloc_callback()で作成したクロージャは使用しなくなったらfree_callback()を呼び出して削除します。このように C 言語らしくリソース管理は手動です。 

クロージャにする関数の定義ですが、第一引数をクロージャのスコープに入れたい変数とします。 クロージャの呼び出し時の引数は可変長引数として処理するため、第2引数はva_alist型の変数とします 。
引数の処理ですが、関数の先頭でva_startで始まるマクロを呼び出します。マクロ名の末尾はクロージャーの戻り値の型を指定します。int型で残高を返したいのでva_start_intとしています。
va_argで始まるマクロで引数を取り出します。マクロ名の末尾は引数の型とします。預り金または引出金としてintを指定します。
最後にva_returnでは戻り値の型と値を指定します。

# 所感
コールバックを多用するGUIアプリケーションなら有用か。
(C++でいい)

# リンク
https://www.gnu.org/software/libffcall/callback.html
#python の ネストされた辞書で KeyError を起こさないように defaultdict を利用する例 ( #ruby 比較 )

# example

- defaultdict を何層にもネストして使ってみる
- `d["x"]["y"]["z"]` のように存在しないキーを書いても怒られない
- もしかしたら良い子は真似しちゃダメかもしれない

```py
>>> from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: 0)))
>>> d["a"]["b"]["c"] = 1
>>> d["a"]["b"]["c"]
1
>>> d["x"]["y"]["z"]
0
```

# ruby で書くなら

こんな感じだったかな。こちらも良い子はマネし‥。

```rb
[27] pry(main)> h = Hash.new(Hash.new(Hash.new(0)))
=> {}
[28] pry(main)> h["a"]["b"]["c"] = 1
=> 1
[29] pry(main)> h["a"]["b"]["c"]
=> 1
[30] pry(main)> h["x"]["y"]["z"]
=> 0
```

# ref

[Python defaultdict の使い方 - Qiita](https://qiita.com/xza/items/72a1b07fcf64d1f4bdb7)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1284








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Actionを１回だけ実行できるようにしたい

## 概要
コールバックを別のオブジェクトに渡して呼び出してもらうようなときに、複数回呼んで欲しくない（１回呼び出したらコールバックそのものが消滅してほしい）場合に利用できるラッパークラスを作りました。

## 参考
https://github.com/mikelovesrobots/unity3d-base/blob/master/app/Assets/Plugins/TriggerAction/Actions/OnceAction.cs

## １回だけ実行可能なコールバッククラス

```csharp
/// <summary>
/// １度だけ実行可能なAction
/// </summary>
public class OnceAction
{
    private Action _Action;

    /// <summary>
    /// 空オブジェクト
    /// </summary>
    public static OnceAction Default = new OnceAction();

    /// <summary>
    /// 実行可能であればtrue
    /// </summary>
    public bool IsEnable => this._Action != null;

    /// <summary>
    /// １度だけ実行可能なAction
    /// </summary>
    private OnceAction()
    {
        this._Action = null;
    }

    /// <summary>
    /// １度だけ実行可能なAction
    /// </summary>
    public OnceAction(Action action)
    {
        this._Action = action;
    }

    /// <summary>
    /// 登録されたコールバックを呼び出す
    /// </summary>
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void Invoke()
    {
        if (this._Action == null)
        {
            return;
        }

        this._Action.Invoke();
        this._Action = null;
    }
}
```

なんてことはない、１回呼び出したらActionへの参照を消してやるだけの簡単なラッパークラスです。
ですがActionの生成側で使用回数を制限できるのが便利です。利用側で呼び出した回数を管理したりActionへの参照を消したりするの面倒ですからね。

`OnceAction.Default`は、OnceAction型の変数なりプロパティなりの初期値として利用します。

Actionの場合は以下のように書けば`nullアクセス違反にはならないが呼び出しても何も起きない`状態にできました。

```csharp
// こんな感じで初期化しておくと呼び出すときにnullチェック不用
private Action _Callback = delegate { };
```

しかし、OnceActionではいちいちインスタンスをnewで作らないといけなくなるので、その代わりとして作りました。

```csharp
// こんな感じで初期化しておくとnullチェック不用
private OnceAction _Callback = OnceAction.Default;
```
「OCI_SUCCESS_WITH_INFO」の対処

oracleを使用していて、「OCI_SUCCESS_WITH_INFO」が突然発生した場合

#パスワード変更期限

```
PASSWORD_LIFE_TIME  同じパスワードを認証に使用できる日数を制限します。PASSWORD_GRACE_TIMEの値とともに設定した場合、猶予期間内にパスワードを変更しないと、そのパスワードは使用できなくなり、それ以降の接続は拒否されます。この句を指定しない場合、180日がデフォルトになります。
```

突然エラーが帰ってくるようになったら、確認してみるといい。

無期限にしたい場合は、設定を変更するといい。

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED ;
```
Vagrantで作った環境をパッケージ化して配布する

せっかく開発環境をVagrantで作ったので、
ほかの人が利用できるように、パッケージ化してみます。

## パッケージ化する

## 名前を付けてパッケージ化する
### vm名を確認する
何も指定しないで作ると、defaultという名前になるみたいです。

```bash
vagrant status
```

### ファイル名を指定してパッケージ化する
先ほど取得したvm名を使って以下の通りパッケージ化します。

```bash
vagrant package --base [vm名] --output [パッケージファイル名.box]
==> default: Exporting VM...
==> default: Compressing package to: C:/Users/xxxxx/xxxxx/[パッケージファイル名.box]
```

デフォルトでは、package.boxという名前になる


## パッケージ化されたファイルをBoxとして追加

```
vagrant box add [BOX名] [パッケージファイル名.box]
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box '[BOX名]' (v0) for provider:
    box: Unpacking necessary files from: file://C:/Users/xxxxx/xxxxxx/[パッケージファイル名.box]
    box: Progress: 100% (Rate: 171M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box '[BOX名]' (v0) for 'virtualbox'!
```

### 追加されているか確認

```bash
vagrant box list
[BOX名]            (virtualbox, 0)
bento/ubuntu-18.04 (virtualbox, 201812.27.0)
```

## 最後に
ここまでできれば、あとは

```bash
vagrant init [BOX名]
vagrant up
```

でいつでも初期設定したOSが使えます。よかったよかった。
昔は、新しい開発者が来るたびに、OSインストールから・・・やっていたのがうそのようですね。
BigQueryで分割テーブルを作る方法

##概要
・パーティションテーブルのうち、「分割テーブル」を作成
・DDLの「CREATE TABLE」ステートメントを使用し、「PARTITION BY」句で分割カラムを指定する方法で作成

##分割テーブルとは

BigQueryでは、大規模テーブルを小さなセグメント（まとまり）に分割して管理できます。
テーブルとしては1つでも、内部的に分割しておくと、クエリで読み込むバイト数を減らし、コストを削減できます。

分割する方法は以下の3つ。
・日付別テーブル
・取り込み時間で分割されたテーブル
・分割テーブル
（違いは[こちらの記事](https://qiita.com/mokrai/items/3eaa57e700ac084d33d8)に詳しい。）

今回は、このうち「分割テーブル」を作成します。
3つのうち最も新しい機能で、
TIMESTAMP型もしくはDATE型のカラム（の内容）でパーティショニングを行います。

（参考→[公式ドキュメント](https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja&_ga=2.48666278.-1472741777.1497402632)）

##今回のゴール
こちらのテーブルを作成することを目標とします。

**日別キャンペーンへの参加状況**

| id       | cp       | date       |
|:------------------:|:------------------:|:------------------:|
| AAAA             | 5%OFF             | 2019-01-01           |
| BBBB             | ポイント5倍        | 2019-01-01|
| CCCC             | 5%OFF             | 2019-01-01|
| AAAA             | ポイント5倍        | 2019-02-28|
| BBBB             | 5%OFF             | 2019-02-28|
| CCCC             | ポイント5倍        | 2019-02-28|

「date」列をもとにパーティションを作成します。
→キャンペーンごとに参加者の一覧を追加更新しても、日付で分割して保持されるはずです。


##作成方法

大きく3つのフェーズで作成します。
① データを入れるハコ（空のテーブル）を作成
② データセットをアップロード
③ ②のデータセットを①のハコに入れる
https://cloud.google.com/bigquery/docs/creating-column-partitions?hl=ja

####① テーブル作成
CREATE TABLE ステートメントを使い、テーブルを作成します。
（参考→[公式ドキュメント](https://cloud.google.com/bigquery/docs/data-definition-language?hl=ja#partition_expression)）


```
CREATE TABLE
  hoghoge-bq.hogehoge-prj.t_cp_list
 (
  id,
  cp,
  date
 )
PARTITION BY cp_start
;
```

![bunkatsu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281938/a94f7708-4043-a27c-de9d-ebf33222463d.jpeg)
できたテーブルにはこのように注釈が付きます。

####② データセットをアップロード
今回は、下記の手順で行います。
1. データセット（CSVファイル）をGoogle Storageに格納
2. BigQueryにアップロード
   （「wk_cp_list」と命名）

2.の際、自動で取り込むと「id」列がSTRING型ではなくBYTES型になってしまい
抵抗を試みたのですが、ダメでした。次のステップで型変換することにします。

![schema.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281938/c45701d0-7a77-c339-ffc5-dd2e67a62de5.jpeg)


####③ ②のデータセットを①のハコに入れる
INSERT文を使って格納します。ついでに「id」列をSTRING型に変換します。

```
INSERT into `hoghoge-bq.hogehoge-prj.t_cp_list` (id, cp, date)
 select
  TO_BASE64(id),
  cp,
  date
FROM `hoghoge-bq.hogehoge-prj.wk_cp_list`
```


これで、分割テーブルに中身が入りました。
更新作業は、②と③を繰り返すのみです。
Microsoft Flow から Microsoft Teams にメンション付き投稿を行う

[ブログからの転載](https://1bed.allright.life/?p=2943)

## 経緯

以前は Microsoft Flow から Microsoft Teams に投稿する際、メンションを付けることができませんでした

2 年前に速攻 Vote してましたが、やっと動き出したようなので試してみました

* [Possibility to @mention members in MS Teams](https://powerusers.microsoft.com/t5/Flow-Ideas/Possibility-to-mention-members-in-MS-Teams/idi-p/39614/page/10#comments)

## MS Flow の登録と単純なメンションまで

MS Flow の組み方は詳しいサイトがいっぱいあるのでザックリ書くと

1. [新規] ボタンをクリック
2. [一から作成] をクリック
3. トリガーは [手動でフローをトリガーします] をクリック  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/1-300x203.png)](https://1bed.allright.life/wp-content/uploads/2019/04/1.png)
4. [+ 新しいステップ] をクリック
5. [メッセージをフローボットとしてチャンネルに投稿する] をクリック  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/2-300x272.png)](https://1bed.allright.life/wp-content/uploads/2019/04/2.png)
6. チームに MS Teams のチームを設定、Channel に投稿するチャネルを設定  
   Message を <at>メンションする相手のメールアドレス</at> と設定します  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/3-300x98.png)](https://1bed.allright.life/wp-content/uploads/2019/04/3.png)
7. 右上の [テスト] をクリックします  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/4.png)](https://1bed.allright.life/wp-content/uploads/2019/04/4.png)
8. [トリガーアクションを実行する] を選択して、[保存 & テスト] をクリックします
9. [続行] をクリックします  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/5-300x157.png)](https://1bed.allright.life/wp-content/uploads/2019/04/5.png)
10. [フローの実行] をクリックします  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/6-300x135.png)](https://1bed.allright.life/wp-content/uploads/2019/04/6.png)
11. メンションされたら成功！  
    [![](https://1bed.allright.life/wp-content/uploads/2019/04/7-300x40.png)](https://1bed.allright.life/wp-content/uploads/2019/04/7.png)

## 考察

既存の Flow が Webhook で構築しているのが多いので、Webhook での対応をおこなって欲しかったんだけど仕方ない...

「メッセージをフローボットとしてチャンネルに投稿する」では、HTML や Markdown 形式で記述することが可能なので、リッチな表示にメンションを入れ込む事が可能となるのは強みかな？
Progate初級編で学んだこと

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているtatsukichi0803です。

□float プロパティ
➤指定した要素を並びにすることができる

　　左並び|float:left;
　　右並び|float:right;

□border プロパティ
➤枠線を付けることができる

　　書き方|線の種類 種類　色

　　border:5px solid red

□input要素とtextarea要素
➤input要素:1行のテキスト入力を受け取る要素
➤textarea要素:複数行のテキスト入力を受け取る要素

　　・送信ボタンを作るには
　　　　<input type="submit">

   　・ボタンに表示させるテキストを変えるには
　　　　<input type="submit" value="テキスト名">

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
Chainerが作った「ディープラーニング入門」が凄すぎる！

機械学習を勉強していくには、いくつかの課題があります。

- 統計や線形代数といった数学の知識
- Pythonを使うのでプログラミングの知識
- 画像処理、音声処理といった知識
- 学習を行う為のコンピューティングリソースの準備

それらを学ぶ上でいろんな書籍やネットの情報が転がっているのですが、Chainerが出した「ディープラーニング入門」が凄すぎて、もうこれでいいんじゃないか感が凄いです。

https://tutorials.chainer.org/ja/tutorial.html

## 2019/05/20追記
チュートリアルが更新され、新たに「演習問題」が追加されました。
https://tutorials.chainer.org/ja/src/Exercise_Step_01_ja.html

どれくらい理解できているのかのチェックができるので、取り組んでみる事をお勧めします。範囲はPythonの入門から、ディープラーニングに必要な数学の知識までありますので、チェックするには十分な内容だと思います。

# 最低限必要な知識がまとめて学べる
このチュートリアルでは、機械学習を行っていく上で必要な最低限の数学とプログラミングを学んでいくことができます。

- Pythonの文法から条件式、クラスや継承といったところまであります。もちろんNumPyやCuPyもしっかりあります。
- 数学については、微分、合成関数、偏微分といった所もしっかり記述されています。これらを順番にこなすことで、機械学習を行ううえで、「なぜ必要なのか」をしっかり学んでいけます。
- 確率変数、確率分布

ここまでしっかりと揃っているうえに、**あちこちサイトを行き来しなくてもよい** という所が非常に素晴らしいです。

# ブラウザで学べる
機械学習の知識がついてきたところで、さぁやってみようと思った時に問題になるのが環境の構築です。数年前に比べたら比較的簡単に環境を構築できるようになってきましたが、フレームワークの進化も非常に早く、ネットの情報がすでに古いといった事も多いです。
このチュートリアルは、ブラウザ上で学ぶことができます。それも、**資料の中に登場するコードがそのままブラウザ上で実行できる** という所です。
資料はすべてノートブック形式になっていますので、解説とコードが同時に実行できるようになっています。なので、**ただ読むだけの資料ではなく、実際にコードを記述してその結果も学ぶことができます。** これは非常にありがたいです。

# Google Colaboratoryとして実行できる！！（超重要）
はい。これです。これがこのチュートリアル最大のポイントです。先ほど資料はノートブック形式になっていると書きましたが、これがGoogle Colaboratoryで実行できるようになっている事です。
資料の上部にある「Open in Colab」ボタンを押すとすぐに開くことができます。
基本的にはJupyter Notebookと同じですが、Google Colaboratoryでは **GPUリソースが利用できます。しかも無料です。** 
なので処理の重い畳み込みニューラルネットワークも比較的短時間で体験することができます。GPUが絡むと途端に環境構築が大変になるので、ぜひ活用していきましょう。

# まとめ
公式にもありますが、 **このサイトだけで機械学習・ディープラーニングに入門できる事を目指して作られています。** は伊達ではなく、基本的な知識はすべて網羅されているので、今から始めたい人はぜひ見てみてください。
初心者Pythonistの日記 Day3

お疲れ様です。
さて3日目です。昨日（4月12日）はかなり重要な経営会議が長時間ありなかなか疲れました。
（土日の間にアップロードを忘れていたので、いまします。）

今日は入力フォームも含めたWebアプリを作ってみたいと思います。
参考文献：https://qiita.com/tom_S/items/2ea407eda4bec3e720ef

こちらの参考文献が非常にわかりやすかったです。
背番号を入力すると、選手の名前がでるものです。server.py
すいません、、、わたしは最近の野球はイチローさんの名前くらいしか知らないので、まったく未知の名前ですが、面白かったです。
参考文献のserver.pyをそのまま動かしてみました。

```
        if int(request.form["num"]) <= 5:
            return """
            {}は{}です！
            <form action="/" method="POST">
            <input name="num"></input>
            </form>""".format(str(request.form["num"]), list[int(request.form["num"])])
```

その中で、初心者的に進んでいくと、ここが面白い感覚に包まれます。特に、

```
            {}は{}です！
```

ここですね。ずっと、cの世界にいたら、これに来るものは、前を見てしまうところですが、.と後なんですね。

次は、
##DB(MySQL)を利用する
をしてみたいと思います。
こちらも、参考文献が非常にわかりやすかったです。ありがとうございます。
参考文献：https://qiita.com/zaburo/items/5091041a5afb2a7dffc8

cursor()は、なかなか奥深く
参考文献：https://qiita.com/knoguchi/items/3d5631505b3f08fa37cc
こちらにかなり詳しく書かれています。

cursor()などについて。ちょっとSQLの復習が必要ですね。。。いくつか疑問点が出てきたので、
次回は、もう少し、SQL x Pythonまわりを深掘ってみたいと思います。
枠線・角丸を設定できるUIVIewクラスの作り方

#1.はじめに
毎回角丸やら、枠線を設定するのは、面倒なので、**IBDesignable**、**IBInspectable**を用いてカスタムクラスを作っておくと便利です。
過去記事で散々書かれている内容ではありますが、今回はその作り方、使い方を備忘録として残します。

##IBDesignable、IBInspectableとは
[今更ながらIBDesignableとIBInspectableについて](https://qiita.com/stastaahaha/items/e45e7559255fb7666fd8)
こちらの記事を読んでいただけるとわかるかと思いますので、詳しくは割愛しますが、ざっくりいうと

###IBDesignable
・Storyboard上にリアルタイムで反映される

###IBInspectable
Storyboard上で属性変更できる

というものです。
ただこれらの修飾子を多用すると、これらを使用しているStoryboardやXibを開いた時に、自動読み込みが入る為、重くなる要因となります。
実際はとても便利ですが、PCのスペックや、UIコンポーネンツの設置数によっては、使わない方がいい時もありますので用法容量を守ってお使いください。

#2.プロトコルを作成する

まず角丸、枠線のプロトコルを定義します。
UIViewだけでなく、UIButtonや他のクラスでも使用できるようにこうしてプロトコルとしておくことであとあと便利になります。

**角丸**

```swift

/// 角丸
public protocol Roundable: class {
    var cornerRadius: CGFloat { get set }
    var masksToBounds: Bool { get set }
}

```

**枠線**

```swift


/// 枠線
public protocol Borderable: class {
    var borderColor: UIColor { get set }
    var borderWidth: CGFloat { get set }
}

```

#3.枠線・角丸を設定可能なUIViewの作成
**UIView**

```swift

/// 枠線・角丸を設定可能なUIView
@IBDesignable
public class IBDesignableView: UIView, Roundable, Borderable {

    @IBInspectable var borderColor: UIColor = UIColor.black {
        didSet { layer.borderColor = borderColor.cgColor }
    }
    @IBInspectable var borderWidth: CGFloat = 0.0 {
        didSet { layer.borderWidth = borderWidth }
    }
    @IBInspectable var cornerRadius: CGFloat = 5.0 {
        didSet { layer.cornerRadius = cornerRadius }
    }
    @IBInspectable var masksToBounds: Bool = true {
        didSet { layer.masksToBounds = masksToBounds }
    }
}
```

#4.使い方
あとは簡単です。
Storyboard、またはXib上でUIViewを設置します。
<img width="807" alt="スクリーンショット 2019-04-15 9.02.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184792/67cfb53b-f428-f571-3960-469352b4d3af.png">

その後右ペインのclassをIBDesignableViewに変更します。
<img width="275" alt="スクリーンショット 2019-04-15 9.02.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184792/b424266c-78cb-bf2f-5e0d-283ac1f5f769.png">

すると自動ビルドが開始され先ほど定義されたコードが読み込まれて、右ペインの属性設定からいじれるようになります。
<img width="285" alt="スクリーンショット 2019-04-15 9.02.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184792/8fbeb8b7-d76d-7749-24a7-94b9b9372b64.png">

#5.最後に
以上、簡単ではありますが、枠線、角丸設定ができるUIVIewの作り方、使い方でした。
お忙しい中ご覧いただきありがとうございました。

ブログも始めました。
[kazyblog](https://kazyblog.com/)
#Twitter で「俺の英語学習」のサービスアイディア。日本語を英語にGoogle翻訳して追撃！

# サービスイメージ(雑)

![image](https://user-images.githubusercontent.com/13635059/56100176-76ffaa80-5f50-11e9-8ec1-7722dc673179.png)
![image](https://user-images.githubusercontent.com/13635059/56100183-8979e400-5f50-11e9-99f5-85d9da489f8c.png)

![image](https://user-images.githubusercontent.com/13635059/56100129-4586df00-5f50-11e9-8787-9bf14d344478.png)


# 英語翻訳されたもの

![image](https://user-images.githubusercontent.com/13635059/56099921-63534480-5f4e-11e9-9be7-fd02847c964f.png)
# 元のツイート

![image](https://user-images.githubusercontent.com/13635059/56099915-5b93a000-5f4e-11e9-92f3-51141ef53e5c.png)

https://twitter.com/YumaInaura/status/1116201768411525120?s=20

# 何が良いの？

# 今までの英語学習は

- 誰かが書いた英語のアウトプット -> 自分への英語のインプット (読書、教材学習など)
- 自分の脳内で生まれる日本語=インプット -> 自分の英語アウトプット (ライティングなど) -> 終わり

こんなパターン。

# でも、この「俺の英語学習」では「自分の日本語アウトプット」 -> 「自分への英語インプット」を実現します。

- 自分でつぶやいた内容がすぐに英語翻訳されるので、とても脳に優しい。
- 「誰かが書いた文章を理解する」よりもずっと学習コストが低い。なおかつ効果が高い。
- 「自分が書いた文章」は自分がよく理解しているから。それを逆に英語翻訳で読むことで「理解の通り道」をすんなりと作りやすい。

まったく新しいと思いませんか？

# つまり‥つまりですね

インプットとアウトプットの経路を逆順にするわけです。これが今までの英語学習になかった「隠れパターン」です。

自分の脳から発信されたものが、フィードバックで自分の脳へと届くのです。

人の脳と友達になるのは難しいけれど、自分の脳とはみんな友達ですよね。そうですよね。

# あたたかさ、親しみやすさ

- 1分以内のホットなうちに追撃されるので「理解のコンテキスト」も剥がれ落ちない。これが1時間遅れでのツイートとかとなると、元の内容を人間の脳は忘れかけているので、あまりよろしくない。
- Twitterでのツイートという日常動作に組み込むことで、行動ハードルを最小化している。(ツイ廃の人であればなおさら良い)

# 自力より他力本願

- Google翻訳の結果がとても優れていて、かなり正しく、フォーマルな文法を覚えられそうという実感がある。自分で1から文法を組むよりもずっと良い感じがした。
- 自分でも実感として、他のどんな英語学習、リーディングよりも学習効率が良く、習慣化も出来るんじゃないかと感じた。


# Twitterでツイートする

![image](https://user-images.githubusercontent.com/13635059/56099892-26874d80-5f4e-11e9-9fe6-b1dbe73182f3.png)

https://twitter.com/YumaInaura/status/1116247081721577473?s=20

# 1分以内に英語バージョンが「追撃」してくる

- 元の日本語のツイートもTwitterで「引用」扱いになっており、読みやすい。
- 冒頭の画像の「画像つきツイート」の場合は「画像」が引用扱いになってしまうので、元の日本語表示は現状実装していないが、これもやり方次第では全然可能。

![image](https://user-images.githubusercontent.com/13635059/56099872-f8097280-5f4d-11e9-9339-0bf9c7bd4e44.png)

# 二個のツイートがリプライチェーンでつながる

とても参照しやすい。

![image](https://user-images.githubusercontent.com/13635059/56099879-09527f00-5f4e-11e9-8aaf-60d38703d44b.png)

# 引用ツイートの例

![image](https://user-images.githubusercontent.com/13635059/56099945-76feab00-5f4e-11e9-8cfc-1c3d64dd4a91.png)
![image](https://user-images.githubusercontent.com/13635059/56099946-782fd800-5f4e-11e9-93ac-5de3d845e213.png)

https://twitter.com/YumaInaura/status/1117538185750306816?s=20

# 実装

- Twitter API で自分のタイムライン情報を得る。
- Google Translate API で翻訳する。
- Twitter API で元のツイートにセルフリプライする。
- cron で1分単位で実行する。別に10秒単位とかでも良いけど。

簡単でしょ。以上。

# 一般公開

- だれか実装してください。そしてアイディア料をください。お願いします。
- お問い合わせはTwitter DMなどで https://twitter.com/YumaInaura/

# Code

ここらへん。

https://github.com/YumaInaura/YumaInaura/tree/bb5266fa602ba17319c8129f13b42f133e2823ca/api/exe/twitter-translate


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1283








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
php-master-changes 2019-04-14

今日は不要な条件コンパイルを削除する修正があった！

# 2019-04-14
## carusogabriel: Remove HAVE_* for always available extensions
- https://github.com/php/php-src/commit/656db96eb931671ecdc789c047f620de2f9fec05
- [7.4~]
- 常時ある拡張について HAVE_* の条件コンパイルを削除
HackerRankのまとめ

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
HackerRankをやっていて知らないpython3の表記が多々あったのでまとめておきます。

#Find a String
forループで回して文字の一致を見ていくと考えるのは大前提。
pythonでは、一つ一つ文字を見ていくのではなく、配列の範囲を指定して一気に見ることができる。

```index.py
array = [1,2,3,4,5]

print(array[0:2]) # => [1,2]

print(array[2:3]) # => [3]

print(array[2:2]) # => []
```

一個目でインデックス、二個目の引数で要素番号を指定する。
これを使えば簡単に文字列比較ができる。



#String Validators
ポイントは「文字列の中で一つでも当てはまるものがあればTrueを表す→any」
まず、文字列を一つずつ見ていかなければならない。
つまりmap関数を使って一つずつ特定のバリデーションを使っていく。
もう一つ大事なのが、any()を使うこと。
any()は引数に指定したイテラブルオブジェクトの要素のいずれかがTrueと判定されるとTrueを返す。すべてFalseであればFalse。

```index.py
print(any([True, False, False]))
# True

print(any([False, False, False]))
# False
```

全体としては

```index.py
print(any(map(str.isalnum, S)))
```
こんな感じ。
map関数の第一引数は関数。第二引数は対象文字列とかリストとか。



#String Formatting
参照：https://qiita.com/Alice1017/items/c6e5d385330ff0a00d82




#終わりに
プログラム初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正しますのでどんどん指摘してください。
GlideでスプレッドシートからPWAを作る際に知っておきたい７つのこと

[簡単過ぎる！GoogleスプレッドシートからPWAアプリを開発できる「Glide」を使ってみた！](https://paiza.hatenablog.com/entry/2019/04/10/%E7%B0%A1%E5%8D%98%E9%81%8E%E3%81%8E%E3%82%8B%EF%BC%81Google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%8B%E3%82%89PWA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%96%8B)

この記事に触発され、[RubyKaigi2019](https://rubykaigi.org/2019)の非公式アプリを[Glide](https://app.heyglide.com/)で作成してみました。
https://rubykaigi2019.glideapp.io/
PCからアクセスすると次のような表示になります。
![screenshot-rubykaigi2019.glideapp.io-2019.04.15-01-31-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112173/4e9d9453-1dec-cc12-d2bd-d6e43e3b38e7.png)

参考までにこのアプリの元となっているスプレッドシートも公開します。
https://docs.google.com/spreadsheets/d/1pXt94FoPNXoB6UBNNbWw1zf6l7MFnN-0c6xnon5S8ms/edit?usp=sharing

また、系統の違うアプリも作ってみようと思い、壱岐(地元)の観光向けアプリも作ってみました。
https://go.glideapps.com/play/4TDdlLbp8bNYw2Vc4aYy
(著作権フリーな画像があまり見つけられず、未完成のやっつけ仕事になっています。)

Glideでいくつかアプリを作成していくうちに、コツを掴めてきたので参考までに書き残します。

## GlideはList表示とDetail表示に特化している
レイアウトは複数種類ありますが、見た目が変わるだけでList表示を行なっているだけです。
シート(DBでいうテーブル)を一覧するList表示と、その1行(DBでいう1レコード)に注目したDetail表示のみに特化しています。

そのため、スプレッドシートはシンプルな構造に愚直にデータを詰め込んだものが求められます。

## Navigationとシートは1対1対応
レイアウトを変えるだけでコンテンツ自体がほぼ同じものはシート1つに複数Navigationできるのではないか？と考えましたが、Glideの機能として1つのシートを複数Navigationから参照することはできません。

コンテンツがほぼ同じものだったとしてもレイアウトが変われば必要な情報は変わります。レイアウト毎の表示用ロジックも必要になります。そのため1対1対応のほうがシンプルでわかりやすさを維持しやすいです。

## 非正規形を恐れない
前述しましたが、Glideに適しているのはシンプルな構造に愚直にデータを詰め込んだスプレッドシートです。
エンジニアとして全く正規化されていないDB(のようなもの)を見ると落ち着かないかもしれませんが、こらえましょう。

## マスターデータのシートとアプリ表示用シートは分ける
Glideの表現力に制限されるため、自分が思うような表示をしようとするとスプレッドシートはどんどんカオスになります。
正規化はほぼ不可能ですが、最低限繰り返しを防ぐためにもマスターデータと表示用シートを分けましょう。
マスターデータを分けずに表示用に最適化すると、日付・時間・場所を1項目にまとめるなどしてデータとして壊れてしまいます。デザインを変更するときにはデータ復元の手間が増えてしまいます。

例: Listレイアウトでは各行で3項目しか表示できません。サムネイル、タイトル、時間、場所を表示したかったため、ここでは時間と場所を結合したセルを作成して時間と場所まで一覧で確認できるようにしました。
![スクリーンショット 2019-04-15 0.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112173/15c84777-202a-3343-1199-6296310ff5b5.png)

## 表示用シートでデータの見た目を調整する
- 日付と場所を1項目にまとめて表示したい
- 「タイトル by 作者」のような表示をしたい

こういったロジックやその結果となるセルはマスターデータシートには含まず、それを参照する表示用シートで実現しましょう。
これによりマスターデータは壊れることなく綺麗なままです。そして表示用シートは何度でもスクラップアンドビルドできます。

## View用ロジックはspreadsheet関数を駆使する
本来のデータに変更を加えず、見た目だけ変えるDecoratorのような層を表示用シートに儲けましょう。
とりあえず文字列連結の&関数は覚えておきましょう.

例: 「タイトル by 作者」の実現
```= タイトル & " by " & 作者``` 
実際には
```= A2 & " by " & B2```
のようにセル指定をするでしょう。

## 考えすぎずトライ&エラーを繰り返す
いくらかアドバイスを述べましたが、やりながら身につけるのが最も確実です。どこまでをマスターデータとするか、表示用シートで必要なデータはどの列かなど細かく丁寧に考えても実際に動かしてみるまで答えは出ません。とりあえず動かしてGlideに慣れながら調整しましょう。

私のおすすめは、全てのデータを細かい項目に分けたマスターデータシートと、マスターデータシートをすべて参照ペーストした表示用シートをNavigation分用意することです。

次の画像は実際のスプレッドシートのものです。
![スクリーンショット 2019-04-15 2.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112173/0287a8c6-36f3-b489-de7b-a1e7d8b6a700.png)
_masterシートにマスターデータを記述し、4/18シートではL列から左は_masterへの参照、L列から右では日時や場所を組み合わせた表示用データの整形をしています。

## まとめ
- マスターデータ用シート*1, 表示用シート*Navigationの数 で構成する
- 非正規形を恐れず、トライ&エラーを繰り返しながらGlideの特徴を理解する
No route matches [DELETE] "/users/sign_out" エラー(Rails)

###はじめに
初学者の学習アウトプット用記事です。
ご指摘訂正アドバイスは是非お願いします。


で、今回のテーマは!!!!!!

**エラー!!!!**です。

内容としては、deviseでログイン機能を実装してログインはできるのにログアウトするとエラーが起きてしまうということでした。


##No route matches [DELETE] "/users/sign_out"

エラー文が

No route matches [DELETE] "/users/sign_out"

なんとなくなんですが、

「DELETEのルーティングされてねぇぞ!!ごらぁああ!!!!」

と言われてる気がしました。


ターミナルにてrake routesコマンド実行してみると、

```
destroy_user_session 　GET    /users/sign_out(.:format)            devise/sessions#destroy　

#メソッドがGETになってる？？？
```


ビューファイルのログアウトボタンのリンクのパスは問題なく記述できてました。
sign_outログアウトのメソッドってDELETEじゃないの？？？？？？？

ってことでルーティング確認!!

```routes.rb

Rails.application.routes.draw do
  devise_for :users
  root 'groups#index'

  resources :users, only: [:index,:edit, :update]
  resources :groups, only: [:new, :create, :edit, :update] do
    resources :messages, only: [:index, :create]
   end
end
```

あれ？？？問題なくね？？？？

どこがおかしいんだ？・・・・・

ってことでメンターさんに質問。

メンターさんも？？？？？？あれ？？？？なんだろう？？？とrake routesで確認。
するとやはりGETになってる。

試しにroutes.rbファイルのdevise_for :usersの記述を削除

```routes.rb
Rails.application.routes.draw do
  
  root 'groups#index'

  resources :users, only: [:index,:edit, :update]
  resources :groups, only: [:new, :create, :edit, :update] do
    resources :messages, only: [:index, :create]
  end
end
```

そしてターミナルでrake routesコマンド!!!!

すると!!!!!

```
destroy_user_session DELETE /users/sign_out(.:format)            devise/sessions#destroy
```

GETがDELETEに変わってる!!!!

そのまま再度、devise_for :usersを記述。

```routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'groups#index'

  resources :users, only: [:index,:edit, :update]
  resources :groups, only: [:new, :create, :edit, :update] do
    resources :messages, only: [:index, :create]
   end
end
```

そんで再度ターミナルでrake routesで確認したらDELETEになっていました。

無事、その後rails sでサーバー再起動させたら問題なくログアウトできました。


とりあえず解決はできたのですが、
今回の件はバグ？みたいなものと説明されましたが真相は謎です。



###他にも
記事を調べたら

**[Rails 4.x] Devise で Sign Out が Routing Error になる際の対応。（method の delete が get になる場合）**
https://qiita.com/colorrabbit/items/5545fce7e5cd4e494396


の記事がでてきました。
上記の記事の内容を試したのですがこちらは特に変化がなくエラーのままでした。
Why did #python open up dictionary access to match objects? (`TypeError: '_sre.SRE_Match' object is not subscriptable`)

<h1> 3.4.8 </h1>

<pre> <code class="py">Python 3.4.8 (default, Apr 9 2018, 11:43:18) 
 [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux 
 Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. 
 &gt;&gt;&gt; import re 
 &gt;&gt;&gt; re.search(r&#39;b&#39;, &#39;abc&#39;).group(0) 
 &#39;b&#39; 
 &gt;&gt;&gt; re.search(r&#39;b&#39;, &#39;abc&#39;)[0] 
 Traceback (most recent call last): 
 File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt; 
 TypeError: &#39;_sre.SRE_Match&#39; object is not subscriptable 
</code> </pre>

<h1> 3.7.2 </h1>

<pre> <code class="py">Python 3.7.2 (default, Jan 13 2019, 12:50:01) 
 [Clang 10.0.0 (clang-1000.11.45.5)] on darwin 
 Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information. 
 &gt;&gt;&gt; import re 
 &gt;&gt;&gt; re.search(r&#39;b&#39;, &#39;abc&#39;).group(0) 
 &#39;b&#39; 
 &gt;&gt;&gt; re.search(r&#39;b&#39;, &#39;abc&#39;)[0] 
 &#39;b&#39; 
</code> </pre>

<h1> ref </h1>

<p> <a href="https://docs.python.org/3/library/re.html">re — Regular expression operations — Python 3.7.3 documentation</a> </p>

<p> Easy access to group! It seems like. Thanks python </p>

<p><img src="https://user-images.githubusercontent.com/13635059/56090302-94def800-5edb-11e9-8602-8419364f73e1.png" alt="image"></p>

<h1> By the way ruby example </h1>

<pre> <code class="rb">[5] pry(main)&gt; &#39;abc&#39;.match(/b/)[0] 
 =&gt; &quot;b&quot; 
</code> </pre>

<p> It may be easier to understand the dictionary </p>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1281








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPressの記事本文がスルスルと伸びていく！の怪現象をとりあえず止めたい！

##怪現象！

昨日サービスの公式サイトをWpで作成した時に起こった怪現象。
↓記事本文のテキストエリアがスルスルと下に伸びていく。。そして書いていた行が上に押しやられて編集行が見えなくなる・・・マジですか。

とりあえず時間がないので止めたい！深夜の作業だったので、寝てから再度ブラウザ立ち上げ、、、ても同じ現象が。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76660/2c5245f2-c43a-3166-8689-72720f092f92.png)

##こうやって直した！

お祓いをした！・・・わけではなく、
「表示オプション」-「追加設定」の”最大行表示エディターと集中執筆モード機能を有効化します。”のチェックを外した。
お前だったのか。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76660/cf73a316-87dd-e3b7-0025-a64575fc137b.png)

とりあえずはClassic Editorプラグインやら、Stiripeプラグインやら使っているだけですが、起こってしまったものは仕方がないのでとりあえず暫定処置！

現場からは以上です。
【Scala】n%127やn%129よりもn%128のほうが速い。もっと言うとn&127のほうが速い。

結論は、タイトルの通りです。

ついでに、`n % 128`の代わりに`n & 127`と書くと速くなるのか（正数の場合のみ等価ですが）も検証した結果、
今回の検証環境では若干速くなった。

本記事では、これをどう検証したのかを書きます。

# 検証方法
↓以下手順でsbt-jmhを導入する
[JMHを使ってScalaのパフォーマンスを計測する \- Qiita](https://qiita.com/taketora/items/0cee66b5d5552285f5de)

## ベンチマークのコードを書く
```scala
import java.security.SecureRandom
import org.openjdk.jmh.annotations.{Benchmark, Scope, Setup, State}

@State(Scope.Thread)//スレッド毎にフィールドの状態を持つようにする
class Mod {
  private val r = new SecureRandom
  private var number = 0

  //ベンチマークの実行前に実行してくれるらしい
  @Setup def getNumber() = number = r.nextInt(Integer.MAX_VALUE)

  @Benchmark def mod128 = number % 128

  @Benchmark def mod129 = number % 129

  @Benchmark def mod127 = number % 127

  @Benchmark def bitMask127 = number & 127
}
```

sbt shellで以下コマンドを打つ

```
jmh:clean
jmh:compile
jmh:run com.github.momosetkn.mod.Mod
```
`jmh:run`だけだとjarに入ってた`org.openjdk.jmh.benchmarks.BlackholeBench`とかもベンチマークしようとして１０時間以上もかかることがあるのでクラス名を指定しました。

# ベンチマークの結果
環境

```
OS: Ubuntu 18.04LTS
CPU: i7-4770K
JMH version: 1.21
VM version: JDK 11.0.2, OpenJDK 64-Bit Server VM, 11.0.2+9
```

```
[info] Benchmark        Mode  Cnt          Score          Error  Units
[info] Mod.bitMask127  thrpt   25  404978709.111 ± 11379559.349  ops/s
[info] Mod.mod127      thrpt   25  215737442.945 ± 10010415.077  ops/s
[info] Mod.mod128      thrpt   25  369377857.751 ± 14498431.564  ops/s
[info] Mod.mod129      thrpt   25  294198802.757 ± 15613693.254  ops/s
```
Scoreがスループットの値となります。
今回の結果はn&127でビットマスクしたほうがn%128の剰余演算より9%速くなっている。
`n % 127`はビットマスクの半分ぐらいのスループットしか出ていない。
こんなに違いが出るとは思いもしなかった。
Error(誤差)も大きくなってますね。詳しいことは、[他の記事](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97)に任せますが、計算に必要な時間が分子の数によって変わってくるのでしょう。

# Bytecodeを見てみた
IntelliJ IDEAなどのJetBrainsのIDEを使っている人は、
メニューバーの`Build`=>`Build Project`してから、`View`=>`Show Bytecode`でバイトコードが見れます。

```java
  // access flags 0x1
  public mod128()I
  @Lorg/openjdk/jmh/annotations/Benchmark;()
   L0
    LINENUMBER 16 L0
    ALOAD 0
    INVOKESPECIAL com/github/momosetkn/mod/Mod.number ()I
    SIPUSH 128
    IREM
    IRETURN
   L1
    LOCALVARIABLE this Lcom/github/momosetkn/mod/Mod; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x1
  public bitMask127()I
  @Lorg/openjdk/jmh/annotations/Benchmark;()
   L0
    LINENUMBER 22 L0
    ALOAD 0
    INVOKESPECIAL com/github/momosetkn/mod/Mod.number ()I
    BIPUSH 127
    IAND
    IRETURN
   L1
    LOCALVARIABLE this Lcom/github/momosetkn/mod/Mod; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 1
```
bitMask127メソッドのほうは`IAND`というビットごとの論理積の命令だが、
mod128メソッドのほうは`IREM`という余りを求める命令。
もし、JavaやScalaの言語仕様に符号なし整数(unsigned int)という型があったのであれば、この辺は最適化してくれていたかもしれません。

↓参考
[Java仮想マシン \- Wikipedia](https://ja.wikipedia.org/wiki/Java%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3)

**⚠負数の場合は等価にならない**

```
-1 % 128 //-1
-1 & 127 //127
```

# オマケ
C++コンパイラでunsigned intの場合には`n % 128`と書いても`n & 127`と書いても同じコンパイル結果になるか（最適化がされるか）の調査結果

↓調査に使ったもの
[Compiler Explorer](https://godbolt.org/z/AkGI2V)

|C++コンパイラ |最適化されるか|
|:--|:--|:--|
|x86-64 gcc 8.3 | O|
|x86-64 clang 8.0 | O|
|x86-64 icc 19.0.1 |O|
|x64 msvc v19.20 | X|
|x64 msvc v19.20(最適化オプション-O1) | O|